我在 Linux 上运行dnscrypt-proxy
或tor
列出[::]: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 查询。