Настройка KVM под Ubuntu Server 10.04 LTS. Часть 2 – Настройка сети

Есть несколько различных способов настройки доступа виртуальной машины в сеть.

Конфигурация виртуальной сети по умолчанию называется Usermode Networking. Трафик NAT-ится через интерфейс хост машины во внешнюю сеть.
Или же вы можете настроить Bridged Networking (сетевой мост) для того, чтобы разрешить внешним машинам непосредственный доступ к сервисам, запущенным на гостевой операционной системе.

Usermode Networking

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

По умолчанию, гостевая операционная система имеет адрес из пространства адресов 10.0.2.0/24 и хостовая операционная система доступна по адресу 10.0.2.2.

Вы можете получить доступ по ssh к хостовой операционной системе (по адресу 10.0.2.2) из гостевой операционной системы и использовать scp для копирования файлов туда-сюда.

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

Если ваши гостевые операционки не имеют доступа к сети «из коробки», смотрите секцию Возможные ошибки ниже.

Сетевой мост (Bridged Networking)

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

Внимание: сетевые мосты не буду работать, если физический сетевой интерфейс (к примеру, eth1, ath0) используется для построения моста как беспроводные интерфейсы (к примеру, ipw3945), так как большинство драйверов беспроводных интерфейсов не поддерживают режим сетевых мостов.

Получение доступа к возможностям CAP_NET_ADMIN

Сетевые мосты не работают по умолчанию. Начиная с релиза ядра 2.6.18 в сентябре 2006, расширение CAP_NET_ADMIN необходимо для использования сетевых возможностей TUN/TAP(bug #103010).

Устанавливаем пакет qemu-kvm:

Устаналиваем инструментарий расширений линукса:

Даем разрешения пользователям к расширению CAP_NET_ADMIN. Доступ к это расширению нужно давать с осторожностью, так как оно позволяет пользователю нарушить полностью функционирование сети в системе.
Даем qemu экземпляр расширения CAP_NET_ADMIN, для 64-х битных:

для 32-х битных:

Дам разрешения определенным пользователям использовать возможности расширения CAP_NET_ADMIN редактируя /etc/security/capability.conf:

Обратите внимание, что расширения файловой системы выше, будут потеряны после каждого обновления qemu, так как расширения файловой системы не поддерживаются системой управления пакетов Ubuntu (см. FilesystemCapabilities). Хорошее обозрения расширений Linux и QEMU см. эту статью.

Создание сетевого моста на хост-системе

Устанавливаем пакет bridge-utils:

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

Если вы подключены по удаленному соединению, и вы не можете остановить работу сети, то продолжайте выполнять следующие команды, и выполните sudo invoke-rc.d networking restart в конце. Если вы где-то сделаете ошибку, то придется все-равно топать ножками до сервера.

Для настройки сетевого интерфейса моста, открываем на редактирование /etc/network/interfaces и комментируем или удаляем существующую конфигурацию и заменяем следующим (с заменой значений на данные вашей сети):

или для использования DHCP

Эта конфигурация создат виртуальный интерфейс br0.

Теперь перезапускаем сеть:

Если ваш хост виртуальных машин «повисает» на несколько секунд после перезапуска или остановки гостевых машин в KVM, которые используют сетевые мосты, то это происходит потому то мост в линуксе получает физический адрес самого нижнего пронумерованного интерфейса из всех присоединенных интерфейсов. Чтобы обойти это, добавьте следующую строчку к вашей конфигурации моста:

и замените f4:6d:04:08:f1:5f физическим адресом ethernet-адаптера, который всего будет частью моста.

Конфигурация ubuntu-vm-builder для создания гостевых операционных систем с сетевыми мостами по умолчанию

Виртуальные машины описаны в XML файлах. ubuntu-vm-builder это инструмент, который мы будем использовать для создания виртуальных машин опирась на шаблон /etc/vmbuilder/libvirt/libvirtxml.tmpl.

В Ubuntu 10.04 файл libvirtxml.tmplиспользует переменные окружения пользователя, так что устанавливаем bridge=br0 в /etc/vmbuilder.cfg или ~/.vmbuilder.cfg (для конфигураций для всей системы или для отдельного пользователя соответственно).

Ниже пример файла /etc/vmbuilder.cfg. Если вы намереваетесь его использовать, поменяйте хотя бы example.com на ваш домен:

Генерирование физических MAC-адресов для KVM

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

Для параноиков, которые боятся что сгенерировали уже использующийся MAC-адрес будет полезным проверить вывод команды «ip neigh».

Конвертирование существующих гостевых систем

Если вы уже создали виртуальную машину, вы можете перевести ее на использование сетевых мостов изменением XML файла (in /etc/libvirt/qemu/) в разделе сетевых интерфейсов, скорректировав MAC-адрес:

в:

Примечание: Убедитесь что первый октет в вашем MAC адресе EVEN (т.е. 00:) так как MAC-адрес с ODD первым байтом (т.е. 01:) зарезервирован для широковещательных протоколов и может создать загадочные проблемы при работе. К примеру, гостевая система будет принимать ARP-пакеты и отвечать на них, но ответы буду смущать остальные машины доводя их до негодования. Это не грабли KVM, это просто так устроен мир (Ethernet в частности).

Вам необходимо перезапустить libvirtd для загрузки изменение; самый легкий путь это зайти в virsh (утилита командной строки для управления виртуальными машинами), остановить виртуальную машину, перечитать ее конфигурационный файл, и перезапустить виртуальную машину:

Виртуальная машина «mirror» теперь использует сетевой мост.

Настройка DNS и DHCP для гостевых машин

libvirt использует dnsmasq для раздачи IP адресов гостевым машинам, которые настроены на использование dhcp. Если вы добавите на вашей зостовой машине 192.168.122.1 (IP-адрес по умолчанию для для вашего хоста в libvirt) как ваш первичный сервер имен в /etc/resolv.conf, тогда вы сможете использовать разрешение имен для ваших гостевых машин. dnsmasq достаточно умен для того, чтобы использовать другие записи ‘nameserver’ в вашем /etc/resolv.conf для разрешения адресов не из libvirt. К примеру, содержимое вашего /etc/resolv.conf:

Меняете на:

Теперь, если у вас есть виртуальная машина с именем ‘hardy-amd64’, после ее запуска вы можете сделать:

Обратите внимание, что если вы используете ssh, вам может понадобиться использовать завершающую точку ‘.’ после имени хоста:

И на конец, чтобы все это заработало, ваши гостевые машины должны отправлять их имя хоста как часть dhcp запроса. Это происходит автоматически на больщинстве операционных систем. Для систем, которые не отправляют имя автоматически и используют dhcp3, вы можете подправить файл dhclient.conf. К примеру для Ubuntu 6.06 LTS (Dapper), подправить /etc/dhcp3/dhclient.conf чтобы получить:

ВАЖНО: В зависимости от вашей сетевой конфигурации, ваши хосты в /etc/resolv.conf могут быть периодически перезаписываться. Вы должны будете подправить каждый dhcp сервер в вашей сети для поддержки дополнитеьного сервера имен libvirt для хостов, управляемых libvirt, или подправить соответственно каждую хост-машину. Так как здесь возможно большое количество вариантов настроек и топологий поощряется самостоятельно заглянуть в resolv.conf и/или man interfaces.

Загрузка через сеть, используя PXE

KVM и QEMU могут эмулировать множество сетевых карт.ROM-файлы включенные в kvm-pxe:

Другие ROM-файлы включают:

Скопируйте приглянувшиеся файлы в /usr/share/kvm и/или /usr/share/qemu.

IP псевдонимы

Псевдоним IP-адресов предоставляют aliases provide a удобный путь для раздачи виртуальным машинам собственных внешних IP-адресов:

1. Настройте сетевые мосты.

2. Создайне необходимые псведонимы IP адресов на хостовой машине как обычно: поместите /etc/network/interfaces, к примеру:

3. Закрепите гостевые IP адреса, или поменяйте их на статические , например 192.168.122.99, в /etc/network/interfaces на гостевой машине или с помощью описания хостов в конфигурации dhcp (см. ниже).

4. Включите маршрутизацию на хосте: раскоментируйте net.ipv4.ip_forward=1 в /etc/sysctl.conf (/etc/ufw/sysctl.conf если используется ufw),или временно с помощью 1 >/proc/sys/net/ipv4/ip_forward.

5. Измените перенаправление virtlib с nat на route и поправьте диапазон dhcp для того, чтобы исключить адреса, используемые для гостевых систем. (как вариант — добавьте записи в хостах для них): virsh net-edit default и измените xml следующим образом:

6. Направьте трафик с внешнего интерфейса во внутренний и обратно:

Место, куда это поместить зависит от способа запуска и установки вашего фаервола; если вы используете ufw вы можете использовать /etc/ufw/before.rules. Вам так же может понадобиться поправить фильтрующие правила вашего фаервола.

Перенаправление портов в виртуальную машину

Если вы желаете перенаправить определенные порты с хостовой в виртуальную машину, например, если вы хотите иметь почтовый сервер на ваиртуальной машине с адресом 192.168.122.90 и перенаправить порт smtp 25 и хост машину с адресом 192.168.0.10, то это можно сделать как-то так (на хост-машине):

возможные ошибки

Не работает DNAT в KVM qemu

Мне помогло добавить запись:

Нет связи по умолчанию

Если вы используете режим сети по-умолчанию (usermode), но ваши гостевые операционные системы не имеют связи, возможно у вас проблема с конфигурацией фаервола. libvirtd делает очень много записей в iptablesво время установки.

В частности, при просмотре таблицы nat фаервола::

Вы должны увидеть:

Если это правило отсутствует, попробуйте создать его:

Остановите все ваши виртуальные машины.
Удалите и пересоздайте сеть по умолчанию:

Сетевой мост теряет соединение

Большое количество людей имеют проблемы в виде потери соединения сетевым мостом после большого количества переданных данных (например во время выполнения rsync). Для клиентов Hardy или Intrepid , попробуйте включить режим virtio.

Сетевой мост недоступен в Virt-Manager

Сетевой мост, сконфигурированный, как описано выше не будет виден в virt-manager когда используется сессия удаленного управления, см. ошибку #520386.