Хост не имеет доступа в интернет, когда работают ВМ.

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

Как настроить сеть, чтобы как хост, так и виртуальные машины могли подключаться к интернету?

Я настроил сервер для хостинга нескольких виртуальных машин с использованием 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.

  1. STP: производитель Fritz!Box подтвердил, что они не поддерживают STP.

  2. Сброшенные пакеты: я пока проигнорирую это, поскольку два ноутбука с Linux (Ubuntu Mate, Lubuntu) показывают примерно одинаковое количество сброшенных пакетов, при этом не имея очевидных проблем с подключением.

  3. Отсутствие доступа в интернет у хоста, похоже, было связано с настройкой 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

Рекомендации:

  1. Включите STP (Spanning Tree Protocol):
    • Измените строку bridge_stp off на bridge_stp on. Это поможет предотвратить возможные петли в сети, которые могут возникать при использовании виртуального моста.

Шаг 2: Конфигурация ConnMan

Вы упомянули, что использование ConnMan может создать конфликты при настройке IP-адресов. Вам необходимо добавить ваши виртуальные интерфейсы в черный список, чтобы ConnMan не управлял ими:

  1. Откройте файл конфигурации connman:

    sudo nano /etc/connman/main.conf
  2. В строку NetworkInterfaceBlacklist добавьте виртуальные интерфейсы, чтобы избежать их автоматической конфигурации:

    NetworkInterfaceBlacklist = vmnet,vboxnet,virbr,ifb,ve-,vb-,br,enp42s0,vnet0,vnet1
  3. Сохраните файл и перезапустите ConnMan:

    sudo systemctl restart connman

Шаг 3: Перезагрузка сетевых интерфейсов

После внесения изменений рекомендуется перезагрузить сетевые интерфейсы или сервер, чтобы обновить конфигурацию:

sudo ifdown br0 && sudo ifup br0

Или, если требуется полная перезагрузка:

sudo reboot

Шаг 4: Проверка состояния

После перезагрузки проверьте ваши сетевые настройки и убедитесь, что хост имеет доступ в интернет и виртуальные машины также правильно подключены:

  1. Проверьте IP-адреса:

    ip a
  2. Протестируйте интернет-доступ:

    ping debian.org

Шаг 5: Отладка

Если после всех изменений проблема остается, выполните следующие команды и предоставьте результаты для дальнейшего анализа:

  1. ip route – проверьте маршруты.
  2. cat /proc/net/dev – проверьте состояние интерфейсов.
  3. journalctl -u connman – посмотрите логи службы ConnMan для выявления ошибок.

Заключение

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

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

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