如何为 LXC 来宾配置外部 IP 地址?

twb*_*mer 18 networking ubuntu lxc

我正在探索 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
Run Code Online (Sandbox Code Playgroud)

我只想要一个“扁平”网络,其中来宾可以完全访问 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
Run Code Online (Sandbox Code Playgroud)

第一个来宾的 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
Run Code Online (Sandbox Code Playgroud)

看起来192.168.56.201对外界是不可见的,这不是我想要的。似乎我必须做以下事情之一:

1)在host和guest上手动设置路由

2)做些假的...提前在主机上创建虚拟接口,并配置来宾使用它们lxc.network.type=phys。我不知道这是否真的有效。

我专注于 Ubuntu,但 RHEL/Fedora 的答案也很有用....

der*_*ert 13

这是非常正确的——尽管你错过了这样的一行:

lxc.network.ipv4.gateway = X.X.X.X
Run Code Online (Sandbox Code Playgroud)

我有一个在 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
Run Code Online (Sandbox Code Playgroud)

在你的情况下,你已经调用了它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
Run Code Online (Sandbox Code Playgroud)

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

  • 谢谢大家。有点难过,但我刚刚回到这个,通过谷歌找到了这个,忘记了我是最初的提问者...... (10认同)
  • @derobert:不确定当时是否可用,但`auto` 也是`lxc.network.ipv4.gateway` 的有效值,据我所知,默认为veth-interface 获取的网桥的IP连接的。 (2认同)

小智 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
Run Code Online (Sandbox Code Playgroud)

保存后...

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

# /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
Run Code Online (Sandbox Code Playgroud)

网络上面是我的路由器ip,用于局域网。(内部) 地址和广播是主机、内部 ip,我后来使用 VHOST 访问互联网、网络服务器、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**
Run Code Online (Sandbox Code Playgroud)

现在容器 1 IP = 192.168.1.101

我重复其他容器在局域网上有自己的静态 ip ..

在容器 1-4 中,

从主机登录:

lxc-console -n CONTAINERNAME,
Run Code Online (Sandbox Code Playgroud)

& 我将每个容器网络设置为静态,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
Run Code Online (Sandbox Code Playgroud)

每个容器都有自己的 IP,(本地)在 LAN 上可用。您可以通过 SSH 连接每个本地 IP,使用 PUTTY 进行测试!

在那之后,我很确定你应该弄清楚如何通过互联网运行它们,例如,vhost 到容器 ip / 负载均衡器 / 代理 / 等等。

也许这个设置无论如何都可以提供帮助。