iptables SNAT&masquerade为LXC容器分离公共IP

几乎不好意思发布这个,但这是我不能说的话(正确),我试图做的,Google的几次之一。

我有一个托pipeUbuntu服务器与两个公共IP。 主机将有一些可用的服务,然后我有LXC容器安装与他们自己的私人/ 24和伪装出来。

问题是,一切都通过主要的公共IP渠道,我需要从LXC容器来的所有stream量来自辅助公共IP,而只留下主机stream量。

这是布局:

eth0 1.1.1.2/24 gateway of 1.1.1.1 eth0:1 1.1.1.3/24 lxcbr0 10.0.3.1/24 

iptables(current):

 Chain PREROUTING (policy ACCEPT) target prot opt source destination Chain INPUT (policy ACCEPT) target prot opt source destination Chain OUTPUT (policy ACCEPT) target prot opt source destination Chain POSTROUTING (policy ACCEPT) target prot opt source destination MASQUERADE all -- 10.0.3.0/24 !10.0.3.0/24 

我试过了:

 iptables -t nat -I POSTROUTING 1 -s 10.0.3.0/24 -o eth0:1 -j SNAT --to-source 1.1.1.2 

 iptables -t nat -I POSTROUTING 1 -s 10.0.3.0/24 -o lxcbr0 -j SNAT --to-source 1.1.1.2 

无济于事。 我确信我做错了,因为我不像其他防火墙那样精通iptables。

假设辅IP是真正的1.1.1.3而不是1.1.1.2(你的例子很混乱,下面的其他IP只是replaceIP),这个规则应该是正常的:

 iptables -t nat -I POSTROUTING -s 10.0.3.0/24 -o eth0 -j SNAT --to-source 1.1.1.3 

大多数工具不会关心或不知道使用别名接口名称:您必须向iptables提供eth0 ,而不是eth0:1 。 您的第二次尝试不能按原样工作:lxcbr0将是input接口,但POSTROUTING只处理输出接口(您可以使用标记来实现,但更复杂)。

为了保持它与现有的规则类似,这也将起作用:

 iptables -t nat -I POSTROUTING -s 10.0.3.0/24 ! -d 10.0.3.0/24 -j SNAT --to-source 1.1.1.3 

其实你可以添加你的第二个IP,而不需要创build这个别名: ip addr add 1.1.1.3/24 dev eth0 (而不是ifconfig eth0:1 1.1.1.3 netmask 255.255.255.0 ,没有可能不需要的广播)。 但是只有ip addr show dev eth0会显示它,因为ifconfig eth0很可能不会显示第二个IP。 (要彻底,如果你使用代理ARP和路由,你甚至不能添加这个IP,如果你有一个完整的局域网的公网IP而不是2)