配置DNAT/Redirect结合Masquerade失效问题求助
我之前碰到过几乎一模一样的Tor+iptables端口转换失效问题,结合你的环境和症状,咱们一步步来排查解决:
Masquerade本质是动态SNAT,它的生效顺序和匹配范围直接影响反向端口转换。你先跑这条命令看看当前nat表的规则:
sudo iptables -t nat -L -n -v
重点看POSTROUTING链:
- 你的Masquerade规则是不是排在DNAT/REDIRECT规则的后面?iptables是从上到下匹配的,如果Masquerade在前面,可能没覆盖到返回流量。
- 规则是不是针对了内部网段(192.168.2.0/24)?比如正确的规则应该是:
sudo iptables -t nat -A POSTROUTING -s 192.168.2.0/24 -j MASQUERADE
如果你的规则只针对了eno1接口,那virbr1的返回流量就没被处理。
首先确认Tor的TransPort配置没问题,打开/etc/tor/torrc看有没有:
TransPort 9040
然后验证Tor确实在监听9040:
sudo netstat -tulpn | grep tor
如果看到0.0.0.0:9040的监听,说明Tor这边没问题。
再检查你的REDIRECT规则是不是正确覆盖了80/443端口:
sudo iptables -t nat -L PREROUTING -n -v
应该能看到针对virbr1接口、目标端口80/443跳转到9040的规则。
iptables靠conntrack自动处理DNAT的反向端口转换,如果这个模块出问题,反向转换就会失效:
- 先检查模块是否加载:
lsmod | grep nf_conntrack
如果没输出,手动加载:
sudo modprobe nf_conntrack
- 然后确保允许ESTABLISHED/RELATED状态的流量:
sudo iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT sudo iptables -A OUTPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
这一步很关键,因为返回的响应流量属于ESTABLISHED状态,如果被iptables拦截,也会表现为端口转换失效。
既然测试机正常,那直接对比两台机器的配置是最快的:
- 导出两台机器的iptables规则:
sudo iptables-save > /tmp/iptables-rules.txt
然后对比文件内容,看生产机是不是少了某些规则,或者规则顺序不同。
- 对比
/etc/tor/torrc的配置,比如有没有AutomapHostsOnResolve这类影响流量处理的参数。 - 检查内核转发是否开启:
sysctl net.ipv4.ip_forward
如果输出是net.ipv4.ip_forward = 0,立刻开启:
sudo sysctl -w net.ipv4.ip_forward=1
然后把net.ipv4.ip_forward=1写入/etc/sysctl.conf,避免重启后失效。
如果上面的排查都没找到问题,你可以手动加一条SNAT规则强制转换端口,验证是不是Masquerade的问题:
sudo iptables -t nat -A POSTROUTING -p tcp --sport 9040 -d 192.168.2.0/24 -j SNAT --to-source :80
如果这条规则生效,说明原来的Masquerade没有自动处理端口转换,你需要调整规则顺序或者修复conntrack的配置。
内容的提问来源于stack exchange,提问作者DoomedRaven

