Назад | Перейти на главную страницу

Контейнер LXC с мостовой сетью предоставляет поддельный MAC-адрес внешней сети

Я запускаю контейнер LXC (lxc 0.7.2-1) в сжатии Debian с сетевым мостом, настроенным с помощью книга с общедоступным IP-адресом, и у меня есть проблема, что он предоставляет поддельный MAC-адрес из контейнера LXC во внешнюю сеть, где он блокируется безопасностью порта коммутатора, что предотвращает связь контейнера LXC с миром. Я запускаю другой контейнер LXC в Ubuntu 12.04.2 LTS (lxc 0.7.5-3ubuntu67) с той же сетевой конфигурацией, но у меня нет никаких проблем, так как он не предоставляет поддельные MAC-адреса для внешней сети, а все коммуникации идут с MAC-адресом хоста.

В настоящее время я пытаюсь найти разницу в конфигурации сети между хостами, но без особого успеха. Может ли это быть зависимым от версии поведением самого lxc?

Debian / etc / сеть / интерфейсы

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 / и т.д. / сеть / интерфейсы

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

Разница в том, что контейнер LXC в Ubuntu использует IP-адрес из другой подсети и имеет IP-адрес своего хоста в качестве шлюза по умолчанию, когда контейнер LXC в Debian использует IP-адрес из той же подсети, что и хост, и имеет свой шлюз по умолчанию, такой же, как у хоста.

Когда контейнер LXC имеет IP-адрес из другой подсети, чем его хост, и использует свой хост в качестве шлюза по умолчанию, тогда пакеты из контейнера LXC маршрутизируются, и когда они покидают сетевой интерфейс хоста, они имеют MAC-адрес хоста. Когда контейнер LXC находится в той же подсети, что и хост, и использует тот же шлюз, пакеты передаются по мосту и сохраняют поддельный MAC-адрес LXC. Мое решение - принудительно выполнить маршрутизацию через хост, даже если они находятся в одной подсети. В этом случае мой контейнер LXC имеет следующие / и т.д. / сеть / интерфейсы:

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

И в / и т.д. / сеть / интерфейсы:

 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

Я удалил ненужные опции из конфигов выше.