如何在网关上正确地把 DNS 请求路由到 TUN?

173 天前
 CrazyRundong

最近把 OpenWRT 网关上的分流工具从 Clash 切换到了 sing-box ,顺带开始了解基于 TUN 的透明代理配置。目前遇到的一个问题是,局域网内的 DNS 请求并没有被正确地路由/转发进 sing-box 的 DNS 模块。

具体的情况有点复杂。因为需要让家里运行着 PT 的 NAS 这类的设备不被透明代理,所以在配置 TUN 时并没有使用 auto route,而是自己编写了 nftables 规则和对应的 ip rule/ip route 策略路由,将需要代理的设备的流量标上一个特定的 fwmark ,再将标记的流量策略路由到 sing-box 的 TUN 网卡 tun0 。简化后的设置类似这样:

# 在 nftables 的 prerouting 阶段标记需要被代理的流量:
type filter hook prerouting priority mangle - 1; policy accept;
# 1. 需要直连的设备 MAC 被提前存在 direct_macs set 中,不做额外处理直接放行
ether saddr @direct_macs counter return
# 2. 剩余的来自 LAN 的流量均需要代理,标记为 $tun_mark (0x02)
iifname $lan_devices counter meta mark set $tun_mark

之后配置策略路由:

# 将被标记了 tun_mark 的流量查 tun_table 表路由至 tun_dev
ip route replace default dev ${tun_dev} table ${tun_table}
ip rule add fwmark ${tun_mark} table ${tun_table}

至此整个系统可以正常工作了。但奇怪的是,只有指定了 DNS 服务器为非网关地址 (≠ 192.168.50.1) 的局域网内 DNS 请求才会被转发进 TUN ,而默认的、DNS 服务器地址为 192.168.50.1 的 DNS 请求并没有被 sing-box 看到,而是仍由监听在网关 53 端口的 dnsmasq 处理:

# 在局域网内的任一台被透明代理的设备上:
nslookup google.com         # 这条查询会被 dnsmasq 接收
nslookup google.com 1.1.1.1 # 这条查询才会被正确地路由进 sing-box 的 TUN 设备

请问大家是不是我配置的策略路由在哪里出问题?多谢

3233 次点击
所在节点    宽带症候群
22 条回复
journalist
97 天前
感谢!我现在已经跑通了。
ip route replace default via 192.168.1.2 dev br-lan table ${tun_table}

有一个问题就是 type nat hook prerouting priority dstnat - 1; policy accept; 这里会报错 Could not process rule: Not supported 。我就把 dns dnat 去掉了,用 openwrt uci 自带的端口转发功能。
garryforreg420
20 天前
用 sing-box 的 direct 开一个端口来当 dns 服务器不就行了,干嘛搞这么复杂.
op 的 dnsmasq 关了或者换个端口,sing-box 配置 inbound direct 53,主路由或者 op 的 dhcp 上把下发 dns 服务器指向 sing-box 开放的地址即可。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/999172

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX