iptables:透明 TCP 流量代理

iptables:透明 TCP 流量代理

问题:

我有一个 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 处理的数据包相关的传入数据包将得到适当的返回映射的目标端口。

(根据评论更正)

相关内容