使用静态IP设置桥接LXC容器

我试图在主机上设置多个LXC容器,每个容器都有自己的公共静态IP。

我的主机正在运行最新的Ubuntu。 它有一个名为eth0的单一networking接口。 静态IP可以从网上ping通,命名为eth0:210,eth0:211 …冒号后面的数字是地址的最低有效字节。 除了这些接口,我还在主机的公共IP上设置了br0。 还有lo,veth2LPP9A和lxcbr0接口。 lxcbr0具有私有IP的地址。

主机/ etc / network / interfaces看起来像:

auto br0 iface br0 inet static bridge_ports eth0 bridge_fd 0 [...] 

到目前为止,我已经使用了各种在线资源,包括桥接LXC容器来托pipeeth0,这样他们就可以拥有公共IP来帮助我设置。

容器的configuration文件有:

 lxc.network.type = veth lxc.network.link = br0 

我已经从这个文件中删除了静态的lxc.network.ipv4configuration,因为它导致了问题。 当我用这个configuration运行lxc-ls -fancy时,我会在输出中看到两次相同的公有IP。 另外,它会混淆容器的/ etc / network / interfaces的子网configuration。

说到容器的接口文件,它看起来有点像:

 auto eth0 iface eth0 inet static address [...] netmask 255.255.255.255 #gateway [...] dns-nameservers 8.8.8.8 post-up route add [...] dev eth0 post-up route add default gw [...] post-down route del [...] dev eth0 post-down route del default gw [...] 

我必须注释掉网关,并添加路由添加命令到这个文件。 否则,容器将需要几分钟的时间来启动。

主机上的/ proc / sys / net / bridge / bridge-nf- *文件全部设置为0. / proc / sys / net / ipv4 / ip_forward值为1。

问题是,即使容器的“路由-n”看起来应该是这样,我不能从容器中ping出来。 通过SSH访问应该是容器的IP,将我连接到主机。

编辑:从主机中删除容器的静态IP确实有帮助,但现在我得到一个新的错误。 尝试从主机ping容器导致redirectHostFrom,新的下一步。 数据包重复从网关到主机。 从主机运行traceroute显示第一站位于网关处。 那么所有其他的路线是* * *。 无论容器是否在线,我都会遇到同样的问题。

实际上,您可以主机 设置地址和网关,并使用关键字manual将容器configuration为完全不接触该接口。

将其放置在guest虚拟机/etc/network/interfaces

 auto eth0 iface eth0 inet manual 

也可以把它留给容器的configuration文件来设置接口:

 lxc.network.type = veth lxc.network.flags = up lxc.network.link = lxc-bridge-nat lxc.network.ipv4 = 192.168.100.16/24 lxc.network.ipv4.gateway = auto 

客人将performance得像BIOS已经设置的界面,只是使用它。

特别是探索lxc.network.ipv4.gateway

由于您正在桥接,因此只需在容器中设置IP地址,而不是在主机上。 主机只能拥有自己的 IP地址。

我刚刚在Ubuntu 14.04上做了这个。 很简单。 你只需要在容器中编辑/etc/network/interfaces文件,并设置:

 auto eth0 iface eth0 inet static address $IP netmask $NETMASK gateway $GW dns-nameservers $DNS 

用所需的值replace每个variables。

不必做任何事情!

PS:注意一些行之前的空格。 这是强制性的。

我可以在@Enrique Moreno帐篷的回答后正确设置我的lxc容器,所以我会解释如果您不知道如何设置其他项目,请详细说明如何处理。

1.通过lxc-attach命令访问您的LXC容器

命令:

$ lxc-attach -n YOUR-CONTAINER-NAME

2.使用ifconfig查看您当前的configuration

命令

 root@mycontainer:~# ifconfig eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 10.0.3.160 netmask 255.255.255.0 broadcast 10.0.3.255 inet6 fe80::216:3eff:fec9:2fa0 prefixlen 64 scopeid 0x20<link> ether 00:16:3e:c9:2f:a0 txqueuelen 1000 (Ethernet) RX packets 62 bytes 7142 (7.1 KB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 60 bytes 9788 (9.7 KB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536 inet 127.0.0.1 netmask 255.0.0.0 inet6 ::1 prefixlen 128 scopeid 0x10<host> loop txqueuelen 1 (Local Loopback) RX packets 20285 bytes 175021803 (175.0 MB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 20285 bytes 175021803 (175.0 MB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 

“`

3.获取地址,networking掩码和网关

看到上面的ifconfig命令的结果,我们看到:

地址是您想要的地址,您可以将其更改为10.0.3.166。

networking掩码在那里:255.255.255.0

网关 :对于你使用广播地址的网关是10.0.3.255

正如你在上面看到的,你现在拥有所有的信息来填充你的客户(容器) /etc/network/interfaces

4.获取dns-nameservers值。

发出命令:

cat /etc/resolv.conf

但也许最好使用谷歌DNS,其中8.8.8.88.8.4.4

5.编辑容器内的/etc/network/interfaces

auto eth0 iface eth0 inet static address 10.0.3.166 netmask 255.255.255.0 gateway 10.0.3.255 dns-nameservers 8.8.8.8