我希望从 192.168.1.230:9090 转发到 192.168.1.231:8080,我执行以下命令:
iptables -t nat -A PREROUTING -d 192.168.1.230 -p tcp --dport 9090 -j DNAT --to 192.168.1.231:8080
iptables -t nat -A POSTROUTING -d 192.168.1.231 -p tcp --dport 8080 -j SNAT --to 192.168.1.230:9090
很奇怪,有时它可以通过打开 url 来工作http://192.168.1.230:9090/在浏览器中,但大多数时候都会失败。
我是否遗漏了什么?
答案1
第一条规则似乎正确。问题似乎出在第二条规则上。当数据包从 192.168.1.231:8080 返回时,您需要检查该端口是否为 8080(而不是 dport)。您可能需要使用 iptables -t nat -nvL PREROUTING 和 iptables -t nat -nvL POSTROUTING 并检查数据包计数器,以了解每条规则的内容。
答案2
iptables -t nat -A PREROUTING -d 192.168.1.230 -p tcp --dport 9090 -j DNAT --到 192.168.1.231:8080 iptables -t nat -A POSTROUTING -d 192.168.1.231 -p tcp --dport 8080 -j SNAT --到 192.168.1.230:9090
我认为您误解了 POSTROUTING 链的用途。它不是“返回”路径。后路由只是在您的节点上做出路由决策后执行的。PREROUTING 规则旨在更改目标 IP 地址,而 POSTROUTING 规则旨在更改源。这与数据包是否返回无关。因此,在您的示例中,POSTROUTING 命令应该是:
iptables -t nat -A POSTROUTING -d 192.168.1.230 -p tcp -j MASQUERADE
代替 -j MASQUERADE,如果你知道你的代理节点的 IP,你可以使用:
iptables -t nat -A POSTROUTING -d 192.168.1.230 -p tcp -j SNAT --to-source xx.xxx.xx.xx
其中 xx.xxx.xx.xx 是代理的 IP 地址