将 UDP 重定向到本地端口,回复数据包未经过 SNAT,带有 iptables

将 UDP 重定向到本地端口,回复数据包未经过 SNAT,带有 iptables

我在 Linux 上运行dnscrypt-proxytor列出[::]:1053服务器 DNS。我想让我的所有 Linux 主机的 DNS 查询透明地使用该代理。

这是我从互联网上找到的透明代理 UDP 流量的方法:

iptables -t nat -I OUTPUT -p udp --dport 53 -j REDIRECT--to-ports 1053

或者

iptables -t nat -I OUTPUT -p udp --dport 53 -j DNAT --to 127.0.0.1:1053

-j REDIRECT等于-j DNAT --to 127.0.0.1:

没用。我的浏览器无法打开 URL,并nslookup显示dig

;; reply from unexpected source: 192.168.3.60#1053, expected 192.168.3.1#53

192.168.3.1在我的/etc/resolv.conf

我在wireshark上看到来自 DNS 代理的回复数据包未经过 SNAT,但应该经过 SNAT

这是conntrack -E

[NEW] udp      17 30 src=127.0.0.1 dst=127.0.0.1 sport=35954 dport=35954 [UNREPLIED] src=127.0.0.1 dst=127.0.0.1 sport=35954 dport=35954
[NEW] udp      17 30 src=::1 dst=::1 sport=59799 dport=59799 [UNREPLIED] src=::1 dst=::1 sport=59799 dport=59799
[NEW] udp      17 30 src=192.168.3.60 dst=192.168.3.1 sport=34825 dport=53 [UNREPLIED] src=127.0.0.1 dst=192.168.3.60 sport=1053 dport=34825
[NEW] udp      17 30 src=192.168.3.60 dst=192.168.3.60 sport=1053 dport=34825 [UNREPLIED] src=192.168.3.60 dst=192.168.3.60 sport=34825 dport=1053

但接下来奇怪的是,如果我让代理监听127.0.0.1而不是监听[::],它就可以工作。 我在wireshark上看到回复数据包正确SNATed。并且dig可以nslookup得到透明DNS代理的回复。

这是conntract -E代理侦听的时间127.0.0.1

   [NEW] udp      17 30 src=127.0.0.1 dst=127.0.0.1 sport=58584 dport=58584 [UNREPLIED] src=127.0.0.1 dst=127.0.0.1 sport=58584 dport=58584
   [NEW] udp      17 30 src=::1 dst=::1 sport=39482 dport=39482 [UNREPLIED] src=::1 dst=::1 sport=39482 dport=39482
   [NEW] udp      17 30 src=192.168.3.60 dst=192.168.3.1 sport=38165 dport=53 [UNREPLIED] src=127.0.0.1 dst=192.168.3.60 sport=1053 dport=38165
[UPDATE] udp      17 30 src=192.168.3.60 dst=192.168.3.1 sport=38165 dport=53 src=127.0.0.1 dst=192.168.3.60 sport=1053 dport=38165

而TCP不会遇到这样的问题(dnscrypt-proxy也服务于TCP)。 TCP 回复数据包始终正确进行 SNAT。

那么发生了什么?我对 UDP NAT 做错了什么吗?我希望 DNS 代理监听0.0.0.0[::]透明地代理我的 Linux 主机的 DNS 查询。

相关内容