iptables 不能重定向本机 DNS 请求到指定端口?

2018-03-09 02:07:43 +08:00
 acess
OpenWRT Chaos Calmer
Linux 3.18.27 mips
运行 ss-tunnel,监听 0.0.0.0:5301,转发至 8.8.8.8:53
先尝试添加这个 iptables 规则:
iptables -t nat -A OUTPUT \! -o lo -p udp --dport 53 -j REDIRECT --to-port 5301
结果居然不能用,nslookup 提示超时。
这个时候,tcpdump -i lo 保存 pcap 文件,用 wireshark 打开,发现 DNS 请求包的目的 IP 和端口已经被改为 127.0.0.1:5301,但是 DNS 响应包的源 IP 和端口却还是[本机 WAN 口 IP]:5301(应该被修改为[程序使用的 DNS 服务器 IP]:53 才对吧?),紧跟着的下一个包就是拒绝掉这个 UDP 响应包的 ICMP port unreachable。

然后删掉这个 iptables 规则,换用这一条:
iptables -t nat -A OUTPUT \! -o lo -p udp --dport 53 -j DNAT --to-destination [本机 WAN 口 IP]:5301
这下正常了。tcpdump 抓包,可以看到 DNS 请求包和响应包的目的 IP 端口 /源 IP 端口都被正确修改了。
但是 WAN 口 IP 不固定啊……况且我的另一台 Debian VPS 上也在用这种 REDIRECT,没发现有这种怪毛病啊。

iptables -t raw -L 似乎是空的。
7605 次点击
所在节点    Linux
26 条回复
acess
2018-03-10 12:57:27 +08:00
@azh7138m 打错……退而求其次,REDIRECT+ss-tunnel
acess
2018-03-10 13:01:17 +08:00
@BOYPT 我其实没看懂你前一个回复的意思……不是本机发出的包走 OUTPUT、转发的包走 REROUTING,“井水不犯河水”么?
acess
2018-03-10 13:02:08 +08:00
@BOYPT 又打错…… REROUTING=>PREROUTING
BOYPT
2018-03-10 17:01:10 +08:00
@acess 并不是,你看我发的图;
PREROUTING 在路由选路前,不管是本地发出还是从外面转发的,进行路由选路前都匹配 PREROUTING (从名字也可以看出这个意思),所以 DNAT 过程都需要在这个链里完成,修改后的地址经过路由选路,才能往想要的地方去。
pheyx
2018-03-10 22:05:19 +08:00
@BOYPT man iptables:
....
nat:
This table is consulted when a packet that creates a new connection is encountered. It consists of four built-ins:

PREROUTING (for altering packets as soon as they come in),
INPUT (for altering packets destined for local sockets),
OUTPUT (for altering **locally-generated** packets before routing),
and POSTROUTING (for altering packets as they are about to go out).
acess
2018-03-12 21:34:03 +08:00
@parametrix #13
MASQUERADE 是 zone_wan_postrouting 里的,一个数据包需要走这个路径才能被 MASQUERADE:
POSTROUTING->delegate_postrouting->zone_wan_postrouting
但是,在 delegate_postrouting 那里有约束条件-o [WAN 口 iface] -j zone_wan_postrouting。
因为 DNS 响应包是从 lo 发出的,所以压根就不会走到 zone_wan_postrouting 和后面的 MASQUERADE 吧。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/436361

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX