如何为LXC guest虚拟机配置外部IP地址?


18

我正在探索Ubuntu 12.04中的LXC功能,我真的想建立一个像这样的网络:

client1:   192.168.56.101/24
lxc-host:  192.168.56.102/24
guest1     192.168.56.201/24
guest2     192.168.56.202/24
guest3     192.166.56.203/24

我只需要一个“扁平”网络,来宾可以完全访问LAN,并且可以从客户端看到它们。我习惯使用libvirt / KVM桥接网络,如下所述:http : //libvirt.org/formatdomain.html#elementsNICSBridge

在主机上:

# /etc/network/interfaces
auto br0
iface br0 inet static
    address 192.168.56.102
    netmask 255.255.255.0
    broadcast 192.168.56.255
    bridge_ports eth1

第一个访客的lxc.conf:

# /var/lib/lxc/guest1/config:
lxc.network.type=veth
lxc.network.link=br0
lxc.network.flags=up
lxc.network.hwaddr=00:16:3e:13:48:4e
lxc.network.ipv4=192.168.56.201/24

看来192.168.56.201对外界不可见,这不是我想要的。似乎我必须执行以下操作之一:

1)在主机和来宾上手动设置路由

2)进行一些操作...提前在主机上创建虚拟接口,并配置guest虚拟机以使用它们lxc.network.type=phys。我不知道这是否真的有效。

我专注于Ubuntu,但是针对RHEL / Fedora的答案也将非常有用。


1
后续:我将br0设置为混杂模式,并且它似乎正在执行我现在想要的操作。我想这是标准做法,但我阅读过的许多LXC教程均未涉及。如果有任何反馈,我将
暂时搁置

我做了大致相同的操作(除了手动设置略有不同):每个lxc配置中的netup脚本将veth添加到网桥(在主机上),每个容器中的手动IP设置,每个容器中的其他脚本/接口来设置路由(通过主机上的ip4转发)。但是,据我所知,这两种解决方案都意味着容器可以将自己的IP地址设置为几乎所有内容(并且将主机的主要接口添加到网桥中也不太方便)。所以我也对一些反馈/解决方案感兴趣。
HoverHell 2012年

Answers:


13

这几乎是正确的-尽管您缺少这样的一行:

lxc.network.ipv4.gateway = X.X.X.X

我有一个在Debian上运行的LXC来宾。首先,在以下位置设置主机桥(简便方法)/etc/network/interfaces

auto wan
iface wan inet static
        address 72.X.X.X
        netmask 255.255.255.0
        gateway 72.X.X.1
        bridge_ports wan_phy    # this line is important.
        bridge_stp off
        bridge_fd 2
        bridge_maxwait 20

在您的情况下,您已将其命名br0,而我已将其命名wan。该桥可以称为任何您想要的。您首先需要进行这项工作-如果失败,请与(例如)合作进行调查brctl

然后,您的LXC配置被设置为加入该网桥:

lxc.utsname = FOO
lxc.network.type = veth
lxc.network.link = wan                  # remember, this is what I call my bridge
lxc.network.flags = up
lxc.network.name = v-wan                # optional, I believe
lxc.network.ipv4 = 72.X.X.Y/24          # different IP than the host
lxc.network.ipv4.gateway = 72.X.X.1     # same as on the host

正如HoverHell所指出的那样,在容器中具有root权限的人可以更改IP地址。是的 这是一个桥(又名以太网交换机)。如果要防止这种情况,可以在主机上使用防火墙规则-至少在我的情况下,数据包需要通过主机的iptables。


10
感谢大家。有点难过,但我还是回到了这个
话题

2
@derobert:不确定当时是否可用,但是对于我来说,auto它也是有效的值lxc.network.ipv4.gateway,默认为veth接口所连接的网桥的IP。
0xC0000022L15年

网桥接口是否需要自己的IP?如果wan_phy面向互联网,则网桥IP必须是另一个有效的公共IPv4地址,因为它必须与我将配置lxc guest虚拟机的其他公共IPv4地址位于同一子网中,对吗?但这似乎很浪费。askubuntu.com/a/884293/394569建议不要严格配置网桥地址。
josch

@josch在该示例中,wan_phy没有IP,而是在网桥上。我怀疑,如果您不希望“主机”拥有外部IP,则根本不需要IP。
derobert

6

我还没有完全进入LXC,

但是我已经在局域网中设置了多个具有自己的静态IP的容器,这些容器为我的某些网站提供了互联网服务...

也许这可以为您提供所需的帮助。

我运行多个容器,像这样,

在主机上,我编辑了主机的文件,添加了每个容器和主机:vi / etc / hosts

lxc host machine:   192.168.1.100
container1:   192.168.1.101
container2:     192.168.1.102
container3:   192.168.56.102
container4:   192.166.56.103

保存后...

同样,在主机上,我将网络和网桥设置为:

# /etc/network/interfaces
auto eth0
iface eth0 inet manual

auto br0
iface br0 inet static
        bridge_ports eth0
        bridge_stp off
        bridge_fd 0
        bridge_maxwait 0
        **address** 192.168.1.100
        netmask 255.255.255.0
        **network 192.168.1.1**
        **broadcast** 192.168.1.100
        gateway 192.168.1.1
        dns-nameservers 8.8.8.8 8.8.4.4

网络上方是我的路由器ip,用于局域网。(内部) 地址和广播是主机,内部IP,后来我使用VHOST进行Internet访问,Web服务器,FTP等。

对于LXC容器1-4,我像这样设置:

LXC CONFIG
lxc.network.type=veth
lxc.network.link=br0
lxc.network.flags=up
lxc.network.hwaddr=00:16:3e:13:48:4e
**lxc.network.ipv4=192.168.1.101**

现在Container 1 IP = 192.168.1.101

我重复其他容器以在LAN上拥有自己的静态IP。

在容器1-4中

从主机登录:

lxc-console -n CONTAINERNAME,

&我将每个容器网络设置为静态,eth0设置为:

auto eth0
iface eth0 inet static
        address 192.168.1.101
        netmask 255.255.255.0
        network 192.168.0.0
        broadcast 192.168.1.101
        gateway 192.168.1.1
        dns-nameservers 8.8.8.8 8.8.4.4

每个容器都有IP(局域网)上可用的(本地)。您可以对每个本地IP SSH进行测试,以使用腻子进行测试!

在那之后,我非常确定你应该弄清楚如何通过互联网来运行它们,例如,将虚拟主机转换为容器ip /负载平衡器/代理等。

也许此设置可以为您提供任何帮助。


如果您在LXC容器配置中配置IP和网关等,则无需在容器内重复该操作。而是将iface节设置为manual(不是staticdhcp)。updowndns-nameservers等等仍然可以存在于Debian等使用
0xC0000022L

1

我还没有使用LXC,但是本文应该可以为您提供帮助:使用以太网桥进行网络配置(请参见方法2)。

为了给您一些有关配置的提示(我假设您已经正确配置了br0):

  1. 您需要使用创建一对veth设备 ip link add type veth
  2. 前面的命令创建了2个虚拟接口:veth0和veth1
  3. 现在将虚拟接口veth0添加到网桥: brctl addif br0 veth0
  4. 在您的lxc shell中,键入: ns_exec -nm -- /bin/bash
  5. 现在,我们必须将另一个虚拟if设置为lxc shell的网络名称空间: ip link set veth1 netns PID_OF_LXC_SHELL
  6. 现在,通过在lxc shell中将veth1配置为所需的IP地址(例如192.168.56.201),就可以完成所有设置。

您根本没有测试过吗?您可能会得到赏金,但是您的回答根本对我没有帮助,我的设置与OP完全相同。
Jonas G. Drange

我该如何帮助您?我的答案中有没有一个步骤没有执行,还是您执行了却没有解决问题?不,正如我在回答中所说,LXC在我要做的事情上,但我尚未开始真正的测试。
惠更斯州
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.