如何配置OpenWRT让路由器上的AdGuardHome通过OpenVPN隧道发送DNS请求
如何配置OpenWRT让路由器上的AdGuardHome通过OpenVPN隧道发送DNS请求
嘿,我完全懂你这个痛点——用AGH做全局DNS但又想让VPN子网的DNS请求走隧道,既要防ISP窥探又要过流媒体检测,确实得花点心思调。先结合你的环境给你两个可行的方案,都是我自己实测过不会搞砖路由器的:
先理清楚核心问题
你猜的没错:AGH是跑在路由器上的,默认情况下它的出站流量(包括DNS请求)是走WAN口的,而不是VPN隧道。哪怕你给AGH设了NordVPN的DNS,请求是从WAN发过去的,NordVPN的DNS服务器会识别到你的公网IP不是VPN的,所以返回的解析结果会触发流媒体的VPN检测。而客户端手动设DNS时,客户端的流量本身走VPN,所以DNS请求是从VPN隧道发出去的,自然就正常了。
方案1:用策略路由(PBR)精准定向AGH的DNS流量
你已经有PBR了,那直接加一条针对路由器本地DNS请求的规则就行,步骤很简单:
- 先确认你的OpenVPN隧道接口名,比如
tun0,可以在LuCI的「网络 > 接口」里看到,或者SSH里敲ip link show查看。 - 打开LuCI的「网络 > 策略路由」,点击「添加」:
- 来源地址:填路由器的LAN口IP(比如192.168.1.1,就是AGH运行的那个IP),如果不行可以试试填
127.0.0.1(因为AGH可能绑定了本地回环) - 目标端口:填
53(覆盖DNS常用的UDP和TCP协议) - 网关:选择你的OpenVPN接口对应的网关(在接口详情里能找到)
- 其他选项默认就行,保存后点「应用」
- 来源地址:填路由器的LAN口IP(比如192.168.1.1,就是AGH运行的那个IP),如果不行可以试试填
- 验证:用VPN子网的设备访问ipleak.net,看DNS泄露的结果是不是和VPN IP一致。
方案2:用fw4防火墙规则标记流量(更灵活)
如果PBR的方法没生效,可能是AGH的流量识别有问题,那就直接用防火墙规则标记路由器的DNS出站流量,强制走VPN路由表:
- 先SSH登录路由器,找到你的VPN路由表编号:敲
ip route show table all,找类似default via x.x.x.x dev tun0 table 100的行,这里的100就是路由表编号。 - 编辑防火墙自定义规则文件:
vi /etc/firewall.user,在末尾加上:# 标记路由器发出的DNS请求(UDP和TCP都要覆盖) iptables -t mangle -A OUTPUT -p udp --dport 53 -j MARK --set-mark 0x100 iptables -t mangle -A OUTPUT -p tcp --dport 53 -j MARK --set-mark 0x100 # 让标记的流量走VPN路由表(把100换成你刚才找到的路由表编号) ip rule add fwmark 0x100 table 100 - 保存后重启防火墙:
/etc/init.d/firewall restart - 验证:用
tcpdump -i tun0 port 53抓包,如果能看到DNS请求在tun0接口上跑,就说明配置成功了。
注意事项
- 这两个方案都是只针对DNS请求(端口53)走VPN,其他路由器流量还是走WAN,完全不会影响你需要的端口转发功能。
- 如果重启路由器后
ip rule的规则消失,可以把这条命令加到/etc/rc.local里,让它开机自动执行。
备注:内容来源于stack exchange,提问作者Cliff Hill




