Страницы

Сохранить статью у себя в соцсети:

вторник, 19 июня 2012 г.

§ Guests networking.

Cоздание сети для виртуальных машин.

Приведу описание как создать общую универсальную схему для двух вариантов сетевого доступа:
  • виртуальные машины изолированы в частной сети принадлежащей хост-системе с возможностью доступа к внешним сетям;
  • виртуальные машины имеют выделенный интерфейс для общения с внешними сетями.
Операционная система Gentoo Linux.
Схема будет выглядеть таким образом:

Для работы нам понадобится usermode-utilities (создание tap интерфейсов), bridge-utils (для создания bridge-конфигураций) и iptables для подстройки правил фильтрации.

Использование tap-интерфейсов в качестве сетевых устройств для виртуальных машин является одним из эффективных подходов в реализации сетевой инфраструктуры. Этот вариант предоставляет достаточно хорошую производительность (лучшая производительность только у pass-through устройств и устройств поддерживающих SR-IOV) и гибкие возможности настройки.
Изначально у нас есть один сетевой интерфейс eth0 к которому подключена физическая сеть. Этот интерфейс будет служить у нас мостом во внешний мир, как для хост-системы, так и для виртуальных машин. Создаем из него бридж с одним интерфейсом. Тут есть 2 варианта: 
  1. делать все покомандно, но при таком случае необходимо иметь полноценный физический доступ к серверу или
  2. определить текстовую конфигурацию и перезапустить сеть. Здесь следует быть внимательным, при неверной настройке может отвалиться сеть и вновь понадобится физический доступ.
Предпочтителен второй, но рассмотрим оба. Итак, вариант 1:
# brctl addbr br0
# brctl addif br0 eth0
# ifconfig eth0 null
# ifconfig br0 10.100.0.90/16 up
# route add default gw 10.100.0.1

вариант 2. Текстовая конфигурация будет выглядеть следующим образом
# vi /etc/conf.d/net
config_eth0="null"
bridge_br0="eth0"
brctl_br0="stp off"
config_br0="10.100.0.90/16"
routes_br0="default via 10.100.0.1"
rc_need_br0="net.eth0"

Определив текстовую конфигурацию, нужно сделать симлинк в init.d для запуска нового bridge-интерфейса. После чего останавливаем eth0 и запускаем br0
# ln -s net.lo /etc/init.d/net.br0
# /etc/init.d/net.eth0 stop && /etc/init.d/net.br0 start

Таким образом мы настроили первый bridge. Также следует убрать из автозагрузки net.eth0.
Настраиваем второй bridge реализующий внутреннюю частную сеть для виртуальных машин. Следует помнить, что ip-адрес этого моста, будет являться шлюзом по умолчанию для виртуальных машин
# brctl addbr ilan0
# ifconfig ilan0 192.168.0.254/24

В /etc/conf.d/net это будет выглядеть так
brctl_ilan0="stp off"
config_ilan0="192.168.0.254/24"
bridge_ilan0=""

Теперь создаем интерфейс который будет принадлежать виртуальной машине. В зависимости от потребностей (посредством команды brctl addif) мы можем определить его либо во внешний мост br0 (если необходим прямой доступ к физической сети и выделенный ip-адрес) либо во внутренний мост ilan0 (если физический доступ не нужен и достаточно одного NAT).
При создании указываем пользователя которому будет принадлежать интерфейс, хорошая практика показывает что для запуска виртуальных машин нужно использовать отдельные учетные записи, эти же записи следует использовать и для создания tap-интерфейсов. Если это делается впервые и на долгое время, то следует подумать об общем принципе именования интерфейсов, например внутренние интерфейсы можно именовать itapXY, а внешние etapXY, где XY это порядковые номера интерфейсов.
# tunctl -u kvm100 -t itap100
# ifconfig itap100 up promisc
# brctl addif ilan0 itap100

В /etc/conf.d/net это будет выглядеть так
config_itap100="null"
tuntap_itap100="tap"
tunctl_itap100="-u kvm100"
bridge_add_itap100="ilan0"
rc_need_itap100="net.ilan0"

Для автоматического старта следует создать симлинк в init.d
# ln -s net.lo /etc/init.d/net.itap100

При последующем создании интерфейсов достаточно указать параметры конфигурации в conf.d/net и создать симлинк.
Теперь при запуске виртуальной машины используем параметры определения сети:
-netdev tap,ifname=itap100,id=itap100,script=no \
-device virtio-net-pci,netdev=itap100,mac=00:2f:59:a7:11:00
Важно отметить, в "-netdev" мы указываем параметр "ifname=itap100" то есть привязываемся к созданному tap-интерфейсу, id указываем произвольно. затем создаем устройство с драйвером virtio-net-pci и через параметр netdev привязываем гостевое устройство к tap интерфейсу через имя указанное в id.
Внутри виртуальной машины следует назначить ip-адрес на интерфейс и проверить доступность шлюза по умолчанию в роли которого выступает интерфейс ilan0.
Если всё хорошо, переходим к настройке доступа который позволяет хостам внутренней частной сети общаться с внешним миром. Для этого нам нужен iptables. Все запросы исходящие из внутренней сети транслируем во внешний адрес интерфейса br0 т.е. 10.100.0.90
# iptables -t nat -A POSTROUTING -o br0 -s 192.168.0.0/24 ! -d 192.168.0.0/24 -j SNAT --to-source 10.100.0.90
# /etc/init.d/iptables save
# echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf
# sysctl -p

Для хостов которых мы определяем во внешний мост, внутри машины назначается отдельный ip-адрес принадлежащий физической сети.
Вот и всё. В итоге мы получили внутреннюю сеть для виртуальных машин (принадлежность к ilan0) способных выходить во внешний мир посредство NAT и возможность создавать машины с отдельными интерфейсами на которые можно устанавливать выделенные ip-адреса (принадлежность к br0).

На главную "Аппаратная виртуализация"

Комментариев нет:

Отправить комментарий

Популярные сообщения

Профиль в Google+ Яндекс цитирования Яндекс.Метрика