понедельник, 20 февраля 2017 г.

LXC с сетью в Bridge+NAT

Есть сервер тонкой виртуализации LXC на Debian. Виртуальные машины подключаем в Bridge (не включено bydefault в Debian 8\Jessie), выпускаем во вне через Masquerade и настраиваем для VM раздачу адресов в DNSMasq.

Хост со статическим адресом (не суть, но виртуалка почему-то стала обнулять resolv.conf) 192.168.1.1/24. Под виртуализацию выделяем внутренную сеть 172.20.20.1/24.

Обычно я не люблю masquerade, так как SNAT быстрее и позволяет выпускать VM в сеть с отдельного IP или алиаса(hint), но с маскарадом не надо заботиться о переписывании строки iptables при смене IP vmhost.

Источники

Создаём мост в vmhost

Ставим bridge-utils, добавляем интерфейс

cat >> /etc/network/interfaces << EOF
iface lxbr0 inet static
    post-up /etc/network/ifup.d/masquerade
    bridge-ports none
    bridge_fd    0
    address      172.20.20.1
    netmask      255.255.255.0
EOF

В /etc/network/if-up.d/masquerade пишем шастройку маскарада для шлюза. Изменять mangle нужно, чтобы корректно работал DHCP.

cat > /etc/network/if-up.d/masquerade << EOF
#!/bin/sh
if [ "$mode" == "start" ]; then
    iptables -t nat -A POSTROUTING -s 172.20.0.0/24 -o eth0 -j MASQUERADE
    iptables -t mangle -A POSTROUTING -p udp -j CHECKSUM --checksum-fill
fi
if [ "$mode" == "stop" ]; then
    iptables -t nat -D POSTROUTING -s 172.20.0.0/24 -o eth0 -j MASQUERADE
    iptables -t mangle -D POSTROUTING -p udp -j CHECKSUM --checksum-fill
fi
EOF

Учим LXC подключаться к мосту

cat > /etc/lxc/default.conf
lxc.network.type = veth
lxc.network.link = lxbr0
lxc.network.flags = no
lxc.network.name = eth0
EOF

Учим dnsmasq делать DHCP

cat /etc/dnsmasq.d/lxc << EOF
interface=lxbr0
dhcp-range=lxbr0,172.20.20.16,172.20.20.254,1h
#dhcp-option=lxbr0,option:router,172.20.20.1
#dhcp-option=lxbr0,option:dns-server,172.20.20.1
domain=lxc.local,172.20.20.0/24
EOF

Проверяем

lxc-start -n vm -d
lxc-attach -n vm

Из очень интересных вещей: в описании Bridgeing мне очень понравиось, что можно прикрепить bridge к eth0.vlan и таким образом делить мост между VM на нескольких vmhost

Комментариев нет:

Отправить комментарий