You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何配置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接口对应的网关(在接口详情里能找到)
    • 其他选项默认就行,保存后点「应用」
  • 验证:用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

火山引擎 最新活动