我知道有两种方法可以做你想做的事。
- 网络桥接
- IPTables Nat
我们将从 IPTables NAT 开始,因为您的 ifconfig 输出已经设置了 IP 别名。
典型主机服务器
我的“ifconfig”输出显示“eth0”作为主接口,设置了 2 个 IP 别名,以及 LXC 生成的桥接接口。
# ifconfig
eth0 Link encap:Ethernet HWaddr 08:00:27:d9:66:ac
inet addr:172.16.10.71 Bcast:172.16.10.255 Mask:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:7 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:0 (0.0 B) TX bytes:578 (578.0 B)
eth0:1 Link encap:Ethernet HWaddr 08:00:27:d9:66:ac
inet addr:172.16.10.72 Bcast:172.16.10.255 Mask:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
eth0:2 Link encap:Ethernet HWaddr 08:00:27:d9:66:ac
inet addr:172.16.10.73 Bcast:172.16.10.255 Mask:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
lxcbr0 Link encap:Ethernet HWaddr de:45:c9:13:2b:74
inet addr:10.0.3.1 Bcast:10.0.3.255 Mask:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:6 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:0 (0.0 B) TX bytes:508 (508.0 B)
以下命令显示了我们的 2 个 LXC 容器及其 IP 地址。
# lxc-ls -f<br>
NAME STATE IPV4 IPV6 AUTOSTART<br>
-------------------------------------------<br>
test1 RUNNING 10.0.3.247 - NO<br>
test2 RUNNING 10.0.3.124 - NO
执行“ifconfig”将显示为 LXC 容器创建的 2 个新接口。看
下面是我的。
# ifconfig
veth05DUGY Link encap:Ethernet HWaddr fe:4c:2c:df:1d:c3
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:39 errors:0 dropped:0 overruns:0 frame:0
TX packets:40 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:3706 (3.7 KB) TX bytes:3822 (3.8 KB)
vethTUTFID Link encap:Ethernet HWaddr fe:58:4b:19:25:3e
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:42 errors:0 dropped:0 overruns:0 frame:0
TX packets:57 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:3956 (3.9 KB) TX bytes:5580 (5.5 KB)
下面显示它们是桥的一部分。
# brctl show lxcbr0
bridge name bridge id STP enabled interfaces
lxcbr0 8000.fe4c2cdf1dc3 no veth05DUGY
vethTUTFID
所以现在是实际工作。我们将使用 IPTables 进行转发。以下是我们添加之前的默认设置
# iptables -nL -t nat
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 -A PREROUTING -d 172.16.10.72 -j DNAT --to-destination 10.0.3.247
# iptables -t nat -A PREROUTING -d 172.16.10.73 -j DNAT --to-destination 10.0.3.124
上面的 2 个命令添加了 IPTables 规则,以将所有 IP 流量从 eth0:* IP 转发到 LXC 容器上的相应 IP。
验证时您应该会看到以下内容。
# iptables -nL -t nat
Chain PREROUTING (policy ACCEPT)
target prot opt source destination
DNAT all -- 0.0.0.0/0 172.16.10.72 to:10.0.3.247
DNAT all -- 0.0.0.0/0 172.16.10.73 to:10.0.3.124
因此,此时您已将这些 IP 转发到容器。为了使这种持久化,您可以创建一个 /etc/iptables.rules 文件并从您的 /etc/network/interfaces 文件中为“iptables-restore”添加一个“post-up”以在启动时恢复这些规则。例如'post-up iptables-restore
以下是网络桥接的示例。您需要删除您的 IP 别名才能进行以下操作。请参阅下面的示例输出,了解您应该从什么开始。
主机服务器
$ ifconfig
eth0 Link encap:Ethernet HWaddr 08:00:27:d9:66:ac
inet addr:172.16.10.71 Bcast:172.16.10.255 Mask:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:7 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:0 (0.0 B) TX bytes:578 (578.0 B)
lxcbr0 Link encap:Ethernet HWaddr de:45:c9:13:2b:74
inet addr:10.0.3.1 Bcast:10.0.3.255 Mask:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:6 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:0 (0.0 B) TX bytes:508 (508.0 B)
在这种情况下,我们不会使用 lxcbr0 接口。
为 LXC 容器创建一个桥接接口。
下面的命令将创建一个“br0”接口用于我们的网桥。您需要将 eth0 接口添加到网桥。再往下看那个命令。
** 警告** 遵循以下命令将立即停止与服务器的远程连接,并使服务器无法再通过互联网访问。这些说明假定本地连接。
# brctl addbr br0
# ip link set br0 up
# brctl addif br0 eth0
# brctl show br0<br>
bridge name bridge id STP enabled interfaces<br>
br0 8000.080027d966ac no eth0
所以上面的命令将 'eth0' 添加到 br0 网桥并显示它在那里。接下来我们需要将 IP 地址从 eth0 移动到 br0。
# ip addr del 172.16.10.71/24 dev eth0
# ip addr add 172.16.10.71/24 dev br0
你现在应该有类似的下面。
# ifconfig
br0 Link encap:Ethernet HWaddr 08:00:27:d9:66:ac
inet addr:172.16.10.71 Bcast:172.16.10.255 Mask:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:77 errors:0 dropped:0 overruns:0 frame:0
TX packets:8 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:6281 (6.2 KB) TX bytes:648 (648.0 B)
eth0 Link encap:Ethernet HWaddr 08:00:27:d9:66:ac
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:87 errors:0 dropped:0 overruns:0 frame:0
TX packets:16 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:8183 (8.1 KB) TX bytes:1296 (1.2 KB)
接下来,我们需要为 2 个容器编辑 LXC 配置文件。
如果你的系统是默认的,你应该有以下。
ls -l /var/lib/lxc
total 12
drwxr-xr-x 3 root root 4096 Aug 10 11:23 test1
drwxr-xr-x 3 root root 4096 Aug 10 11:34 test2
上面的输出应该显示你的两个 LXC 容器。每个目录下都有一个名为“config”的文件,我们需要对其进行编辑。
# vi /var/lib/lxc/test1/config
将显示“lxc.network.link = lxcbr0”的行替换为“lxc.network.link = br0”。对两个容器都这样做。
接下来,您需要编辑两个容器的 /etc/network/interfaces 文件,并将两者的真实 IP 地址添加为 eth0。
所以在我的例子中。
我会将 172.16.10.72 IP 放在 test1 配置文件中,例如“/var/lib/lxc/test1/rootfs/etc/network/interfaces”。这是在尚未进入容器的情况下从主机更新文件。您当然可以启动容器并编辑 /etc/network/interfaces。无论哪种方式都有效。
如果您需要任何说明或其他帮助,只需添加评论以寻求帮助。
-弗兰克