具有桥接网络的 LXC 容器向外部网络暴露虚假 MAC 地址

具有桥接网络的 LXC 容器向外部网络暴露虚假 MAC 地址

我在 Debian squeeze 上运行 LXC 容器(lxc 0.7.2-1),并使用桥接网络配置这本书使用公共 IP,我遇到的问题是它将 LXC 容器中的虚假 MAC 地址暴露给外部网络,而外部网络会被交换机端口安全阻止,从而阻止 LXC 容器与外部世界通信。我在 Ubuntu 12.04.2 LTS (lxc 0.7.5-3ubuntu67) 上运行另一个 LXC 容器,使用相同的网络配置,但我没有遇到任何问题,因为它不会将虚假 MAC 地址暴露给外部网络,并且所有通信都使用主机的 MAC 地址。

目前,我正在尝试查找主机之间的网络配置差异,但没有成功。这可能是 lxc 本身的版本相关行为吗?

Debian /etc/network/interfaces

auto br0
iface br0 inet static
    bridge_ports eth0
    bridge_fd 0
    bridge_stp off
    bridge_maxwait 0
    address   y.y.y.9
    netmask   255.255.255.192
    broadcast y.y.y.63
    gateway   y.y.y.1
    pre-up iptables-restore < /etc/iptables.up.rules

Debian LXC 网络配置

lxc.network.type = veth
lxc.network.flags = up
lxc.network.link = br0
lxc.network.hwaddr = fe:95:57:4b:b4:9b
lxc.network.ipv4 = y.y.y.12/26

Ubuntu /etc/network/interfaces

auto br0
iface br0 inet static
    bridge_ports eth0
    bridge_fd 0
    bridge_stp off
    bridge_maxwait 0
    address   z.z.z.146
    netmask   255.255.255.0
    broadcast z.z.z.255
    gateway   z.z.z.1
    pre-up iptables-restore < /etc/iptables.rules
    up route add x.x.x.1 br0

Ubuntu LXC 网络配置

lxc.network.type = veth
lxc.network.flags = up
lxc.network.link = br0
lxc.network.name = eth0
lxc.network.ipv4 = x.x.x.1/32
lxc.network.hwaddr = 00:16:3e:87:b5:b9

答案1

区别在于,Ubuntu 上的 LXC 容器使用来自不同子网的 IP 地址,并将其主机的 IP 作为默认网关,而 Debian 上的 LXC 容器使用与主机相同子网的 IP,并将其默认网关与主机相同。

当 LXC 容器的 IP 来自与主机不同的子网并使用其主机作为默认网关时,来自 LXC 容器的数据包将被路由,当它们离开主机的网络接口时,它们将具有主机的 MAC。当 LXC 容器与主机位于同一子网并使用同一网关时,数据包将被桥接并保留 LXC 的假 MAC。我的解决方案是强制通过主机进行路由,即使它们位于同一子网中。在这种情况下,我的 LXC 容器具有以下功能/etc/网络/接口

auto eth0
iface eth0 inet static
    address   y.y.y.12
    netmask   255.255.255.255
    post-up route add y.y.y.9 dev eth0
    post-up route add default gw y.y.y.9 

并且 LXC 主机在 sysctl.conf 中有以下内容

net.ipv4.ip_forward=1
net.ipv4.conf.bond0.proxy_arp = 1

以及/etc/网络/接口

 auto bond0
 iface bond0 inet static
   address y.y.y.9
   netmask 255.255.255.192
   broadcast y.y.y.63
   gateway y.y.y.1

 auto lxcbr0
 iface lxcbr0 inet static
    bridge_ports none
    bridge_fd 0
    bridge_stp off
    bridge_maxwait 0
    address   192.168.120.1
    netmask   255.255.255.0
    up echo 1 > /proc/sys/net/ipv4/conf/eth0/proxy_arp
    up /sbin/ip route add to y.y.y.12 dev lxcbr0

我已从上面的配置中删除了不相关的选项。

相关内容