Настройка сетевых подключений виртуальных машин#

Чтобы ВМ могли подключаться по сети к хосту, к другим ВМ на том же хосте и к устройствам во внешней сети, необходимо соответствующим образом настроить сетевое взаимодействие. Для обеспечения сетевого взаимодействия ВМ у гипервизора ОС SberLinux OS Server и создаваемых ВМ есть сетевая конфигурация по умолчанию.

Конфигурацию по умолчанию можно настроить дополнительно, например:

  • разрешить обнаружение ВМ на хосте и подключение к ним из местоположений за пределами хоста. Как если бы ВМ находились в той же сети, что и хост;

  • частично или полностью изолировать ВМ от входящего сетевого трафика, чтобы повысить ее безопасность и свести к минимуму риск возникновения каких-либо проблем, влияющих на хост.

Принцип работы виртуальных сетей#

Подключение ВМ к другим устройствам и локациям в сети должно поддерживаться аппаратным обеспечением хоста.

Виртуальная сеть использует концепцию виртуального сетевого коммутатора. Виртуальный сетевой коммутатор — это программная конструкция, работающая на хосте, через который ВМ подключаются к сети. Основываясь на конфигурации виртуального коммутатора, ВМ может использовать существующую виртуальную сеть, управляемую гипервизором, или другой метод сетевого подключения.

С точки зрения гостевой ОС виртуальное сетевое подключение то же самое, что физическое сетевое подключение. Хосты рассматривают виртуальные сетевые коммутаторы как сетевые интерфейсы. Сетевой интерфейс virbr0 для ВМ по умолчанию создается при первой установке и запуске службы virtnetworkd.

Примечание

Для просмотра информации о сетевом интерфейсе по умолчанию используйте утилиту ip:

ip addr show virbr0

Пример вывода команды:

3: virbr0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state
UNKNOWN link/ether 1b:c4:94:cf:fd:17 brd ff:ff:ff:ff:ff:ff
inet <IP_address>/24 brd <IP_address> scope global virbr0

По умолчанию все ВМ на одном хосте подключены к одной и той же виртуальной сети типа NAT под названием default, которая использует интерфейс virbr0.

Для базового исходящего сетевого доступа со стороны ВМ обычно не требуется дополнительная настройка сети, потому что сеть по умолчанию устанавливается вместе с пакетом libvirt-daemon-config-network и автоматически запускается при запуске службы virtnetworkd.

Если требуется другая функциональность, можно создать дополнительные виртуальные сети и сетевые интерфейсы и настроить ВМ их использовать. В дополнение к NAT по умолчанию, эти сети и интерфейсы могут быть настроены на использование одного из следующих режимов:

  • режим маршрутизации;

  • режим моста;

  • изолированный режим;

  • открытый режим.

Когда служба virtnetworkd впервые устанавливается на хост, она содержит начальную конфигурацию виртуальной сети в режиме преобразования сетевых адресов (NAT). По умолчанию все ВМ на хосте подключены к одной и той же виртуальной сети libvirt под названием default. ВМ в этой сети могут подключаться к местоположениям как на хосте, так и в сети за пределами хоста, но со следующими ограничениями:

  • ВМ в сети видны хосту и другим ВМ на хосте, но на сетевой трафик влияют брандмауэры в сетевом стеке гостевой ОС и правила фильтрации сети libvirt, прикрепленные к гостевому интерфейсу.

  • ВМ в сети могут подключаться к местам за пределами хоста, но не видны им. На исходящий трафик влияют правила NAT, а также брандмауэр хоста.

Рекомендуемые сетевые конфигурации виртуальных машин#

Во многих сценариях достаточно конфигурации сети ВМ по умолчанию. Если конфигурацию требуется дополнительно настроить, используйте интерфейс командной строки (CLI).

Настройка внешнего доступа к виртуальным машинам с помощью интерфейса командной строки#

По умолчанию вновь созданная ВМ подключается к сети типа NAT, которая использует интерфейс virbr0 – виртуальный мост по умолчанию на хосте. ВМ в данном случае может использовать контроллер сетевого интерфейса (NIC) хоста для подключения к внешним сетям, но остается недоступной для них.

Если требуется, чтобы ВМ отображалась в той же внешней сети, что и гипервизор, нужно использовать режим моста. Для этого подключите ВМ к сетевому мосту, подключенному к физическому сетевому устройству гипервизора.

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

  • ВМ с настройкой NAT по умолчанию выключена;

  • настроена IP-конфигурация гипервизора. Конфигурация зависит от сетевого подключения хоста. Например, IP-адрес гипервизора может рассматриваться как интерфейс Ethernet, то есть хост подключен к сети с помощью кабеля Ethernet, а физическому NIC хоста статический IP-адрес назначается по MAC-адресу DHCP-сервером.

    Чтобы получить IP-конфигурацию интерфейса Ethernet, используйте утилиту ip addr:

    ip addr
    

    Пример вывода команды:

    [...]
    enp0s25: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
       link/ether 54:ee:75:49:dc:46 brd ff:ff:ff:ff:ff:ff
       inet <IP_address>/24 brd <IP_address> scope global dynamic noprefixroute enp0s25
    

Для настройки внешнего доступа к виртуальным машинам выполните следующий сценарий:

  1. Создайте и настройте соединение посредством моста для физического интерфейса на хосте.

    Внимание

    В сценарии, где используется статическое назначение IP, нужно переместить настройку IPv4 физического интерфейса Ethernet на интерфейс моста.

  2. Измените сеть ВМ, чтобы использовать созданный интерфейс моста:

    virt-xml <example-vm> --edit --network bridge=bridge0
    

    Команда устанавливает <example-vm> для использования интерфейса моста bridge0.

    Пример вывода команды:

    Domain '<example-vm>' defined successfully.
    
  3. Запустите ВМ:

    virsh start <example-vm>
    
  4. В гостевой ОС настройте параметры IP и DHCP сетевого интерфейса системы таким образом, чтобы ВМ была другой физической системой в той же сети, что и гипервизор.

    Внимание

    Конкретные действия для этого шага будут отличаться в зависимости от гостевой ОС, используемой ВМ.

Для проверки внешнего доступа к виртуальным машинам выполните следующие шаги:

  1. Убедитесь, что недавно созданный мост запущен и содержит как физический интерфейс хоста, так и интерфейс ВМ:

    ip link show master bridge0
    

    Пример вывода команды:

    2: enp0s25: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel master bridge0 state UP mode DEFAULT group default qlen 1000
       link/ether 54:ee:75:49:dc:46 brd ff:ff:ff:ff:ff:ff
    10: vnet0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel master bridge0 state UNKNOWN mode DEFAULT group default qlen 1000
       link/ether fe:54:00:89:15:40 brd ff:ff:ff:ff:ff:ff
    
  2. Убедитесь, что ВМ отображается в той же внешней сети, что и гипервизор:

    1. В гостевой ОС получите сетевой идентификатор системы. Например, если гостевая ОС – Linux:

      ip addr
      

      Пример вывода команды:

      [...]
      enp0s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
          link/ether 52:54:00:09:15:46 brd ff:ff:ff:ff:ff:ff
          inet <IP_address>/24 brd <IP_address> scope global dynamic noprefixroute enp0s0
      
    2. Из внешней системы, подключенной к локальной сети, подключитесь к ВМ, используя полученный идентификатор:

      ssh root@<IP_address>
      

      Пример вывода команды, включая запрос пароля пользователя:

      root@<IP_address>'s password:
      Last login: Mon Sep 24 12:05:36 2019
      root~#*
      

Работающее соединение означает, что сеть была успешно настроена.

Устранение ошибок#

В некоторых ситуациях использование режима моста для обеспечения доступности ВМ во внешних сетях невозможно.

Чтобы обойти эту проблему, установите NAT-соединение с помощью nftables для ВМ.

Дополнительная информация

Дополнительную информацию можно найти в разделах «Виртуальная сеть в режиме моста» и «База знаний» → «Утилита nft».

Типы сетевых подключений виртуальных машин#

Чтобы изменить сетевые свойства и поведение ВМ, требуется изменить тип виртуальной сети или интерфейс, который используют ВМ.

Виртуальная сеть с трансляцией сетевых адресов#

По умолчанию виртуальные сетевые коммутаторы работают в режиме трансляции сетевых адресов (NAT). Они используют маскирование IP, а не Source-NAT (SNAT) или Destination-NAT (DNAT). Маскирование IP позволяет подключенным ВМ использовать IP-адрес хоста для связи с любой внешней сетью. Когда виртуальный сетевой коммутатор работает в режиме NAT, компьютеры, внешние по отношению к хосту, не могут взаимодействовать с ВМ внутри хоста.

Важно

Виртуальные сетевые коммутаторы используют NAT, настроенный правилами брандмауэра. Редактирование этих правил во время работы коммутатора не рекомендуется, так как неправильные правила могут привести к тому, что с коммутатором нельзя будет связаться.

Виртуальная сеть в режиме маршрутизации#

При использовании режима маршрутизации виртуальный коммутатор подключается к физической локальной сети, подключенной к хосту, передавая трафик туда и обратно без использования NAT. Виртуальный коммутатор может исследовать весь трафик и использовать информацию, содержащуюся в сетевых пакетах, для принятия решений о маршрутизации. При использовании этого режима ВМ находятся в одной подсети, отдельной от хоста. Подсеть ВМ маршрутизируется через виртуальный коммутатор, который существует на хосте. Это позволяет совершать входящие соединения, но требует дополнительных записей в таблице маршрутизации для систем во внешней сети.

Режим маршрутизации использует маршрутизацию на основе IP-адреса.

Распространенной топологией, которая использует режим маршрутизации, является хостинг виртуальных серверов (VSH). У провайдера VSH может быть несколько хостов, каждый из которых имеет два физических сетевых подключения. Один интерфейс используется для управления и учета, другой для подключения ВМ. Каждая ВМ имеет свой собственный публичный IP-адрес, но хосты используют частные IP-адреса, чтобы только внутренние администраторы могли управлять ВМ.

Виртуальная сеть в режиме моста#

В большинстве сетевых режимов ВМ автоматически создают соединение и подключаются к виртуальному мосту virbr0. В режиме моста ВМ подключается к существующему мосту Linux на хосте. В результате ВМ напрямую видна в физической сети. Это позволяет осуществлять входящие соединения, но не требует дополнительных записей в таблице маршрутизации.

Режим моста использует переключение соединений на основе MAC-адреса.

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

Соединение по сети в режиме моста#

На гипервизоре можно использовать несколько интерфейсов физического моста, соединив их между собой. Данная связь может быть добавлена к мосту, после чего ВМ также могут быть добавлены к мосту. Однако драйвер связи имеет несколько режимов работы, и не все из этих режимов работают с мостом, где используются ВМ.

Мониторинг медиа-независимого интерфейса (MII) должен использоваться для мониторинга режимов связи интерфейсов физического моста, так как мониторинг Address Resolution Protocol (ARP) работает неправильно.

Наиболее распространенные варианты использования режима моста включают в себя:

  • Развертывание ВМ в существующей сети рядом с хостами. В этом случае разница между виртуальными и физическими машинами невидима для конечного пользователя.

  • Развертывание ВМ без каких-либо изменений в существующих настройках конфигурации физической сети.

  • Развертывание ВМ, которые должны быть легко доступны из существующей физической сети. ВМ размещаются в физической сети, где они должны получить доступ к службам DHCP.

  • Подключение ВМ к существующей сети, где используются виртуальные локальные сети (VLAN).

  • Сеть демилитаризованной зоны (DMZ). Для развертывания DMZ с ВМ следует настроить DMZ на физическом сетевом маршрутизаторе и коммутаторах, а также подключить ВМ к физической сети с помощью режима моста.

Дополнительную информацию можно найти в разделе «Настройка внешнего доступа к виртуальным машинам с помощью интерфейса командной строки».

Виртуальная сеть в изолированном режиме#

При использовании изолированного режима ВМ, подключенные к виртуальному коммутатору, могут взаимодействовать друг с другом и хостом, но их трафик не будет выходить за пределы хоста, и они не могут принимать трафик из-за его пределов. Использование dnsmasq в этом режиме необходимо для базовой функциональности, такой как DHCP.

Виртуальная сеть в открытом режиме#

При использовании открытого режима для сети libvirt не генерирует никаких правил брандмауэра для сети. В результате libvirt не перезаписывает правила брандмауэра, предоставляемые хостом, и поэтому пользователь может вручную управлять правилами брандмауэра ВМ.

Сравнение типов подключений к виртуальной машине#

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

Тип подключения

Подключение к хосту

Подключение к другим ВМ на хосте

Подключение к внешним локациям

Видимость из внешних локаций

Режим моста

ДА

ДА

ДА

ДА

NAT

ДА

ДА

ДА

нет

Режим маршрутизации

ДА

ДА

ДА

ДА

Изолированный режим

ДА

ДА

нет

нет

Открытый режим

Зависит от правил брандмауэра хоста

Зависит от правил брандмауэра хоста

Зависит от правил брандмауэра хоста

Зависит от правил брандмауэра хоста

Загрузка виртуальных машин с сервера PXE#

ВМ, использующие среду выполнения предварительной загрузки – Preboot Execution Environmen(PXE), могут загружаться и подгружать свою конфигурацию из сети. Для загрузки ВМ с сервера PXE в виртуальной сети или сети в режиме моста можно использовать libvirt.

Внимание

Сценарии ниже приведены только в качестве примера. Перед тем, как их использовать, убедитесь, что все необходимые данные имеют резервны копии.

Настройка загрузочного сервера PXE в виртуальной сети#

Сценарий ниже описывает, как настроить виртуальную сеть libvirt для обеспечения PXE. Это позволяет настроить ВМ на хосте для загрузки из загрузочного образа, доступного в виртуальной сети.

Для выполнения шагов сценария требуются:

  • локальный сервер PXE (DHCP и TFTP), например:

    • внутренний сервер libvirt;

    • вручную настроенные dhcpd и tftpd;

    • dnsmasq;

    • сервер Cobbler;

  • загрузочные образы PXE, такие, как PXELINUX, настроенные Cobbler или вручную.

Для настройки загрузочного сервера PXE выполните следующий сценарий:

  1. Поместите загрузочные образы и конфигурацию PXE в папку /var/lib/tftpboot.

  2. Установите разрешения на каталог:

    chmod -R a+r /var/lib/tftpboot
    
  3. Установите владельца каталога:

    chown -R nobody: /var/lib/tftpboot
    
  4. Обновите контекст SELinux:

    chcon -R --reference /usr/sbin/dnsmasq /var/lib/tftpboot
    
    chcon -R --reference /usr/libexec/libvirt_leaseshelper /var/lib/tftpboot
    
  5. Отключите виртуальную сеть:

    virsh net-destroy default
    
  6. Откройте файл конфигурации виртуальной сети в редакторе по умолчанию:

    virsh net-edit default
    
  7. Отредактируйте элемент <ip>, чтобы включить соответствующий адрес, маску сети, диапазон DHCP-адресов и загрузочный файл:

    <ip address='<IP_address>' netmask='<IP_address>'>
       <tftp root='/var/lib/tftpboot'/>
       <dhcp>
          <range start='<IP_address>' end='<IP_address>' />
          <bootp file='example-pxelinux'/>
       </dhcp>
    </ip>
    

    Где example-pxelinux - это имя файла загрузочного образа.

  8. Запустите виртуальную сеть:

    virsh net-start default
    
  9. Опционально. Убедитесь, что виртуальная сеть default активна с помощью команды:

    virsh net-list
    

    Пример вывода команды:

    Name             State    Autostart   Persistent
    ---------------------------------------------------
    default          active   no          no
    

Загрузка виртуальных машин с использованием PXE и виртуальной сети#

Чтобы загрузить ВМ с сервера PXE, доступного в виртуальной сети, необходимо включить загрузку PXE.

Перед загрузкой настройте загрузочный сервер PXE в виртуальной сети, следуя инструкциям в разделе «Настройка загрузочного сервера PXE в виртуальной сети».

Для загрузки ВМ с использованием PXE выполните следующий сценарий:

Создайте новую ВМ с включенной загрузкой PXE:

virt-install --pxe --network network=default --memory 2048 --vcpus 2 --disk size=10

Команда выше создаст новый файл образа qcow2 объемом 10 ГБ из PXE, доступной в виртуальной сети default.

В качестве альтернативы можно вручную отредактировать XML-файл конфигурации существующей ВМ:

  1. Убедитесь, что элемент <os> имеет внутри элемент <boot dev=«network'/>:

    <os>
       <type arch='x86_64' machine='pc-i440fx-<os>'>hvm</type>
       <boot dev='network'/>
       <boot dev='hd'/>
    </os>
    

    Где <os> в строке <type arch='x86_64' machine='pc-i440fx-<os>'>hvm</type> – используемая ОС.

  2. Убедитесь, что гостевая сеть настроена на использование вашей виртуальной сети:

    <interface type='network'>
       <mac address='52:54:00:66:79:14'/>
       <source network='default'/>
       <target dev='vnet0'/>
       <alias name='net0'/>
       <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>
    </interface>
    

Для проверки сценария запустите ВМ с помощью команды virsh start. Если PXE настроен правильно, ВМ запустится из загрузочного образа, доступного на сервере PXE.

Загрузка виртуальных машин с использованием PXE и сети в режиме моста#

Чтобы загрузить ВМ с сервера PXE, доступного в режиме моста, требуется включить загрузку PXE.

Перед загрузкой убедитесь, что:

  • включен режим моста;

  • загрузочный сервер PXE доступен в сети в режиме моста.

Для загрузки ВМ с использованием PXE выполните следующий сценарий:

Создайте новую ВМ с включенной загрузкой PXE:

virt-install --pxe --network bridge=breth0 --memory 2048 --vcpus 2 --disk size=10

Команда создаст новый файл образа qcow2 на 10 ГБ из PXE, доступного в сети в режиме моста breth0.

В качестве альтернативы, можно вручную отредактировать XML-файл конфигурации существующей ВМ:

  1. Убедитесь, что элемент <os> содержит внутри элемент <boot dev=«network'/>:

    <os>
       <type arch='x86_64' machine='pc-i440fx-<os>'>hvm</type>
       <boot dev='network'/>
       <boot dev='hd'/>
    </os>
    
  2. Убедитесь, что ВМ настроена на использование сети в режиме моста:

    <interface type='bridge'>
       <mac address='52:54:00:5a:ad:cb'/>
       <source bridge='breth0'/>
       <target dev='vnet0'/>
       <alias name='net0'/>
       <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>
    </interface>
    

Для проверки сценария запустите ВМ с помощью команды virsh start. Если PXE настроен правильно, ВМ запустится из загрузочного образа, доступного на сервере PXE.

Настройка passt-соединения#

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

Примечание

passt – это непривилегированное сетевое подключение в пользовательском режиме для ВМ.

Перед настройкой passt-соединения убедитесь, что пакет passt установлен в системе.

Примечание

Если пакет не установлен, установите его командой:

dnf install passt

Для настройки passt-соединения выполните следующий сценарий:

  1. Откройте XML-конфигурацию ВМ, на которой вы хотите использовать passt-соединение:

    virsh edit <example-vm>
    

    Где <example-vm> – имя ВМ.

  2. В разделе <devices> добавьте элемент <interface type=«user»>, который использует passt:

    <devices>
      [...]
      <interface type='user'>
        <backend type='passt'/>
      </interface>
    </devices>
    

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

    Дополнительно при использовании passt можно указать несколько элементов <portForward> для перенаправления входящего сетевого трафика для хоста на интерфейс ВМ.

    Для этого настройте IP-адреса интерфейса:

    <devices>
      [...]
      <interface type='user'>
        <backend type='passt'/>
        <mac address="52:54:00:98:d8:b7"/>
        <source dev='eth0'/>
        <ip family='ipv4' address='<IP_address>' prefix='24'/>
        <ip family='ipv6' address='::ffff:c000:201'/>
        <portForward proto='tcp'>
          <range start='2022' to='22'/>
        </portForward>
        <portForward proto='udp' address='<IP_address>'>
           <range start='5000' end='5020' to='6000'/>
           <range start='5010' end='5015' exclude='yes'/>
        </portForward>
        <portForward proto='tcp' address='2001:db8:ac10:fd01::1:10' dev='eth0'>
          <range start='8080'/>
          <range start='4433' to='3444'/>
        </portForward>
      </interface>
    </devices>
    

    Конфигурация выше устанавливает passt-соединение со следующими параметрами:

    • ВМ копирует сетевые маршруты для перенаправления трафика из интерфейса хоста eth0.

    • В сетевых настройках MAC установлен на 52:54:00:98:d8:b7. Если не установлен, будет сгенерирован случайный адрес.

    • Адрес IPv4 установлен на <IP_address>/24, а адрес IPv6 - на ::ffff:c000:201.

    • TCP-порт 2022 на хосте перенаправляет сетевой трафик на порт 22 на ВМ.

    • TCP-адрес 2001:db8:ac10:fd01:1:10 на интерфейсе хоста eth0 и порту 8080 перенаправляет сетевой трафик на порт 8080 на ВМ. Порт 4433 перенаправлен на порт 3444 на ВМ.

    • UDP-адрес <IP_address> и порты 5000 - 5009 и 5016 - 5020 на хосте перенаправляют свой сетевой трафик на порты 6000 - 6009 и 6016 - 6020 на ВМ.

  3. Сохраните конфигурацию XML.

  4. Опционально. Запустите или перезапустите ВМ, настроенную с passt:

    virsh reboot <example-vm>
    
    virsh start <example-vm>
    

    Если ВМ загрузилась успешно,passt-соединение настроено.

Информацию по увеличению производительности ВМ можно найти в разделе «Управление виртуальными машинами» → «Управление устройствами SR-IOV».