Настройка 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:
1 |
sudo apt-get install qemu |
Устаналиваем инструментарий расширений линукса:
1 |
sudo apt-get install libcap2-bin |
Даем разрешения пользователям к расширению CAP_NET_ADMIN. Доступ к это расширению нужно давать с осторожностью, так как оно позволяет пользователю нарушить полностью функционирование сети в системе.
Даем qemu экземпляр расширения CAP_NET_ADMIN, для 64-х битных:
1 |
sudo setcap cap_net_admin=ei /usr/bin/qemu-system-x86_64 |
для 32-х битных:
1 |
sudo setcap cap_net_admin=ei /usr/bin/qemu |
Дам разрешения определенным пользователям использовать возможности расширения CAP_NET_ADMIN редактируя /etc/security/capability.conf:
1 |
cap_net_admin USER-NAME-HERE |
Обратите внимание, что расширения файловой системы выше, будут потеряны после каждого обновления qemu, так как расширения файловой системы не поддерживаются системой управления пакетов Ubuntu (см. FilesystemCapabilities). Хорошее обозрения расширений Linux и QEMU см. эту статью.
Создание сетевого моста на хост-системе
Устанавливаем пакет bridge-utils:
1 |
sudo apt-get install bridge-utils |
Мы переходим к изменению сетевой конфигурации. Для того, чтобы сделать это корректно, остановим сначала сеть:
1 |
sudo invoke-rc.d networking stop |
Если вы подключены по удаленному соединению, и вы не можете остановить работу сети, то продолжайте выполнять следующие команды, и выполните sudo invoke-rc.d networking restart в конце. Если вы где-то сделаете ошибку, то придется все-равно топать ножками до сервера.
Для настройки сетевого интерфейса моста, открываем на редактирование /etc/network/interfaces и комментируем или удаляем существующую конфигурацию и заменяем следующим (с заменой значений на данные вашей сети):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
auto lo iface lo inet loopback auto eth0 iface eth0 inet manual auto br0 iface br0 inet static address 192.168.0.10 network 192.168.0.0 netmask 255.255.255.0 broadcast 192.168.0.255 gateway 192.168.0.1 bridge_ports eth0 bridge_stp off bridge_fd 0 bridge_maxwait 0 |
или для использования DHCP
1 2 3 4 5 6 7 8 9 10 11 12 |
auto lo iface lo inet loopback auto eth0 iface eth0 inet manual auto br0 iface br0 inet dhcp bridge_ports eth0 bridge_stp off bridge_fd 0 bridge_maxwait 0 |
Эта конфигурация создат виртуальный интерфейс br0.
Теперь перезапускаем сеть:
1 |
sudo /etc/init.d/networking restart |
Если ваш хост виртуальных машин «повисает» на несколько секунд после перезапуска или остановки гостевых машин в KVM, которые используют сетевые мосты, то это происходит потому то мост в линуксе получает физический адрес самого нижнего пронумерованного интерфейса из всех присоединенных интерфейсов. Чтобы обойти это, добавьте следующую строчку к вашей конфигурации моста:
1 |
post-up ip link set br0 address f4:6d:04:08:f1:5f |
и замените 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 на ваш домен:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
[DEFAULT] # Default is 1G tmpfs; Uncomment this line if you've >=2G of free RAM. #tmpfs = suid,dev,size=2G #arch = amd64 arch = i386 domain = example.com part = vmbuilder.partition user = localadmin name = LocalAdmin pass = default [kvm] libvirt = qemu:///system #network = br0 bridge = br0 virtio_net = true [ubuntu] #mirror = http://127.0.0.1:9999/ubuntu # If using package cache software (apt-proxy), uncomment line below and set correct IP and Port: #install-mirror = http://127.0.0.1:9999/ubuntu suite = lucid flavour = virtual #components = main,universe,restricted,multiverse components = main,universe # Example adding PPA and installing extra software packages after base OS installation: #ppa = bcfg2/lucidtesting #addpkg = openssh-server, unattended-upgrades, bcfg2, acpid |
Генерирование физических MAC-адресов для KVM
Если вы управляете вашими гостевыми системами через командную строку, нижеследующий скрипт будет полезен для генерирования случайных MAC-адресов:
1 |
MACADDR="52:54:$(dd if=/dev/urandom count=1 2>/dev/null | md5sum | sed 's/^\(..\)\(..\)\(..\)\(..\).*$/\1:\2:\3:\4/')"; echo $MACADDR |
Для параноиков, которые боятся что сгенерировали уже использующийся MAC-адрес будет полезным проверить вывод команды «ip neigh».
Конвертирование существующих гостевых систем
Если вы уже создали виртуальную машину, вы можете перевести ее на использование сетевых мостов изменением XML файла (in /etc/libvirt/qemu/) в разделе сетевых интерфейсов, скорректировав MAC-адрес:
1 2 3 4 |
<interface type='network'> <mac address='00:11:22:33:44:55'/> <source network='default'/> </interface> |
в:
1 2 3 4 |
<interface type='bridge'> <mac address='00:11:22:33:44:55'/> <source bridge='br0'/> </interface> |
Примечание: Убедитесь что первый октет в вашем MAC адресе EVEN (т.е. 00:) так как MAC-адрес с ODD первым байтом (т.е. 01:) зарезервирован для широковещательных протоколов и может создать загадочные проблемы при работе. К примеру, гостевая система будет принимать ARP-пакеты и отвечать на них, но ответы буду смущать остальные машины доводя их до негодования. Это не грабли KVM, это просто так устроен мир (Ethernet в частности).
Вам необходимо перезапустить libvirtd для загрузки изменение; самый легкий путь это зайти в virsh (утилита командной строки для управления виртуальными машинами), остановить виртуальную машину, перечитать ее конфигурационный файл, и перезапустить виртуальную машину:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
yhamon@paris:/etc/libvirt/qemu$ ls mirror.xml networks vm2.xml yhamon@paris:/etc/libvirt/qemu$ virsh --connect qemu:///system Connecting to uri: qemu:///system Welcome to virsh, the virtualization interactive terminal. Type: 'help' for help with commands 'quit' to quit virsh # list Id Name State ---------------------------------- 10 vm2 running 15 mirror running virsh # shutdown mirror Domain mirror is being shutdown virsh # define mirror.xml Domain mirror defined from mirror.xml virsh # start mirror Domain mirror started |
Виртуальная машина «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:
1 2 |
search example.com nameserver 10.0.0.1 |
Меняете на:
1 2 3 |
search example.com nameserver 192.168.122.1 nameserver 10.0.0.1 |
Теперь, если у вас есть виртуальная машина с именем ‘hardy-amd64’, после ее запуска вы можете сделать:
1 2 |
$ host hardy-amd64 hardy-amd64 has address <IP address given by dnsmasq> |
Обратите внимание, что если вы используете ssh, вам может понадобиться использовать завершающую точку ‘.’ после имени хоста:
1 |
$ ssh hardy-amd64. |
И на конец, чтобы все это заработало, ваши гостевые машины должны отправлять их имя хоста как часть dhcp запроса. Это происходит автоматически на больщинстве операционных систем. Для систем, которые не отправляют имя автоматически и используют dhcp3, вы можете подправить файл dhclient.conf. К примеру для Ubuntu 6.06 LTS (Dapper), подправить /etc/dhcp3/dhclient.conf чтобы получить:
1 |
send host-name "<your guest hostname here>"; |
ВАЖНО: В зависимости от вашей сетевой конфигурации, ваши хосты в /etc/resolv.conf могут быть периодически перезаписываться. Вы должны будете подправить каждый dhcp сервер в вашей сети для поддержки дополнитеьного сервера имен libvirt для хостов, управляемых libvirt, или подправить соответственно каждую хост-машину. Так как здесь возможно большое количество вариантов настроек и топологий поощряется самостоятельно заглянуть в resolv.conf и/или man interfaces.
Загрузка через сеть, используя PXE
KVM и QEMU могут эмулировать множество сетевых карт.ROM-файлы включенные в kvm-pxe:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
'KVM Name' nic,model= 'Etherboot Identification' 'Etherboot Filename' 'KVM filename' e1000 ((e1000:e1000-0x1026 -- [8086,1026])) gpxe-0.9.3-e1000-0x1026.rom pxe-e1000.bin ne2k_pci (default) ns8390:rtl8029 -- [10ec,8029] gpxe-0.9.3-rtl8029.rom pxe-ne2k_pci.bin pcnet pxe-pcnet.bin rtl8139 pxe-rtl8139.bin virtio pxe-virtio.bin |
Другие ROM-файлы включают:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
'KVM Name' nic,model= 'Etherboot Identification' 'Etherboot Filename' 'KVM filename' i82551 pxe-i82551.bin i82557b pxe-i82557b.bin i82559er pxe-i82559er.bin ne2k_isa pxe-ne2k_isa.bin smc91c111 pxe-smc91c111.bin lance pxe-lance.bin mcf_fec pxe-mcf_fec.bin |
Скопируйте приглянувшиеся файлы в /usr/share/kvm и/или /usr/share/qemu.
IP псевдонимы
Псевдоним IP-адресов предоставляют aliases provide a удобный путь для раздачи виртуальным машинам собственных внешних IP-адресов:
1. Настройте сетевые мосты.
2. Создайне необходимые псведонимы IP адресов на хостовой машине как обычно: поместите /etc/network/interfaces, к примеру:
1 2 3 4 |
auto eth0:0 iface eth0:0 inet static address 192.168.0.11 netmask 255.255.255.0 |
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 следующим образом:
1 2 3 4 5 6 7 8 9 10 11 12 |
<network> <name>default</name> <uuid>12345678-1234-1234-1234-123456789abc</uuid> <forward mode='route'/> <bridge name='virbr0' stp='on' delay='0' /> <ip address='192.168.122.1' netmask='255.255.255.0'> <dhcp> <range start='192.168.122.100' end='192.168.122.254' /> <host mac"=00:11:22:33:44:55" name="guest.example.com" ip="192.168.122.99" /> </dhcp> </ip> </network> |
6. Направьте трафик с внешнего интерфейса во внутренний и обратно:
1 2 |
iptables -t nat -A PREROUTING -d 192.168.0.11 -j DNAT --to-destination 192.168.122.99 iptables -t nat -A POSTROUTING -s 192.168.122.99 -j SNAT --to-source 192.168.0.11 |
Место, куда это поместить зависит от способа запуска и установки вашего фаервола; если вы используете ufw вы можете использовать /etc/ufw/before.rules. Вам так же может понадобиться поправить фильтрующие правила вашего фаервола.
Перенаправление портов в виртуальную машину
Если вы желаете перенаправить определенные порты с хостовой в виртуальную машину, например, если вы хотите иметь почтовый сервер на ваиртуальной машине с адресом 192.168.122.90 и перенаправить порт smtp 25 и хост машину с адресом 192.168.0.10, то это можно сделать как-то так (на хост-машине):
1 |
iptables -t nat -A PREROUTING -d 192.168.0.10 -p tcp --dport 25 -j DNAT --to-destination 192.168.122.90:25 |
возможные ошибки
Не работает DNAT в KVM qemu
Мне помогло добавить запись:
1 |
iptables -I FORWARD -i eth0 -o virbr0 -p tcp -m state --state NEW -j ACCEPT |
Нет связи по умолчанию
Если вы используете режим сети по-умолчанию (usermode), но ваши гостевые операционные системы не имеют связи, возможно у вас проблема с конфигурацией фаервола. libvirtd делает очень много записей в iptablesво время установки.
В частности, при просмотре таблицы nat фаервола::
1 |
sudo iptables -t nat -L |
Вы должны увидеть:
1 2 3 4 5 |
... Chain POSTROUTING (policy ACCEPT) target prot opt source destination MASQUERADE all -- 192.168.122.0/24 !192.168.122.0/24 ... |
Если это правило отсутствует, попробуйте создать его:
Остановите все ваши виртуальные машины.
Удалите и пересоздайте сеть по умолчанию:
1 2 |
virsh net-destroy default virsh net-start default |
Сетевой мост теряет соединение
Большое количество людей имеют проблемы в виде потери соединения сетевым мостом после большого количества переданных данных (например во время выполнения rsync). Для клиентов Hardy или Intrepid , попробуйте включить режим virtio.
Сетевой мост недоступен в Virt-Manager
Сетевой мост, сконфигурированный, как описано выше не будет виден в virt-manager когда используется сессия удаленного управления, см. ошибку #520386.