Настройка сети в 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

Установка iptables

aptitude install iptables-persistent

Включаем NAT

echo 1 > /proc/sys/net/ipv4/ip_forward
echo "net.ipv4.ip_forward=1" > /etc/sysctl.d/10-ip-forward.conf

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

mkdir /etc/iptables

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

nano /etc/iptables/rules.v4

*filter
:INPUT ACCEPT [19:913]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [39:3584]
:ALLOW-INPUT - [0:0]
:f2b-sshd - [0:0]

-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A OUTPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT

# Fail2Ban SSH
#-A INPUT -p tcp -m multiport --dports 22 -j f2b-sshd

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

# Перейти к цепочке ALLOW-INPUT
-A INPUT -j ALLOW-INPUT

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

# Раскомментируйте, если нужно запретить все исходящие соединения 
#-A OUTPUT -j REJECT

# Разрешить http
-A ALLOW-INPUT -p tcp -m tcp --dport 80 -j ACCEPT
-A ALLOW-INPUT -p tcp -m tcp --dport 443 -j ACCEPT

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

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

-A ALLOW-INPUT -j RETURN

# Fail2ban
-A f2b-sshd -j RETURN


*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

Скопируйте этот же конфиг в /etc/iptables/rules.v6

cp /etc/iptables/rules.v4 /etc/iptables/rules.v6

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

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