Александр Горбач


программирование, админство

Настройка 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:

sudo apt-get install qemu

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

sudo apt-get install libcap2-bin

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

sudo setcap cap_net_admin=ei /usr/bin/qemu-system-x86_64

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

sudo setcap cap_net_admin=ei /usr/bin/qemu

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

cap_net_admin        USER-NAME-HERE

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

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

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

sudo apt-get install bridge-utils

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

sudo invoke-rc.d networking stop

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

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

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

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.

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

sudo /etc/init.d/networking restart

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

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 на ваш домен:

[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-адресов:

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-адрес:

 
      
     
    

в:


      
     
    

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

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

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:

search example.com
nameserver 10.0.0.1

Меняете на:

search example.com
nameserver 192.168.122.1
nameserver 10.0.0.1

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

$ host hardy-amd64
hardy-amd64 has address 

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

$ ssh hardy-amd64.

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

send host-name "";

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

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

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

'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-файлы включают:

'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, к примеру:

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 следующим образом:


  default
  12345678-1234-1234-1234-123456789abc
  
  
  
    
      
      
    
  

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

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, то это можно сделать как-то так (на хост-машине):

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

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

iptables -I FORWARD -i eth0 -o virbr0 -p tcp -m state --state NEW -j ACCEPT

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

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

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

sudo iptables -t nat -L

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

...
Chain POSTROUTING (policy ACCEPT)
target     prot opt source               destination         
MASQUERADE  all  --  192.168.122.0/24    !192.168.122.0/24    
...

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

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

virsh net-destroy default 
virsh net-start default

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

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

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

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

Автор Sash(k)a

Август 22nd, 2011 at 7:19 пп

Опубликовано в Без рубрики

Тэги , , ,

Яндекс.Метрика