我有一个带有lxc容器(A)的主机(B)。A's本地ip地址为10.0.3.1,公共ip地址为1.2.3.4,B's本地ip地址为10.0.3.21。
我需要将1.2.3.4:7999转发到10.0.3.1:7999,并为此创建了以下规则:
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)时,我正在成功地连接。但是当我试图从B (连接超时)连接到A (连接超时)时,我掉了下来。
我应该创建哪些规则才能从10.0.3.1连接到1.2.3.4:7999?
发布于 2013-02-04 22:15:27
这里有一个NAT发夹情况,您当前的iptables规则不支持这种情况。当容器发送请求时,数据包如下所示:
10.0.3.21:12345 -> 1.2.3.4:7999然后网关将数据包发送到此,并将其发送回容器:
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发布于 2013-02-04 03:20:13
我认为你正在经历的问题是,答案是回到一个不同的界面。
S: 1.2.3.4
D: 1.2.3.4S: 1.2.3.4
D: 10.0.3.21此时,主机A决定使用专用网络接口路由到10.0.3.21。
S: (IP of default GW interface on B)
D: 1.2.3.4来自B的应答包将遍历默认网关,很可能返回到其公共接口上的A,此时由于连接跟踪表中没有匹配的条目,数据包将被丢弃。
添加以下规则,以确保答复通过与请求相同的路径。
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.1https://serverfault.com/questions/475065
复制相似问题