Настройка сети Ubuntu Linux для работы с системой виртуализации KVM/QEMU

    Общий рейтинг статьи: 4 (проголосовало 1 )
    Опубликовано:  [просмотров 335]


    В первой статье "Запуск простой машины KVM/QEMU напрямую из консоли", мы рассмотрели вопросы создания и запуска простой виртуальной машины. Эта виртуальная машина не имела сетевых интерфейсов и мы обещали в следующих статьях цикла подробно рассмотреть работу с виртуальными сетевыми интерфейсами, чем сейчас и займемся.

    Для работы с виртуальными машинами KVM/QEMU существует для варианта взаимодействия:

    • Первый это работа напрямую с механизмами qemu-system-x86_64 
    • Второй это работа через библиотеку прослойку libvirt

    Мы будем рассматривать именно второй вариант как наиболее распространенный на практике и стоит отметить, что для работы с механизмами libvirt существует несколько удобных приложений рабочего стола и web-интерфейсов управления. За работу прослойки libvirt необходимо установить дополнительный пакет:

    # aptitude install libvirt-daemon

    Это виртуальный пакет включающий помимо описанных в первой части статьи пакетов дополнительно пакет bridge-utils для работы с сетевыми мостами. Сетевые мосты это удобный метод создания как виртуальных интерфейсов для внутреннего взаимодействия виртуальных машин, так и для построения шлюза в интернет или доступа к физической сети.

    Немного отвлекемся и настроим lib-virt для полноценной работы.

    Локальный доступ к libvirt

    После установки необходимых пакетов libvirt-демон может принимать команды управления локально используя для взаимодействия с программой управления socket-файл и следовательно вам необходимо добавить локального непривилегированного пользователя (который будет управлять узлом виртуализации) в группу libvirtd, для чего выполните команду:

    # usermod -a -G libvirtd chernousov

    Сетевой доступ к Libvirt

    Для предоставления сетевого доступа к управлению узлом виртуализации вам потребуется внести несколько изменений в конфигурационные файлы и создать виртуального пользователя (для удаленного управления узлом виртуализации). 

    Измените файл /etc/default/libvirt-bin, добавив или изменив параметр:

    libvirtd_opts="-l"

    Это глобальная опция разрешающая работу по протоколу TCP. Дополнительно отредактируйте файл /etc/libvirt/libvirtd.conf приведя его опции в соответствие:

    listen_tls = 0listen_tcp = 1tcp_port = "16509"listen_addr = "0.0.0.0"

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

    После перезапуска демона libvirt-bin командой:

    # service libvirt-bin restart

    Создадим виртуального пользователя и назначим ему пароль, для чего установите пакет sasl2-bin:

    # apt install sasl2-bin

    И выполните команду:

    # saslpasswd2 -a libvirt virtman

    Теперь вы можете использовать пользователя virtman и заданный пароль для удаленного управления фермой виртуализации.

    Настройка сетевой подсистемы KVM/QEMU при помощи libvirt

    Возвращаемся к вопросам настройки сетевой подсистемы KVM/QEMU и сразу хотелось бы обратить ваше внимание, на то, что для управления конфигурацией используется внешняя утилита управления, а конфигурационные файлы имеют XML-формат, ручная правка конфигурационных файлов не допускается.

    Для получения сведений о текущих настройка сети на хосте виртуализации используется команда:

    # virsh net-list --all

    virsh - это и есть утилита для настройки и правления виртуальными машинами KVM/QEMU (дополнительно может управлять еще несколькими системами виртуализации выступая прослойкой и предоставляя единый API). 

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

    # virsh net-dumpxml default

    Рассмотрим конфигурацию сети подробнее:

    <network>  <name>default</name>  <uuid>9e616255-6346-49b8-93ff-9a3387fd290f</uuid>  <forward mode='nat'/>  <bridge name='virbr0' stp='on' delay='0'/>  <mac address='52:54:00:62:c6:87'/>  <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>

    Данная конфигурация создает DHCP-пул адресов для доступа виртуальных машин к локальной сети в интернет. Для простого "домашнего" использования такая схема подойдет, но для крупных реализаций нам потребуется другая модель работы. Мы рассмотрим пример продакшн-схемы которая используется у нас.

    Первым делом удалим конфигурацию сети default командой:

    # virsh net-undefine default

    Переопределим конфигурацию сети Ubuntu Linux в режим с двумя сетевыми мостами:

    • net-internal - сетевой мост во внутреннюю сеть связанный с реальным сетевым интерфейсом
    • net-virtual - виртуальная сеть не имеющая доступа к локальной сети компании, но имеющая доступ в интернет и собственную внутреннюю IP-адресацию.

    Для создания требуемой конфигурации сетевых интерфейсов необходимо внести следующие изменения в файл /etc/network/interfaces.

    Сеть net-internal представляет собой сетевой мост к интерфейсу enp4s0 (в вашем случае имя интерфейса может быть другим):

    auto loiface lo inet loopback
    auto net-internaliface net-internal inet static        address 192.168.3.221        netmask 255.255.255.0        gateway 192.168.3.1        dns-nameservers 8.8.8.8        bridge_ports enp4s0        bridge_fd 9        bridge_hello 2        bridge_maxage 12        bridge_stp off

    Виртуальная сеть net-vitrual представляет собой сетевой мост без включенных в него интерфейсов (но с назначенным сетевым адресом) и описывается конструкцией вида:

    auto net-virtualiface net-virtual inet static
            address 10.254.254.1
            netmask 255.255.255.0
            bridge_ports none
            bridge_stp off
            bridge_fd 0
            bridge_maxwait 0

    Естественно, что для работы маршрутизации трафика потребуется включить режим forward в ядре, для чего в файле /etc/sysctl.conf необходимо активировать опцию:

    net.ipv4.ip_forward=1

    Если вы проводите операции на рабочей станции где за управление сетевыми интерфейсами отвечает network-manager, вам потребуется отключить эту службу во избежание конфликтов и в дальнейшем проводить все сетевые настройки вручную:

    # systemctl disable network-manager

    Все виртуальные сети KVM/QEMU в нашем случае описываются как обычный сетевой мост и сеть net-internal уже готова к работе, а с сеть net-virtual потребует настройки маршрутизации и маскардинга трафика для доступа в интернет (ее настроим чуть позже).

    Сейчас, мы создадим xml-описания для наших сетевых мостов. Графические интерфейсы управления узлом виртуализации позволяют производить операции создания виртуальных сетей визуально, но для общего понимания вопроса мы произведем требуемые операции вручную. Нам потребуется выполнить последовательность действий:

    • Загрузить XML-описание сети
    • Запустить виртуальную сеть
    • Настроить автоматический запуск виртуальной сети

    Создаем XML-описание виртуалной сети. 

    В нашем случае простой сетевой мост описывается следующим образом:

    <network>
     <name>net-internal</name>
     <forward mode='bridge'/>
     <bridge name='net-internal'/>
    </network>

    Загрузим конфигурацию моста командой:

    # virsh net-define ./bridge.xml

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

    # virsh net-start net-internal# virsh net-autostart net-internal

    Аналогичным образом (изменив параметры в XML-файле) поступаем и с сетью net-virtual. В серьезных решениях используется VLAN-тегирование трафика и использование виртуального управляемого маршрутизатора openvswitch и этот вопрос будет рассматриваться когда мы подойдем к объединению изолированных узлов виртуализации в ферму. 

    Для сети net-virtual удовлетворяющей нашим требованиям мы используем следующие правила iptables:

    Маскардинг исходящего трафика из подсети net-virtual в локальную сеть (для доступа в Internet):

    iptables -t nat -A POSTROUTING -s 10.254.254.1/24 -o net-internal -j MASQUERADE 

    Для тестирования конфигурации сети создайте виртуальную машину используя графический интерфейс virt-manager (более подробно работу с виртуальными машинами с использованием libvirt мы рассмотрим в следующей статье).

    Настройка сети в VirtManager

    И в завершении небольшой бонус.

    Создание OpenVPN без назначения адреса со скриптом добавления интерфейса к мосту. 

    Конфигурация клиента.

    client
    dev tap-vcenter
    proto udp
    remote adman-lxc-01.th22.info 1197
    resolv-retry infinite
    nobind
    script-security 2
    up vpn-up.sh
    persist-key
    persist-tun
    ca ca.crt
    cert work-desktop.crt
    keywork-desktop.key
    remote-cert-tls server
    comp-lzo
    verb 3

    Собственно скрипт:

    #!/bin/sh
    ifconfig tap-vcenter up
    brctl addif kvm-bridge tap-vcenter
    exit 0


    Связанные записи в блоге

    Обсуждение статьи

    Ваш комментарий: