iptables端口转发A – > B – > A

我有一个主机( A )与lxc容器( B )。 A本地IP地址是10.0.3.1和公共IP,比如说1.2.3.4。 B的本地IP地址是10.0.3.21。

我需要1.2.3.4:7999被转发到10.0.3.1:7999,我创build了以下规则:

 iptables -t nat -I PREROUTING -p tcp -d 1.2.3.4 --dport 7999 -j DNAT --to 10.0.3.21:7999 iptables -A FORWARD -p tcp -d 10.0.3.21 --dport 7999 -j ACCEPT 

当我从外界连接到A (1.2.3.4:7999)时,我连接成功。 但是当我尝试从A连接到B (连接超时)时,我正在下降。

我应该创build哪些规则以便能够从10.0.3.1连接到1.2.3.4:7999?

你有一个NAT发夹的情况,这是你当前的iptables规则不支持。 当容器发出请求时,数据包看起来像这样:

 10.0.3.21:12345 -> 1.2.3.4:7999 

网关然后DNAT数据包到这个,并将其发送回容器:

 10.0.3.21:12345 -> 10.0.3.21:7999 

容器接收数据包并发送如下所示的响应:

 10.0.3.21:7999 -> 10.0.3.21:12345 

即它直接指向容器本身。 但是端口12345不知道与10.0.3.21:7999的连接,因为连接是1.2.3.4:7999,所以响应被忽略。

解决办法是在网关上SNAT数据包,以便响应返回到网关,然后解除这两个NAT。 尝试添加这样的东西:

 iptables -t NAT -A POSTROUTING -o lxcbr0 -d 10.0.3.21 -s 10.0.3.21 -j SNAT --to 10.0.3.1 

我认为你遇到的问题是答案在不同的界面上回来。

初始请求

 S: 1.2.3.4 D: 1.2.3.4 

DNAT

 S: 1.2.3.4 D: 10.0.3.21 

此时,主机A决定使用专用networking接口路由到10.0.3.21

回复

 S: (IP of default GW interface on B) D: 1.2.3.4 

来自B的回复数据包将遍历默认网关,并且很可能在公共接口上返回到A ,此时数据包将被丢弃,因为连接跟踪表中没有匹配的条目。


添加以下规则以确保回复遍历与请求相同的path。

 iptables -t nat -I POSTROUTING -s 1.2.3.4 -d 10.0.3.21 -o (interface of 10.0.3.1) -j SNAT --to 10.0.3.1