Нет подключения к интернету в виртуальной машине с NAT на Libvirt

Вопрос или проблема

Привет, супер-пользователи,

Я пытаюсь настроить интернет-соединение в своей виртуальной машине KVM/QEMU через NAT по умолчанию от Libvirt.

К сожалению, гостевая ОС (Windows 10) видит виртуальный адаптер как “Неопознанная сеть” и показывает, что “Нет Интернета”. Это и вывод “ipconfig” (ниже) показывают, что DHCP в виртуальной машине не работает должным образом. Маска подсети (изначально 255.255.255.0) и авто-адрес IPv4 (который должен быть в диапазоне 192.168.122.2 и 192.168.122.254) также настроены неправильно:

Ethernet adapter Ethernet 2:
   Connection-specific DNS Suffix  . :
   Autoconfiguration IPv4 Address. . : 169.254.81.241
   Subnet Mask . . . . . . . . . . . : 255.255.0.0
   Default Gateway . . . . . . . . . :

Вывод “ip a” на хосте во время работы виртуальной машины:

1: lo: <LOOPBACK,UP,LOWER_UP> 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
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: enp3s0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc mq state DOWN group default qlen 1000
    link/ether f0:2f:74:1b:5b:aa brd ff:ff:ff:ff:ff:ff
3: virbr0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
    link/ether 52:54:00:5b:92:9a brd ff:ff:ff:ff:ff:ff
    inet 192.168.122.1/24 brd 192.168.122.255 scope global virbr0
       valid_lft forever preferred_lft forever
4: wlan0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
    link/ether d0:37:45:d8:fb:9a brd ff:ff:ff:ff:ff:ff
    inet 192.168.0.127/24 metric 20 brd 192.168.0.255 scope global dynamic wlan0
       valid_lft 603733sec preferred_lft 603733sec
    inet6 fe80::d237:45ff:fed8:fb9a/64 scope link
       valid_lft forever preferred_lft forever
6: vnet0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master virbr0 state UNKNOWN group default qlen 1000
    link/ether fe:54:00:d4:cd:4e brd ff:ff:ff:ff:ff:ff
    inet6 fe80::fc54:ff:fed4:cd4e/64 scope link
       valid_lft forever preferred_lft forever

Вывод “ip r” на хосте:

default via 192.168.0.1 dev wlan0 proto dhcp src 192.168.0.127 metric 20
192.168.0.0/24 dev wlan0 proto kernel scope link src 192.168.0.127 metric 20
192.168.0.1 dev wlan0 proto dhcp scope link src 192.168.0.127 metric 20
192.168.0.56 dev wlan0 proto dhcp scope link src 192.168.0.127 metric 20
192.168.122.0/24 dev virbr0 proto kernel scope link src 192.168.122.1

Это странно, потому что мост (virbr0) работает, и виртуальный интерфейс (vnet0) подключен к нему. Чтобы исправить неправильную конфигурацию, я настроил параметры LAN статически, что сработало, но теперь я могу пинговать только мой хост (192.168.0.127) и мост (192.168.122.1), при этом пинги к серверам WAN, таким как “google.com” или даже “8.8.8.8”, истекают по времени.
Разве это не означает, что virbr0 работает и перенаправляет пакеты как ожидалось, однако брандмауэр не позволяет виртуальному мосту отправлять пакеты к шлюзу по умолчанию?

Вот что я уже пробовал:

  • Установка и включение dnsmasq (ошибки dnsmasq теперь исчезли)
  • sysctl -w net.ipv4.ip_forward=1 >> /etc/sysctl.conf

Спасибо заранее за ваше время и помощь!

limefrog :)))

libvirt не работает хорошо с nftables пока

  • установите пакет совместимости iptables для nftables (iptables-nft)
  • отредактируйте /etc/libvirt/network.conf и установите бэкенд на iptables
firewall_backend = "iptables"

из консоли virsh:

net-destroy default
net-start default

nftables workaround for libvirt

  • libvirt тогда создаст правила брандмауэра для работы nat:
[root@endeavour ~]# iptables -t nat -L
Chain PREROUTING (policy ACCEPT)
target     prot opt source               destination         

Chain INPUT (policy ACCEPT)
target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         

Chain POSTROUTING (policy ACCEPT)
target     prot opt source               destination         
LIBVIRT_PRT  all  --  anywhere             anywhere            

Chain LIBVIRT_PRT (1 references)
target     prot opt source               destination         
RETURN     all  --  192.168.122.0/24     base-address.mcast.net/24 
RETURN     all  --  192.168.122.0/24     255.255.255.255     
MASQUERADE  tcp  --  192.168.122.0/24    !192.168.122.0/24     masq ports: 1024-65535
MASQUERADE  udp  --  192.168.122.0/24    !192.168.122.0/24     masq ports: 1024-65535
MASQUERADE  all  --  192.168.122.0/24    !192.168.122.0/24

Ответ или решение

Здравствуйте!

Судя по вашему описанию, проблема с подключением вашего виртуального машины (VM) к интернету через NAT в Libvirt может возникать из-за нескольких причин, связанных с настройкой сетевого моста, правилами брандмауэра и DHCP. Давайте рассмотрим шаги для устранения этой проблемы.

Шаги для диагностики и исправления проблемы:

  1. Проверить настройки virbr0 и dnsmasq:

    • Убедитесь, что служба dnsmasq запущена и настроена правильно. Она должна обеспечивать DHCP для вашей виртуальной сети.
    • Проверьте настройки default.xml, чтобы убедиться, что все параметры корректны:
      <network>
      <name>default</name>
      <uuid>...<uuid>...</uuid>
      <forward mode='nat'/>
      <bridge name='virbr0' stp='on' delay='0'/>
      <ip address='192.168.122.1' netmask='255.255.255.0'>
       <dhcp>
         <range start='192.168.122.2' end='192.168.122.254'/>
       </dhcp>
      </ip>
      </network>
    • Перезапустите сеть в Libvirt:
      virsh net-destroy default
      virsh net-start default
  2. Проверить настройки брандмауэра:

    • Убедитесь, что ваш брандмауэр (например, nftables или iptables) позволяет трафик между вашей виртуальной сетью и внешним интернетом. Если вы используете nftables, возможно, вам необходимо установить пакет совместимости iptables-nft, так как libvirt может иметь проблемы с nftables.
    • Перейдите в файл конфигурации network.conf и измените бэкенд на iptables:
      firewall_backend = "iptables"
    • После этого снова перезапустите сеть:
      virsh net-destroy default
      virsh net-start default
  3. Проверка конфигурации IP:

    • Проверьте настройки IP на вашей виртуальной машине. Если у вас статическая IP-адресация, убедитесь, что вы используете правильные настройки. Например, IP-адрес должен быть в диапазоне 192.168.122.2 - 192.168.122.254, а маска подсети 255.255.255.0.
    • Если DHCP не работает, попробуйте настроить статическую IP-адресацию на виртуальной машине и убедитесь, что у вас корректный шлюз (192.168.122.1).
  4. Проверка маршрутизации:

    • Убедитесь, что маршруты правильно настроены. Вы можете использовать команду ip r на виртуальной машине, чтобы проверить, правильно ли настроены маршруты для доступа к внешним серверам.
      ip route add default via 192.168.122.1
  5. Проверка доступа к интернету:

    • Попробуйте выполнить пинг на IP-адреса, например, 8.8.8.8, из вашей виртуальной машины. Если пинг проходит, но DNS не работает, возможно, проблема в некорректной настройке DNS. Попробуйте установить DNS-серверы вручную, например, Google DNS:
      • DNS1: 8.8.8.8
      • DNS2: 8.8.4.4

Заключение

Если вы выполните все шаги, приведенные выше, то сможете устранить проблему с отсутствием интернет-соединения в вашей виртуальной машине. Если проблема останется, рекомендуем проверить логи libvirt на наличие ошибок, которые могут помочь диагностировать ситуацию.

Надеюсь, эти рекомендации помогут вам решить вашу проблему. Если у вас возникнут дополнительные вопросы, не стесняйтесь обращаться!

Удачи!

Оцените материал
Добавить комментарий

Капча загружается...