我有一个主机( 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