问题:
我有一个 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
有人有创建这样的规则的经验吗?这似乎是一个常见问题,但我似乎无法弄清楚。
答案1
这是我的评论到回复的翻译。
应调整规则以依赖源端口的出站 MASQUERADE 来处理返回数据包。因此,传出数据包应使用您拥有的规则进行 DNAT 处理,并使用以下规则进行 MASQUERADE 处理:
iptables -t nat -A POSTROUTING -p tcp --destination-port $PROXY_PORT -j MASQUERADE --to-ports $TCP_PORT
使用该规则反而您的 SNAT 规则。
与已进行 MASQUERADE 处理的数据包相关的传入数据包将得到适当的返回映射的目标端口。
(根据评论更正)