我租了一台专用服务器,想使用LXC而不是KVM。我想为每个容器购买 IP。现在我有两个外部IP:
- 193.XX30/32
- 213.XX31/32
我更喜欢路由解决方案而不是 NAT。
我最后的尝试是这样的:
-------------------
| INTERNET |
-------------------
|
V
----------------------------------------------
| ------------------- ------- [HOST] |
| | br0: 193.X.X.30 | <--- | em1 | |
| ------------------- ------- |
| | |
| V |
| ------------------- |
| | vethXXXX | |
| ------------------- |
| | |
| V |
| -------------------------------------- |
| | -------------------- [CONTAINER] | |
| | | eth0: 213.X.X.31 | | |
| | -------------------- | |
| | | |
| -------------------------------------- |
----------------------------------------------
我的主机上的网络配置:
auto br0
iface br0 inet static
bridge_ports em1
bridge_fd 0
address 193.X.X.30
netmask 255.255.255.0
gateway 193.X.X.1
dns-nameservers 8.8.8.8 8.8.4.4
我的容器配置:
lxc.network.type = veth
lxc.network.link = br0
lxc.network.ipv4 = 213.X.X.31/24
lxc.network.ipv4.gateway = 213.X.X.1
我的容器网络配置:
auto eth0
iface eth0 inet static
address 213.X.X.31
netmask 255.255.255.0
gateway 213.X.X.1
dns-nameservers 8.8.8.8
dns-nameservers 8.8.4.4
我没有成功直接连接容器。容器成功托管 Web/邮件/DNS 等服务的正确配置/拓扑应该是什么。
答案1
我不知道这是正确的方法或最佳解决方案,但它无需 NAT 即可工作。网络拓扑相同。我们为每个容器配备一个物理 NIC (em1) 和多个 IP。也许以后我可以买一个子网。但现在我会购买 4 - 5 个 IP。
-------------------
| INTERNET |
-------------------
|
V
----------------------------------------------
| ------------------- ------- [HOST] |
| | br0: 193.X.X.30 | <--- | em1 | |
| ------------------- ------- |
| | |
| V |
| ------------------- |
| | vethMyContainer | |
| ------------------- |
| | |
| V |
| -------------------------------------- |
| | -------------------- [CONTAINER] | |
| | | eth0: 213.X.X.31 | | |
| | -------------------- | |
| | | |
| -------------------------------------- |
----------------------------------------------
这是我在主机上的网络配置(/etc/network/interfaces):
auto lo
iface lo inet loopback
auto br0
iface br0 inet static
bridge_ports em1
bridge_fd 0
address 193.X.X.30
netmask 255.255.255.0
gateway 193.X.X.1
dns-nameservers 8.8.8.8 8.8.4.4
容器的配置文件(/var/lib/lxc/my-container/config):
lxc.include = /usr/share/lxc/config/ubuntu.common.conf
lxc.rootfs = /var/lib/lxc/my-container/rootfs
lxc.utsname = my-container
lxc.arch = amd64
lxc.network.type = veth
lxc.network.veth.pair = vethMyContainer
lxc.network.link = br0
lxc.network.ipv4 = 213.X.X.31/32
lxc.network.ipv4.gateway = 193.X.X.1
lxc.network.script.up = /var/lib/lxc/my-container/script-up.sh
lxc.network.flags = up
lxc.network.hwaddr = 00:16:3e:aa:bb:cc
lxc.cgroup.memory.limit_in_bytes = 2048M
我们必须命名我们的 veth 设备。因为我们将在脚本文件中使用该名称。包无法自动从 br0 路由到 veth 设备。所以我添加了一条路由规则,但我的 ARP 表无法自动更新。所以我添加了静态ARP记录。
脚本文件(/var/lib/lxc/my-container/script-up.sh):
#!/bin/bash
route del 213.X.X.31 br0
route add 213.X.X.31 br0
我的容器上的网络配置:
auto lo
iface lo inet loopback
auto eth0
iface eth0 inet manual
所以我可以直接 ping 到我的容器而不使用 NAT。如果我找到一种不使用 arp 和路由命令的方法,我会更新答案。