我正在尝试在 Amazon 上设置 LXC 容器。我对 Amazon 和 VPC 尤其陌生。事实上,我第一次创建 VPC 是为了试验 lxc。
我的目标:我的目标是在 Amazon 实例上安装 lxc 容器,并将它们置于桥接类型网络中。这意味着,我应该能够分配公共 IP 或可与其他 Amazon 实例/lxc 容器访问的私有 IP,就像在物理 LAN 中一样。为此,我一直在尝试使用桥接网络的 virsh(libvirt)。通过这种方式,我始终无法实现我想要的。
我做了什么:我创建了一个具有单个子网(公共)的 VPC。在其中启动了一个 debian 实例。安装了 LXC 并成功实现了 nat 模式和路由模式。但这给了我 192.168.122.0(lxc 的默认)ip 地址。但我能够使用一些 iptable 规则在容器中访问互联网。尝试使用 libvirt 后,通过使用 bridge-utils 手动创建网桥,无法为容器分配 IP。我的假设是容器应该从 Amazon 的 DHCP 服务获得 DHCP 租约。最后,我将另一个弹性 IP 关联到 debian 实例并记住了它的私有 IP。之后创建了一个简单的网桥并将 eth0 添加到主机上的网桥。然后使用 libvirt 创建了一个简单的主机桥接网络。并在 lxc 配置中硬编码了我记住的私有 IP。然后我启动了 lxc 容器。容器可以在其上获取私有 IP。我可以从主机 ssh 到它。但我无法通过该容器访问互联网。
/etc/network/interfaces(主机) 自动 lo iface lo inet 环回 自动 eth0 iface eth0 inet 手动
auto br0
iface br0 inet dhcp
bridge_ports eth0
bridge_fd 0
bridge_maxwait 0
virsh net-dumpxml 主机桥
<network>
<name>host-bridge</name>
<uuid>7c41e4ce-311c-c78f-5ea3-a03a224e4a3c</uuid>
<forward mode='bridge'/>
<bridge name='br0' />
</network>
lxc 配置文件
lxc.network.type = veth
lxc.network.flags = up
lxc.network.link = br0
#lxc.network.name = eth0
lxc.network.ipv4 = 10.0.0.207/24(natted memorized ip)
容器的接口文件 自动 lo iface lo inet 环回
auto eth0
iface eth0 inet static
address 10.0.0.207
netmask 255.255.255.0
gateway 10.0.0.1
我的问题:
- 对于这种场景我应该选择哪个 VPC?
- 什么网络模式可以让我的工作更轻松?
- 至少,凭借我已取得的成就,我怎样才能将互联网接入容器?
- 如果没有弹性 IP,我能不能在同一子网中拥有一个可供其他实例和容器访问的私有 IP?
答案1
Amazon 不支持 VPC 内服务器的动态 IP 地址。服务器启动时分配的一个 IP 地址是您唯一可以通过网络发送和接收的 IP 地址。仅将 LXC 容器服务器动态添加到实例并假设桥接网络可以使其工作是行不通的。Amazon IP 网络是用于实例之间路由的专用网络,它不会模仿通用以太网子网 - 您期望从中得到的大多数功能都无法使用。
如果您需要这样的功能,您可以在 Amazon IP 地址之上配置一个虚拟网络子网 - 使用 GRE 隧道、VDE(虚拟分布式以太网)或 OpenVPN 之类的东西。
但是,如果您纯粹使用亚马逊网络来实现这一点,我会尝试解释您的选择。
弹性 IP 地址的工作方式是,私有 IP 地址保持不变,但是如果(且仅当)该地址被路由到互联网网关,就会对弹性 IP 地址发生一对一 NAT。
还可以从实例的网络接口中删除源和目标检查,这通常是为路由器完成的。使用它可以允许多个服务器驻留在一个实例上,但这似乎值得怀疑,因为即使在这种情况下,我不相信亚马逊会将 ARP 请求路由到服务器。
目前,Amazon VPC 支持每个实例有多个接口(最多 2 个)和每个实例有多个 IP 地址(最多 8 个)。如果您愿意在每次添加服务器时配置实例,则可以使用此方法。这些地址只是允许在实例的虚拟接口上进行通信的附加地址。它们不支持 DHCP,因此您需要在从管理控制台将它们添加到服务器后手动配置 IP 地址。使用它们的正常方法是仅使用“ip addr add”将多个 IP 地址添加到同一接口,但我认为使用桥接并将地址传递到不同的接口没有明显的原因。
答案2
我也有同样的需求并且我可能刚刚找到了一种方法来做到这一点。
我的设置是:
附加eth1
卡HWaddr 02:5f:fc:b3:0b:b9
和多个 IP10.2.132.61
为“10.2.132.64”
我想使用桥接并共享同一个 NIC,以便为每个容器提供为该接口配置的一个 IP。
我的第一次尝试是创建一个br0
,eth1
然后使用此配置
lxc.network.type = veth
lxc.network.hwaddr = 02:5f:fc:b3:0b:b9
lxc.network.flags = up
lxc.network.link = br0
这里的问题是,当你启动容器时,它将dhcp
从02:5f:fc:b3:0b:b9
(外桥)接收发往具有相同 HDaddr 的接口的数据包,并且它会抱怨:
kernel: [16809131.333956] br0: received packet on vethVIAEYB with own address as source address
br0
我发现的解决方案是将外部接口(以及主机上的)的 MAC 更改eth1
为随机的。这样启动容器后,它就可以立即获取 DHCP 信息!
所以我做了
sudo ifconfig eth1 down
sudo ifconfig eth1 hw ether 00:80:48:BA:d1:30
sudo ifconfig br0 hw ether 00:80:48:BA:d1:30
sudo ifconfig eth1 up
然后重新启动容器就成功了!
它现在正在使用 DHCP。要使用该接口的其他已注册 IP,我显然必须依靠在 CONTAINER/config 文件中静态设置 IP。