RouterOS DNS劫持与透明代理配置避坑指南
本文基于真实网络部署经验,详解RouterOS环境下DNS劫持与透明代理的配置要点,覆盖NAT规则、防火墙策略、DNS缓存等核心环节的常见错误与排查方法,助你少走弯路。
在家用或小型企业网络中,经常有需求让所有客户端的DNS请求都走指定的上游服务器,或者将特定域名的流量引导至透明代理。RouterOS自带的NAT与DNS功能完全可以胜任,但不少人在实际配置时踩了坑,本文整理一些经验供参考。
## 基础DNS劫持规则
先确保RouterOS自身的DNS服务已开启并配置了上游服务器。在IP → DNS中,Servers填入你信赖的DNS(如223.5.5.5或119.29.29.29),勾选Allow Remote Requests。这一步必须做,否则劫持后的请求没人处理。
接下来在IP → Firewall → NAT中添加一条dstnat规则:
- Chain: dstnat
- Protocol: 6 (tcp)
- Dst. Port: 53
- In. Interface: 你的内网桥(如bridge)
- Action: dst-nat
- To Addresses: 路由器LAN口IP(或127.0.0.1)
- To Ports: 53
再用同样参数加一条UDP的规则,Protocol选17(udp)。
## 常见错误一:忘记放行路由器自身请求
上面两条规则一加,你会发现路由器自己也解析不了域名了。因为路由器自身的DNS请求经过OUTPUT链时被劫持给了自己,形成死循环。解决办法是在dstnat规则中排除源自路由器的流量:在Advanced标签中把Src. Address设为路由器的LAN口IP并在前面加感叹号表示排除,或额外加一条Action=accept的规则置于dstnat规则之前,条件是Src. Address=路由器IP且Dst. Port=53。
另一个更优雅的写法是在dstnat劫持规则中加上条件:Src. Address Type不为Local,这样路由器自身发出的DNS包就不会被劫持。
## 常见错误二:端口冲突
如果路由器上已经跑了其他DNS服务(如Pi-hole、AdGuard Home等),Dst. Port 53会被占用。此时RouterOS自身DNS只能换端口或关闭,劫持目标也需相应调整。另外有些应用不走标准53端口,比如DOH走443、DOT走853,这些需要用TLS Host匹配规则或直接封禁端口来强制回退到标准DNS。
## 常见错误三:透明代理回环
如果你在RouterOS上配置了透明代理(如将80/443流量dst-nat到某个代理端口),务必小心回环问题。当代理服务器本身发起对外请求时,流量再次被劫持回代理,导致无限循环。解决方案:在透明代理的dstnat规则中排除代理服务器自身的源IP,或单独对代理出口流量打标记并在mangle中做策略路由。
## DNS缓存顺序问题
RouterOS的DNS缓存有个容易忽略的点:静态DNS记录优先级高于上游查询结果。如果你在IP → DNS → Static中添加了某域名的解析记录,即使上游DNS返回不同结果,客户端拿到的也永远是静态记录。这在测试时容易造成误判,以为是上游解析异常,其实是被静态记录覆盖了。建议排查DNS问题时优先检查Static列表。
同时要留意DNS Cache的TTL过期策略。RouterOS默认会严格遵循上游返回的TTL,如果你频繁修改解析记录,可以适当调低Max UDP Packet Size或手动Flush Cache来加速生效。
## 防火墙建议
DNS劫持生效后,建议在Filter Rules中添加一条规则:只允许向路由器DNS端口的请求通过,其他目的地址53端口的流量直接Drop。这样即使内网有客户端配置了静态DNS(如8.8.8.8),其UDP 53包也会被墙掉,只能走路由器DNS。注意这条规则要放在允许已建立连接和关联流量的规则之后,避免误伤正常通信。
## 验证与排查
配置完成后可用nslookup或dig测试:指定一个公共DNS服务器地址查询,看返回结果是否来自你配置的上游。如果客户端使用DOH,浏览器可能绕过你的劫持,此时可在路由器上对443端口的已知DOH服务器IP做地址列表封禁。
排查DNS问题时两个常用命令:`/ip dns cache print` 查看当前缓存内容,`/log print where topics~"dns"` 查看DNS相关日志。日志中如果出现Dns query refused或timeout,说明上游不可达或请求被防火墙阻拦。
以上就是在RouterOS上配置DNS劫持和透明代理的一些实战心得,希望对你有帮助。