
我正在尝试将所有出站 DNS 请求(从 LAN 发出)重定向到在 localhost 上运行的隧道,侦听 127.0.0.1:5353 上的 UDP。
iptables -t nat -A OUTPUT -p udp --dport 53 -j DNAT --to 127.0.0.1:5353
测试它
nc -u -l -p 5353
和
nc -u 127.0.0.1 53
很好,并且 UDP 会话正在工作,但是当我尝试使用以下命令时:
nc -u 8.8.8.8 53
nc
监听可以接收流量,但回复失败,并显示:
发送 2、接收 2:连接被拒绝
尽管
iptables -t nat -A OUTPUT -p udp --dport 53 -j DNAT --to 192.168.1.108:5353
工作正常,并且在同一 WiFi 网络上运行的设备可以成功接收回复。
编辑:使用 TCP 进行的 DNS 查询是单独管理的,无需考虑。
答案1
要重定向基于 DNS UDP 的请求,如果您的 DNS 守护程序/代理正在侦听端口 5353/UDP,您必须执行以下操作:
iptables -t nat -A PREROUTING -s 192.168.1.0/24 -p udp -m udp --dport 53 -j DNAT --to-destination 127.0.0.1:5353
源必须是内部网络块/网络,因为我们不需要循环(即我们仍然可能需要向外部发出 DNS 请求)。
如果为多宿主计算机中的内部网络进行路由,您也可以应用该接口,而不需要源网络。
iptables -i eth0 -t nat -A PREROUTING -p udp -m udp --dport 53 -j DNAT --to-destination 127.0.0.1:5353
您也可以在端口 53 中执行此操作,只要将目的地列入黑名单即可,如下所示:
iptables -t nat -A PREROUTING ! -d 127.0.0.1/32 -p udp -m udp --dport 53 -j DNAT --to-destination 127.0.0.1:53
OUTPUT 队列可能在本地测试中工作,但是对于远程计算机和当前配置,建议使用 PREROUTING 队列。