问题:
我有一个 TCP 服务器和客户端,每个都侦听端口 9000。我将服务器和客户端部署在两个不同的主机上,其中流量只能通过它们之间的端口 80。我希望在它们之间发送数据包时保持源端口(9000)(请参阅下面的 SNAT 规则),以便 PREROUTING 规则可以识别带有--source-port
.
方法:
我正在尝试设置 iptables 规则,以便服务器将其流量从端口 9000 路由到端口 80,并为客户端设置一个免费规则,其中端口 80 上的传入流量在本地路由到 9000。
我想出了这个脚本来应用规则。我已经尝试了一些变体,数据包似乎被服务器主机接受,但不被 PREROUTING(入站)规则接受。
#!/bin/bash
apply_inbound_rules() {
# Allow incoming server traffic from port 80 to the TCP client
sudo iptables -t nat \
-I PREROUTING \
-p tcp --destination-port $PROXY_PORT \
-j REDIRECT --to-port $TCP_PORT
}
apply_outbound_rules() {
# Setup outgoing packets created by the TCP server
# to route through local port 80
# and received on port 80 on the client host
sudo iptables -t nat \
-I OUTPUT \
-p tcp --destination-port $TCP_PORT \
-j DNAT --to-destination :$PROXY_PORT
# To maintain the TCP_PORT
sudo iptables -t nat \
-I POSTROUTING \
-p tcp --destination-port $PROXY_PORT \
-j SNAT --to-source :$TCP_PORT
}
apply_inbound_rules
apply_outbound_rules
有没有人有创建这样的规则的经验?似乎这将是一个常见问题,但我似乎无法弄清楚。
这是我的评论翻译成回复。
应该调整规则以依赖源端口的出站 MASQUERADE 来处理返回数据包。因此,传出数据包应该使用您拥有的规则进行 DNAT 编辑,并使用规则进行 MASQUERADE 编辑:
使用该规则而不是您的 SNAT 规则。
与那些被 MASQUERADE-ed 相关的传入数据包将得到他们的目标端口适当的返回映射。
(根据评论更正)