我正在探索 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)做一些做作的事情...提前在主机上创建虚拟接口,并配置来宾使用它们lxc.network.type=phys
。我不知道这是否真的有效。
我专注于 Ubuntu,但 RHEL/Fedora 的答案也很有用......
答案1
这几乎是正确的——尽管你漏掉了这样一行:
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。
答案2
我还没有完全进入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来访问互联网,网络服务器,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**
现在容器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(本地),可在 LAN 上使用。您可以通过 SSH 连接每个单独的本地 IP,以使用 Putty 进行测试!
之后我很确定你应该弄清楚如何通过互联网运行它们,例如,虚拟主机到容器IP /负载均衡器/代理/等等。
也许这个设置无论如何都能有所帮助。
答案3
我还没有玩过 LXC,但是这篇文章应该可以帮助你:使用以太网桥进行网络配置(检查方法 2)。
给你一些关于配置的提示(我假设你已经正确配置了 br0):
- 您需要使用以下命令创建一对 veth 设备
ip link add type veth
- 上一条命令创建了 2 个虚拟接口:veth0 和 veth1
- 现在将虚拟接口 veth0 添加到网桥:
brctl addif br0 veth0
- 在您的 lxc shell 中,输入:
ns_exec -nm -- /bin/bash
- 现在我们必须将另一个虚拟 if 设置为 lxc shell 的网络命名空间:
ip link set veth1 netns PID_OF_LXC_SHELL
- 现在,通过在 lxc shell 中将 veth1 配置为您想要的 IP 地址(例如 192.168.56.201),您应该已准备就绪。
答案4
LXD 客户端 CLI,lxc
允许设置网络接口类型;将其设置macvlan
为default
配置文件。
lxc profile device set default eth0 nictype macvlan
使用配置文件的容器default
将有一个 LAN IP。