在Amazon EC2中为Lxc容器桥接网络


3

我正在尝试在Amazon顶部设置LXC容器。我对Amazon和VPC尤其陌生。实际上是第一次创建VPC进行lxc实验。

我的目标:我的目标是在Amazon实例上具有lxc容器,并将它们放在网桥类型的网络中。这意味着,我应该能够像在物理LAN中一样将可达的公共ip或私有ip分配给其他亚马逊实例/ lxc容器。为此,我一直尝试通过网桥网络使用virsh(libvirt)。有了这个我就无法实现我想要的。

我做了什么:我创建了一个具有单个子网(公共)的VPC。在其中启动了一个debian实例。安装了LXC,可以成功实现nat模式和route模式。但这给了我192.168.122.0(lxc的默认值)IP地址。但是我能够使用一些iptable规则将Internet放入容器中。在尝试使用libvirt之后,通过使用bridge-utils手动创建bridge,在为容器分配IP方面没有走运。我的假设是,容器应该从亚马逊的DHCP服务中获得DHCP租约。最终,我将另一个Elastic IP与debian实例相关联,并记住了其对应的私有ip。之后,创建了一个简单的桥并将eth0添加到主机上的桥。然后使用libvirt创建一个简单的主机桥网络。并在lxc配置中硬编码了我记忆的指定IP。然后,我启动了lxc容器。容器可以在其上获取指定的ip。我可以从主机上SSH它。但是我没有在那个容器里上网。

/ etc / network / interfaces(host) auto loiface lo inet回送auto 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)

容器的接口文件 auto loiface lo inet回送

auto eth0
iface eth0 inet static
address 10.0.0.207
netmask 255.255.255.0
gateway 10.0.0.1

我的问题

  1. 在这种情况下,我应该选择哪种VPC?
  2. 哪种网络模式使我的工作更轻松?
  3. 至少,凭我所取得的成就,如何才能将Internet连接到容器?
  4. 如果没有弹性IP,我能否在同一子网中拥有其他实例和容器可以访问的私有IP?

Answers:


3

Amazon不支持VPC内服务器的动态IP地址。启动服务器时分配的一个IP地址是您可以与网络一起发送和从网络接收的唯一IP地址。只是动态地将LXC容器服务器添加到实例,并假设桥接网络可以使其正常工作是不可能的。Amazon IP网络是用于在实例之间进行路由的专用网络,它不模仿通用的以太网子网-您希望从中获得的大多数功能都不起作用。

如果需要这些功能,则可以在Amazon IP地址之上配置虚拟网络子网-使用诸如GRE隧道,VDE(虚拟分布式以太网)或OpenVPN之类的东西。

但是,如果您纯粹是通过Amazon网络进行的,那么我将尝试解释您的选择。

弹性IP地址可以正常工作,以使私有IP地址保持不变,但是当(且仅当)地址路由到Internet网关时,弹性IP地址才会发生一对一的NAT。

也有可能从实例的网络接口删除源和目标检查,这通常是在路由器上完成的。使用它可能允许多台服务器驻留在一个实例上,但是这似乎令人怀疑,因为即使在这种情况下,我也不认为Amazon会将ARP请求路由到该服务器。

当前,Amazon VPC支持每个实例多个接口(最多2个)和每个实例多个IP地址(最多8个)。如果您愿意在每次添加服务器时都配置实例,则可以使用此方法。地址只是实例的虚拟接口上允许的其他地址通信。它们没有DHCP支持,因此,从管理控制台将IP地址添加到服务器后,您需要手动配置IP地址。使用它们的通常方法是只使用“ ip addr add”将多个IP地址添加到同一接口,但是我看不出为什么使用桥接并将地址传递到不同接口上也不起作用。


1
根据aws.amazon.com/about-aws/whats-new/2012/07/06/…的数据, AWS现在在其较大的实例上最多支持240个IP。
Rich Remer

0

我也有同样的需求,也许我刚刚找到了一种方法。

我的设置是:

附加eth1HWaddr 02:5f:fc:b3:0b:b9和多个IP 10.2.132.61到“ 10.2.132.64”

我想使用桥接并共享相同的NIC,以便为每个容器提供为该接口配置的IP之一。

我的第一个尝试是创建一个br0on 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

我发现的解决方案是将外部接口(br0eth1主机上)的MAC更改为随机的MAC 。这样启动容器就可以立即获取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

然后重启Container就成功了!

现在可以使用DHCP。要使用该接口的其他注册IP,我显然必须依靠在CONTAINER / config文件中静态设置IP。

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.