iptables 端口转发失败

iptables 端口转发失败

我希望从 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 地址

相关内容