× К оглавлению На главную Об авторе

   Дата и время публикации:

Проблемы и решения

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.2 QEMU Host Only Networking

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