Вопрос или проблема
Как настроить сеть, чтобы как хост, так и виртуальные машины могли подключаться к интернету?
Я настроил сервер для хостинга нескольких виртуальных машин с использованием KVM. Он предназначен для обслуживания библиотеки загружаемых книг для слепых людей (подробности ниже).
Текущее состояние является результатом попыток следовать ряду учебных пособий по сетям для виртуальных машин. Цель состоит в том, чтобы обеспечить доступ в интернет как для хоста, так и для ВМ.
Как хост, так и гости работают под управлением Debian 10. Сетевая карта настроена как сетевой мост br0 с статическим адресом (файл ‘interfaces’ см. ниже).
В настоящее время ВМ запускаются вручную с помощью virsh. Когда никакие ВМ не работают, хост имеет доступ в интернет (например, ping debian.org, установка обновлений, wget …).
После запуска ВМ у нее есть доступ в интернет через br0. Каждая ВМ имеет статический адрес. При этом хост теряет доступ в интернет. Можно пинговать другие машины в локальной сети, а также маршрутизатор, но не за ее пределами (пинг доменного имени или IP-адреса).
Как хост, так и ВМ можно достичь с помощью ssh с других локальных машин.
Когда ВМ настроены на автозапуск, больше невозможно обновлять без ручной остановки ВМ, также хост не подключается к серверу времени. Кроме того, ip показывает сброшенные пакеты.
Вероятно, все это является результатом моего крайне ограниченного понимания сетей и мостов в частности. Я буду очень признателен за любую помощь!
Вот дополнительная информация.
Цель
Одна ВМ должна обслуживать пользователя из внешней сети, используя веб-сервер NginX. Она обрабатывает загрузку книг, которые были взяты пользователями и хранятся на локальном диске.
Вторая ВМ предоставляет сервер базы данных PostgreSQL, к которому можно получить доступ только с локальных рабочих станций, где администрируются пользователи библиотеки и выдачи книг.
Хост должен быть доступен по ssh из локальной сети. Доступ в интернет необходим для подключения к серверу времени и для возможности обновления программного обеспечения.
ПК
Материнская плата: MSI MPG B550 GAMING PLUS
Процессор: AMD Ryzen™ 7 3700X
ОЗУ: Corsair DIMM 32 GB DDR4-3200 Kit
Жесткий диск: Samsung 980 PRO 1 TB, SSD
Видеокарта: MSI GeForce GT 710 1GD3H LP
ОС
uname -r
4.19.0-17-amd64
lsb_release -a
Нет доступных модулей LSB.
ID дистрибьютора: Debian
Описание: Debian GNU/Linux 10 (buster)
Версия: 10
Кодовое имя: buster
Сеть
Пока сервер не будет перенесен в библиотеку, он находится в моем домашнем офисе и подключен к маршрутизатору AVM Fritz!Box 7490.
ls /sys/class/net/
br0 enp42s0 lo
cat /etc/network/interfaces
# Этот файл описывает сетевые интерфейсы, доступные в вашей системе
# и как их активировать. Для получения дополнительной информации смотрите interfaces(5).
source /etc/network/interfaces.d/*
# Интерфейс сетевого заloop
auto lo
iface lo inet loopback
# Основной сетевой интерфейс
iface enp42s0 inet manual
# Настройки моста br0
auto br0
iface br0 inet static
bridge_ports enp42s0
address 192.168.10.50
network 192.168.10.0
broadcast 192.168.10.255
netmask 255.255.255.0
gateway 192.168.10.1
dns-nameservers 94.247.43.254 194.36.144.87 192.168.10.1
bridge_stp off
bridge_fd 0
bridge_maxwait 0
(ВМ имеют адреса 192.168.10.51, 192.168.10.52)
ip -s link show dev br0
3: br0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP mode DEFAULT group default qlen 1000
link/ether 2c:f0:5d:e4:36:d5 brd ff:ff:ff:ff:ff:ff
RX: bytes packets errors dropped overrun mcast
206602 2218 0 1130 0 177
TX: bytes packets errors dropped carrier collsns
99981 593 0 0 0 0
cat /proc/net/dev
Интер-| Получить | Передать
фейс | байты пакеты ошибки сброс fifo кадр сжатый мультикаст| байты пакеты ошибки сброс fifo коллсн узел сжатый
br0: 210026 2268 0 1138 0 0 0 177 103273 615 0 0 0 0 0 0
vnet0: 1384510 18903 0 0 0 0 0 0 58389276 40523 0 0 0 0 0 0
lo: 1840 26 0 0 0 0 0 0 1840 26 0 0 0 0 0 0
enp42s0: 58580534 42260 0 38 0 0 0 289 1467123 19358 0 0 0 0 0 0
route -n
Таблица маршрутов IP кернела
Цель Маршрутизатор Маска сети Флаги Метрика Ссылка Использовать Интерфейс
0.0.0.0 0.0.0.0 0.0.0.0 U 0 0 0 vnet0
0.0.0.0 192.168.10.1 0.0.0.0 UG 0 0 0 br0
169.254.0.0 0.0.0.0 255.255.0.0 U 0 0 0 vnet0
192.168.10.0 0.0.0.0 255.255.255.0 U 0 0 0 br0
ls /sys/class/net/
br0 enp42s0 lo vnet0
Ваш мост сбрасывает половину входящих пакетов! Удивительно, что у вас есть возможность подключения.
Я вижу только одну очевидную проблему в вашей конфигурации, и, к сожалению, это плохо выбранный стандарт Debian:
bridge_stp off
STP действительно должен быть включен для любого виртуального моста, используемого libvirt или для ВМ. Это слишком просто создать петлю случайно или намеренно. Это также означает, что он должен быть включен на вашем Fritz!Box, но он, скорее всего, уже включен. То же самое касается любого коммутатора, к которому вы его подключаете в библиотеке, но опять же, скорее всего, там уже включен STP.
-
STP: производитель Fritz!Box подтвердил, что они не поддерживают STP.
-
Сброшенные пакеты: я пока проигнорирую это, поскольку два ноутбука с Linux (Ubuntu Mate, Lubuntu) показывают примерно одинаковое количество сброшенных пакетов, при этом не имея очевидных проблем с подключением.
-
Отсутствие доступа в интернет у хоста, похоже, было связано с настройкой connman для IP-адреса vnets через DHCP.
после запуска ВМ:
PING debian.org (130.89.148.77) 56(84) байт данных.
От blibu.local (169.254.210.100) icmp_seq=1 Следующий хост недоступен
ip a дал следующий вывод (вырезка)
3: br0: ... inet 192.168.10.50/24
4: vnet0: ... inet 169.254.210.100/16
Таким образом, ping использовал vnet0 с адресом, отличающимся от локального адресного пространства.
После проб различных подходов (вторая сетевая карта, macvtap) с таким же результатом, я в конце концов вспомнил, что нужно добавить все vnets в /etc/connman/main.conf:
NetworkInterfaceBlacklist = vmnet,vboxnet,virbr,ifb,ve-,vb-,br,enp42s0,eno1,vnet0,vnet1,vnet2
Похоже, каждая запущенная ВМ добавляет один vnet.
Это, вероятно, не самое элегантное или эффективное решение, и я буду очень признателен за любую помощь в улучшении моей настройки.
Тем не менее, теперь у хоста и всех ВМ есть доступ в интернет и возможность получить обновления программного обеспечения.
🙂
Отредактируйте /etc/connman/main.conf, чтобы предотвратить конфигурацию интерфейса Connman. Это произошло со мной после обновления рабочей конфигурации с bullseye до bookworm. Не уверен, что сдерживало Connman до этого, но после обновления я исправил это, добавив мой виртуальный интерфейс в NetworkInterfaceBlacklist в /etc/connman/main.conf :
NetworkInterfaceBlacklist = vnet,vmnet,vboxnet,virbr,ifb,ve-,vb-
Ответ или решение
Если у вас возникли проблемы с отсутствием доступа в интернет на хосте, когда работают виртуальные машины (VM) с использованием KVM, следуйте данной пошаговой инструкции для устранения проблемы. Мы постараемся решить ее, основываясь на предоставленной информации о вашей конфигурации сети.
Шаг 1: Проверка конфигурации сетевого моста
Судя по вашему файлу конфигурации /etc/network/interfaces
, настройка моста (br0
) выглядит следующим образом:
auto br0
iface br0 inet static
bridge_ports enp42s0
address 192.168.10.50
network 192.168.10.0
broadcast 192.168.10.255
netmask 255.255.255.0
gateway 192.168.10.1
dns-nameservers 94.247.43.254 194.36.144.87 192.168.10.1
bridge_stp off
bridge_fd 0
bridge_maxwait 0
Рекомендации:
- Включите STP (Spanning Tree Protocol):
- Измените строку
bridge_stp off
наbridge_stp on
. Это поможет предотвратить возможные петли в сети, которые могут возникать при использовании виртуального моста.
- Измените строку
Шаг 2: Конфигурация ConnMan
Вы упомянули, что использование ConnMan может создать конфликты при настройке IP-адресов. Вам необходимо добавить ваши виртуальные интерфейсы в черный список, чтобы ConnMan не управлял ими:
-
Откройте файл конфигурации
connman
:sudo nano /etc/connman/main.conf
-
В строку
NetworkInterfaceBlacklist
добавьте виртуальные интерфейсы, чтобы избежать их автоматической конфигурации:NetworkInterfaceBlacklist = vmnet,vboxnet,virbr,ifb,ve-,vb-,br,enp42s0,vnet0,vnet1
-
Сохраните файл и перезапустите ConnMan:
sudo systemctl restart connman
Шаг 3: Перезагрузка сетевых интерфейсов
После внесения изменений рекомендуется перезагрузить сетевые интерфейсы или сервер, чтобы обновить конфигурацию:
sudo ifdown br0 && sudo ifup br0
Или, если требуется полная перезагрузка:
sudo reboot
Шаг 4: Проверка состояния
После перезагрузки проверьте ваши сетевые настройки и убедитесь, что хост имеет доступ в интернет и виртуальные машины также правильно подключены:
-
Проверьте IP-адреса:
ip a
-
Протестируйте интернет-доступ:
ping debian.org
Шаг 5: Отладка
Если после всех изменений проблема остается, выполните следующие команды и предоставьте результаты для дальнейшего анализа:
ip route
– проверьте маршруты.cat /proc/net/dev
– проверьте состояние интерфейсов.journalctl -u connman
– посмотрите логи службы ConnMan для выявления ошибок.
Заключение
Эти шаги помогут вам настроить сеть, чтобы как хост, так и виртуальные машины имели доступ к интернету. Если возникнут дополнительные проблемы, не стесняйтесь задавать вопросы или забрасывайте дополнительную информацию для дальнейшей диагностики.