Дата и время публикации:
Проблемы и решения
1. Суть проблемы
В отличии от Oracle VirtualBox, который имеет симуляцию сетевого адаптера в режиме внутрисетевого обмена (host-only network adapter) [3.1], в реализации Qemu/KVM такой возможности нет. Поэтому мне нужно было создать сетевой мост (bridge) либо ручками или автоматически скармливая формат XML фреймоворку libvirt [3.2], как показано на рисунке 1.1
Рисунок 1.1
На котором показана организация подсети только с внутрисетевым обменом (Host-only network — обозначена синим) и подсети доступом ко всемирной сети Internet (NAT — обозначена красным). При этом обе подсети изолированы друг от друга, если конечно не наладить между ними мостик (обозначен фиолетовым), который реализуется с использованием подсистемы netfilter на уровне ядра за счет использования того же NAT, но только на уровне ядра гостевой ОС "Debian-11"
2. Решение
В рабочей директории, например , создал файл XML формата hostonly-local.xml, содержимое которого показан в листинге 2.1.1
Листинг 2.1
<network> <name>hostonly.local</name> <uuid>52008539-dd34-4b5f-95f5-c9e8591e57c8</uuid> <bridge name='virbr1' stp='on' delay='0'/> <mac address='52:54:00:77:1d:d5'/> <domain name='hostonly.local'/> <ip address='192.168.1.100' netmask='255.255.255.0'> <dhcp> <range start='192.168.1.101' end='192.168.1.102'/> </dhcp> </ip> </network>
который в качестве настроек сети скормил libvirt с помощью virsh, как показано в дампе 2.1.2
Дамп 2.2
~$ sudo virsh net-create hostonly-local.xml Сеть hostonly.local создана из hostonly-local.xml ~$ sudo virsh net-list Имя Состояние Автозапуск Постоянный ------------------------------------------------------- hostonly.local активен no no
Подобную XML конфигурацию libvirt уже скармливал ранее[3.3], когда наводил мосты , но с одним отличаем – любое пробрасывание трафика запрещено, так в листинге 2.1.1 отсутствует ключевой элемен forward, который устанавливает средствами маршрутизации (атрибут mode='route'), так и ретрансляции адреса (атрибут mode='nat').
Далее, мне осталось лишь состыковать гостевые ОC "Debian-11" и "Ubuntu-19.04", для чего с помощью утилиты virt-manager, как показано на рисунке 2.1.3
Рисунок 2.1.3, с поддержки мостовой сети Gnome-boxes [3.3].
При этом мне повстречалась старая ошибка, показанная в дампе 2.1.4 и которую исправлял во время того же мостостроительства [3.3].
Дамп 2.1.4
... Ошибка запуска домена: internal error: /usr/lib/qemu/qemu-bridge-helper --use-vnet --br=virbr1 --fd=34: failed to communicate with bridge helper: Transport endpoint is not connected stderr=failed to create tun device: Operation not permitted ...
В результате вывод команды ip a в гостевой ОС "Debian-11" выдала присвоенный ip, как показано в дампе 2.1.5
Дамп 2.1.5
ip a ... enp1s0:mtu 1500 qdisc fq_codel state UP group default qlen 1000 link/ether 52:54:00:8b:71:48 brd ff:ff:ff:ff:ff:ff inet 192.168.1.102/24 brd 192.168.1.255 scope global dynamic noprefixroute enp1s0 ...
А для гостевой ОС "Ubuntu-19.04" таже команда выдала присвоенный IP, как показано в дампе 2.1.6
Дамп 2.1.6
ip a ... 1: lo:mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo ... 2: enp1s0: mtu 1500 qdisc fq_codel state UP group default qlen 1000 link/ether 52:54:00:85:6a:d1 brd ff:ff:ff:ff:ff:ff inet 192.168.1.103/24 brd 192.168.1.255 scope global dynamic noprefixroute enp1s0 ...
Как и маршурты движения трафика тоже ограничены, как показано в дампе 2.1.7
Дамп 2.1.7
ip route show ... 192.168.1.0/24 dev enp1s0 proto kernel scope link src 192.168.1.103 metric 100
2.2 Создание подсети c доступом к Internet (NAT)
Отличается тем, что ей не нужна , а достаточно указать пользовательский режим сети, который позволяет за счет ретрансляции адреса на уровне гипервизора Qemu/kvm, как показано на рисунке 2.2.1
Рисунок 2.2.1
На котором показано, что при добавлении дополнительного виртуального сетевого интерфейса к гостевой ОС "Ubuntu-19.04" был выбран пользовательский режим сети, что и подтверждает показанный в дампе 2.2.2 перечень доступных на ней , выведенный командой ip a
Дамп 2.2.2
ip a ... 1: lo:mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo ... 2: enp1s0: mtu 1500 qdisc fq_codel state UP group default qlen 1000 link/ether 52:54:00:85:6a:d1 brd ff:ff:ff:ff:ff:ff inet 192.168.1.103/24 brd 192.168.1.255 scope global dynamic noprefixroute enp1s0 ... 3: enp5s0: mtu 1500 qdisc fq_codel state UP group default qlen 1000 link/ether 52:54:00:b3:8f:69 brd ff:ff:ff:ff:ff:ff inet 10.0.2.15/24 brd 10.0.2.255 scope global dynamic noprefixroute enp5s0 ...
И добавился новый маршрут движения трафика и вместе с ним , как показано в дамп 2.2.3
Дамп 2.2.2
~$ ip route show default via 10.0.2.2 dev enp5s0 proto dhcp metric 101 10.0.2.0/24 dev enp5s0 proto kernel scope link src 10.0.2.15 metric 101 192.168.1.0/24 dev enp1s0 proto kernel scope link src 192.168.1.103 metric 100
2.3 Организация доступа к Internet ( netfilter ядра Ubuntu-19.04)
Для доступа к пользовательской сети через которую осуществляется доступ к Интернет нужно добавить маршрут движения трафика на гостевой ОС "Debian-11", как показано в дампе 2.3.1
Дамп 2.3.2
sudo ip route add default via 192.168.1.99 dev enp1s0
После чего, станет доступен ip:10.0.2.15, но этого недостаточно для получения доступа к Internet со стороны гостевой ОС "Debian-11", которая не имеет с ним никаких точек соприкосновения. Так же обращаю внимание, что default via 192.168.1.99 dev enp1s0 устанавливает правило направлять трафик с любым ip адресом на ip:192.168.1.99 через устройство enp1s0 и не стоит об том забывать, в то время как default via 192.168.1.99 dev только фактически до гостевой ОС "Ubuntu-19.04"
Поэтому на гостевой ОС "Ubuntu-19.04" поднял проброс трафика в файле /etc/sysctl.conf : для этого мне нужно было раскомментировать опции ядра net.ipv4.ip_forward, net.ipv6.conf.all.forwarding и добавить net.ipv6.conf.default.forwarding, как показано в дампе 2.3.3
Дамп 2.3.3
sudoedit /etc/sysctl.conf ... # Uncomment the next line to enable packet forwarding for IPv4 net.ipv4.ip_forward=1 # Uncomment the next line to enable packet forwarding for IPv6 # Enabling this option disables Stateless Address Autoconfiguration # based on Router Advertisements for this host net.ipv6.conf.all.forwarding=1 net.ipv6.conf.default.forwarding=1
И произвести подгрузку соответсвующих опций ядра, как показано в дампе 2.3.4
Дамп 2.3.4
$ sudo sysctl --system ... * Applying /etc/sysctl.conf ... net.ipv4.ip_forward = 1 net.ipv6.conf.all.forwarding = 1 net.ipv6.conf.default.forwarding = 1 ...
Далее, использовал iptables, как показано в дампе 2.3.5
Дамп 2.3.5
sudo iptables -t nat -A POSTROUTING -o enp5s0 -j MASQUERADE sudo iptables -A FORWARD -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT sudo iptables -A FORWARD -i enp1s0 -o enp5s0 -j ACCEPT
Сохранил для будущих поколений свои каракули в iptables, для чего установил iptables-persistent и сохранил правила для сетей стандарта IPv4 и IPv6, как показано в дампе 2.3.6
Дамп 2.3.6
~$ sudo -i ~# mkdir -p /etc/iptables ~# /sbin/iptables-save > /etc/iptables/rules.v4 $ sudo iptables-save > /etc/iptables/rules.v4 $ sudo ip6tables-save > /etc/iptables/rules.v6
При этом, каждый раз после перезапука гостевой ОС "Ubuntu-19.04" нужно будет их восстанавливать, как показано в дапме 2.3.7
Дамп 2.3.7
~$ sudo /sbin/iptables-restore < /etc/iptables/rules.v4
На гостевой OC "Debian-11" для автоматизации процесса остается прописать лишь правильный сервер имен, а также адрес IP шлюза и статический адрес IP самого узла вместе c учетом использования NetworkManger в файле /etc/network/interfaces [3.6], как показано в дампе 2.3.8
Дамп 2.3.8
... # This file describes the network interfaces available on your system # and how to activate them. For more information, see interfaces(5). source /etc/network/interfaces.d/* # The loopback network interface auto lo iface lo inet loopback allow-hotplug enp1s0 iface enp1s0 inet static address 192.168.1.98 netmask 255.255.255.0 gateway 192.168.1.99 dns-nameservers 10.0.2.3 192.168.0.1 ...
И протестировать внутренний сервер имен c ip: 10.0.2.3, например для доменного имени google.com, как показано на рисунке 2.3.9
Рисунок 2.3.9
Из которого видно, что проверка производится к кэширующему серверу имен c ip:10.0.2.3 [3.3], который из начально был доступен только гостевой ОС "Debian-11"
3. Библиография
3.1 Brock McElroy — Host-only Networking in KVM
3.3 Поддержка мостовой сети в Gnome-boxes
3.5 Arch Linux — Internet sharing
3.6 Debina WiKi/NetworkConfiguration
3.7 How to save iptables firewall rules permanently on Linux