Вопрос или проблема
Привет, супер-пользователи,
Я пытаюсь настроить интернет-соединение в своей виртуальной машине 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 работает и перенаправляет пакеты как ожидалось, однако брандмауэр не позволяет виртуальному мосту отправлять пакеты к шлюзу по умолчанию?
- Правила nftables (# nft list ruleset): http://0x0.st/Ho6G.txt
- Конфигурация virbr0 (/etc/libvirt/qemu/networks/default.xml): http://0x0.st/Ho6h.txt
- Журнал Libvirt (/var/log/libvirt/libvirtd.log): http://0x0.st/Ho6n.txt
- Конфигурация vnet0 во время работы ВМ (/etc/libvirt/qemu/win10.xml): http://0x0.st/HoIs.txt
Вот что я уже пробовал:
- Установка и включение 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
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. Давайте рассмотрим шаги для устранения этой проблемы.
Шаги для диагностики и исправления проблемы:
-
Проверить настройки
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
- Убедитесь, что служба
-
Проверить настройки брандмауэра:
- Убедитесь, что ваш брандмауэр (например,
nftables
илиiptables
) позволяет трафик между вашей виртуальной сетью и внешним интернетом. Если вы используетеnftables
, возможно, вам необходимо установить пакет совместимостиiptables-nft
, так какlibvirt
может иметь проблемы сnftables
. - Перейдите в файл конфигурации
network.conf
и измените бэкенд наiptables
:firewall_backend = "iptables"
- После этого снова перезапустите сеть:
virsh net-destroy default virsh net-start default
- Убедитесь, что ваш брандмауэр (например,
-
Проверка конфигурации IP:
- Проверьте настройки IP на вашей виртуальной машине. Если у вас статическая IP-адресация, убедитесь, что вы используете правильные настройки. Например, IP-адрес должен быть в диапазоне
192.168.122.2 - 192.168.122.254
, а маска подсети255.255.255.0
. - Если DHCP не работает, попробуйте настроить статическую IP-адресацию на виртуальной машине и убедитесь, что у вас корректный шлюз (
192.168.122.1
).
- Проверьте настройки IP на вашей виртуальной машине. Если у вас статическая IP-адресация, убедитесь, что вы используете правильные настройки. Например, IP-адрес должен быть в диапазоне
-
Проверка маршрутизации:
- Убедитесь, что маршруты правильно настроены. Вы можете использовать команду
ip r
на виртуальной машине, чтобы проверить, правильно ли настроены маршруты для доступа к внешним серверам.ip route add default via 192.168.122.1
- Убедитесь, что маршруты правильно настроены. Вы можете использовать команду
-
Проверка доступа к интернету:
- Попробуйте выполнить пинг на IP-адреса, например,
8.8.8.8
, из вашей виртуальной машины. Если пинг проходит, но DNS не работает, возможно, проблема в некорректной настройке DNS. Попробуйте установить DNS-серверы вручную, например, Google DNS:- DNS1:
8.8.8.8
- DNS2:
8.8.4.4
- DNS1:
- Попробуйте выполнить пинг на IP-адреса, например,
Заключение
Если вы выполните все шаги, приведенные выше, то сможете устранить проблему с отсутствием интернет-соединения в вашей виртуальной машине. Если проблема останется, рекомендуем проверить логи libvirt
на наличие ошибок, которые могут помочь диагностировать ситуацию.
Надеюсь, эти рекомендации помогут вам решить вашу проблему. Если у вас возникнут дополнительные вопросы, не стесняйтесь обращаться!
Удачи!