发布这篇文章几乎让我感到很尴尬,但这是我无法用语言(正确地)表达我想做的事情并用谷歌搜索的少数几次之一。
我有一个托管的 Ubuntu 服务器,它有两个公网 IP。主机将提供一些服务,然后我设置了 LXC 容器,它们有自己的私有 /24 并伪装起来。
问题是所有流量都通过主公共 IP 传输,我需要所有来自 LXC 容器的流量都来自辅助公共 IP,同时保持主机流量不变。
布局如下:
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(当前):
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 不像对其他防火墙那样熟悉。
答案1
假设辅助 IP 确实是 1.1.1.3 而不是 1.1.1.2(您的示例令人困惑,否则下面只需用另一个替换 IP),此规则应该有效:
iptables -t nat -I POSTROUTING -s 10.0.3.0/24 -o eth0 -j SNAT --to-source 1.1.1.3
大多数工具不会关心或了解别名接口名称的使用:您必须提供eth0
,而不是eth0:1
提供给 iptables。您的第二次尝试无法按原样工作:lxcbr0 将是输入接口,但 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,而根本不需要创建此别名:(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,如果您拥有整个 LAN 的公共 IP 而不是 2 个,则非常方便)