问题:
我有一个应用程序位于主机上(让我们称之为host1
),它将TLS加密的TCP数据包发送到另一个主机的端口5015 (让我们称之为host2
)。由于网络限制,host1
必须通过80或443输入和离开所有入站和出站通信量。我无法访问host2
。
方法:
我的想法是,我可以在host1
上创建一个iptable规则,它将路由/重定向/转发443中的5015通信量,并且必须让它到达host2:5015
。我遇到的问题是制定正确的规则。到目前为止,我的情况如下:
TCP_TRAFFIC_PORT=5015
PROXY_PORT=443
_apply_outbound_rules() {
# Forward outgoing packets through the proxy port
sudo iptables -t nat \
-I OUTPUT 1 \
-p tcp --destination-port $TCP_TRAFFIC_PORT \
-j DNAT --to-destination :$PROXY_PORT
# Send packets to host2:5015 port (this is likely the rule to fix)
sudo iptables -t nat \
-I POSTROUTING 1 \
-p tcp --destination-port $PROXY_PORT \
-j SNAT --to-source :$TCP_TRAFFIC_PORT
}
apply_outbound_rules
有人知道怎么做吗?这似乎是一件常见的事情,但我遇到了麻烦。
发布于 2018-04-16 11:07:25
首先,linux中的NAT是有状态的。这意味着您不需要出站和入站规则。当流量返回是NATed出站时,linux将自动取消返回流量。
虽然您将遇到的主要问题是TCP会话是由以下的组合来定义的:
源IP已被限制为单个值(host1的IP)。目标IP已经是单个值(host2的IP)。源端口只有两个可能的值(80 & 443)。目标端口仅限于单个值(5015)。这意味着您只能建立最多2个同时连接(如果您跨两个端口负载平衡SNAT )。即使是顺序连接,您也可能会遇到端口重用问题,比如端口处于TIME_WAIT状态。
尽管如此,如果您真的想尝试这一点,则应该这样做的规则是:
iptables -t nat -I POSTROUTING \
-d $HOST2_IP -p tcp --dport $TCP_TRAFFIC_PORT \
-j SNAT --to-source :$PROXY_PORT
发布于 2018-04-16 20:54:40
您知道应用程序在哪个端口上运行吗?如果没有,则需要将所有源端口映射到80或443。
下面试着替换host2ip。
iptables -t nat -A POSTROUTING -p tcp -d host2ip -j SNAT -m multiport --sports 1:65535 --to-source :443
https://unix.stackexchange.com/questions/438154
复制