Настройка сети в Libvirt для LXC

Выполните инструкцию пошаговая инструкция настройки Libvirt на Ubuntu 18.04 с поддержкой LXC контейнеров

Настройки сети сохраняются здесь: /etc/libvirt/qemu/networks

Создадим сеть по умолчанию. Отредактируем уже существующую сеть.

lxc net-edit --network default

Обратите внимание на UUID. У вас он может быть другим. Вставьте следующий код в открывшемся редакторе:

<network>
    <name>default</name>
    <forward mode="nat" />
    <bridge name='lxcnet' stp='on' delay='0'/>
    <mac address='52:54:00:35:a2:59'/>
    <dns>
        <forwarder addr="1.1.1.1"/>
        <forwarder addr="8.8.8.8"/>
    </dns>
    <ip address="172.30.0.1" netmask="255.255.255.0">
        <dhcp>
            <range start="172.30.0.100" end="172.30.0.254"/>
            <host name="test" ip="172.30.0.5"/>
        </dhcp>
    </ip>
</network>

В данном файле мы задаем сеть 172.30.0.0/24. Сеть будет организована на мосту(bridge) с названием lxcnet. IP адреса будут раздаваться автоматически по DHCP от 172.30.0.100 до 172.30.0.254. Автоматически будет прописан DNS сервера 1.1.1.1 и 8.8.8.8. Для хоста "test" будет автоматически выдаваться IP адрес 172.30.0.5. 

IP адрес постоянно может выдаваться не всегда. Дело в том, что, если хост подключается первый раз, то dnsmasq запоминает MAC адрес и имя хоста машине, и выдает ему IP. Если явно прописан хост, то выдает статичный IP. НО! Если будет подключаться второй хост с таким же именем, но другим MAC адресом, то dnsmasq выдаст другой IP адрес. Даже если машина первая была уже выключена. Сервер dnsmasq запоминает IP адреса на 24 часа. Если вы хотите использовать статические IP адреса для контейнера, то их можно прописать в разделе xml interface в самом контейнере.

После того, как мы настроили сеть, добавляем ее в автозапуск.

lxc net-autostart --network default

Перезапускаем сеть:

lxc net-destroy default 
lxc net-start default

После каждого редактирования настроек сети ее надо перезапускать.

Добавление хостов на лету

Иногда нужно добавить новые статические адреса, не перезагружая сеть. Для этого существуют следующая комманда:

lxc net-update default add-last ip-dhcp-host "<host name='bob' ip='172.30.0.25' />"  --live --config

Как узнать IP адреса хостов в libvirt?

Для того, чтобы узнать IP, нужно выполнить комманду:

lxc net-dhcp-leases default

Настройка iptables

Включаем NAT

echo 1 > /proc/sys/net/ipv4/ip_forward
echo "net.ipv4.ip_forward=1" >> /etc/sysctl.conf

Для автоматической настройки создадим скрипты iptables. Создайте папку

mkdir /etc/iptables

Создайте файл:

nano /etc/iptables/rules.v4

*nat
:PREROUTING ACCEPT [0:0]
:INPUT ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]

# Проброс HTTP на 172.30.0.1
-A PREROUTING -i ens3 -p tcp -m tcp --dport 80 -j DNAT --to-destination 172.30.0.10:80
-A PREROUTING -i ens3 -p tcp -m tcp --dport 443 -j DNAT --to-destination 172.30.0.10:443

# Проброс FTP на 172.30.0.10
-A PREROUTING -i ens3 -p tcp -m tcp --dport 21 -j DNAT --to-destination 172.30.0.10:21
-A PREROUTING -i ens3 -p tcp -m tcp --dport 30000:50000 -j DNAT --to-destination 172.30.0.10:30000-50000

COMMIT



*filter
:INPUT ACCEPT [15:688]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [302:39762]
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT

# Разрешаем FTP
-A INPUT -p tcp -m tcp --dport 21 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 30000:50000 -j ACCEPT

# Разрешаем входящие соединения http
-A INPUT -p tcp -m tcp --dport 80 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 443 -j ACCEPT

# Разрешаем входящие соединения ssh
-A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT

# Запрещаем остальные входящие соединения
#-A INPUT -j REJECT --reject-with icmp-host-prohibited
#-A FORWARD -j REJECT --reject-with icmp-host-prohibited

COMMIT



*mangle
:PREROUTING ACCEPT [389:34269]
:INPUT ACCEPT [389:34269]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [303:39898]
:POSTROUTING ACCEPT [303:39898]
-A POSTROUTING -s 172.30.0.0/24 -d 224.0.0.0/24 -j RETURN
COMMIT

nano /etc/iptables/rules.v6

# Generated by ip6tables-save v1.6.1 on Fri Feb  8 21:36:53 2019
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [88:5584]
COMMIT
# Completed on Fri Feb  8 21:36:53 2019

nano /etc/network/if-up.d/00-iptables

#!/bin/sh
iptables-restore < /etc/iptables/rules.v4
ip6tables-restore < /etc/iptables/rules.v6

 Установите флаг выполнения на созданном файле

chmod +x /etc/network/if-up.d/00-iptables

Используемые источники

  1. https://wiki.libvirt.org/page/Networking - Официальная документация
  2. https://gist.github.com/tachang/24b72d613faa19f76cfa - Скрипт перезапуска сети