Настройка сети в KVM: различия между версиями

Материал из ALT Linux Wiki
(Новая страница: «= Настройка сети в KVM = Настройка сети для виртуальных в kvm очень похожа на настройку в qemu, п...»)
 
(→‎Внутренний виртуальный мост: Исправил ошибки, переписал статью)
Строка 29: Строка 29:


'''Варианты использования:'''
'''Варианты использования:'''
* Организация сети между двумя или более виртуальными машинами. Эта сеть не будет доступна ни другим виртуальным машинам ни из реальной сети.
# Организация сети между двумя или более виртуальными машинами. Эта сеть не будет доступна ни другим виртуальным машинам, ни из реальной сети.
# Организация сети между виртуальными машинами и хост-системой. От первого варианта отличается только добавлением интерфейса, сконфигурированного на хосте. Если возникнет потребность, можно добавить реальный интерфейс, а можно обойтись специально созданным виртуальным.


'''Требования:'''
'''Требования:'''
* Настроенная и запущенная виртуальная машина;
* Настроенная и запущенная виртуальная машина;
* Если вы не хотите запускать её из под root-а, то для вашего пользователя понадобятся права на чтение/запись в /dev/kvm;
* Если вы не хотите запускать её из под root-а, то для вашего пользователя понадобятся права на чтение/запись в /dev/kvm;
* Вам понадобятся следующие программы. Если вы не хотите запускать их из под root-a, по вам понадобится настроить sudo для их запуска:
* Вам понадобятся следующие программы:
/sbin/ip
: /sbin/ip (пакет iproute2, обычно уже установлен)
  /usr/sbin/brctl
: /sbin/brctl или /usr/sbin/brctl (пакет bridge-utils, устанавливается вместе с kvm)
/usr/sbin/tunctl
: /sbin/tunctl или /usr/sbin/tunctl (пакет tunctl, нужно установить самостоятельно)
Если вы не хотите запускать их из под root-a, по вам понадобится настроить sudo для их запуска.


====Решение:====


'''Решение:'''
=====Подготовка=====
'''В Седьмой платформе'''
* В Centaurus уже подготовлен системный скрипт для запуска мостового интерфейса: /etc/init.d/bridge, достаточно создать нужное количество виртуальных интерфейсов, добавить их в /etc/sysconfig/bridge и запустить "службу" bridge:


* Создать мост, например:
/etc/sysconfig/bridge:
  sudo /usr/sbin/brctl addbr br0
ip link | grep -q tap100: || tunctl -u $USERNAME -t tap100
INTERFACES="tun100"
BRIDGE_INTERFACE="br0"
 
Скрипт /etc/init.d/bridge при этом нельзя запускать автоматически при старте системы, но запускайте только вручную от пользователя с помощью sudo:
sudo service bridge start
 
Либо можно использовать реальный интерфейс, например, eth1:
 
/etc/sysconfig/bridge:
INTERFACES="eth1"
BRIDGE_INTERFACE="br0"
 
В такой конфигурации скрипт /etc/init.d/bridge можно запускать автоматически при старте системы:
 
chkconfig bridge on
 
 
'''В старых дистрибутивах'''
 
* Создать и сконфигурировать мост, например:
  sudo brctl addbr br1
sudo ip link set br1 up
 
 
'''В любой системе'''
 
* Для связи по сети между виртуальной машиной и хост-системой нужно задать адрес IP мосту, например:
sudo ip addr add 192.168.100.1/24 dev br1
или, чтобы не задавать адрес вручную, создайте файл /etc/net/ifaces/br1/ipv4address, содержащий единственную строку "192.168.100.1/2"
(Это не обязательно, если доступ по сети в/из виртуальную машину не нужен.)
 
Также можно сконфигурировать сервер DHCP, чтобы он выдавал адреса в подсети интерфейса br1 (см. man dhcpd).
 
=====Включение виртуальной машины в мост=====


* Создать скрипт qemu-ifup следующего содержания:
* Создать скрипт qemu-ifup следующего содержания:
Строка 52: Строка 91:
   
   
  if [ -n "$1" ];then
  if [ -n "$1" ];then
         /usr/bin/sudo /usr/sbin/tunctl -u `whoami` -t $1
         /usr/bin/sudo /sbin/tunctl -u `whoami` -t $1
         /usr/bin/sudo /sbin/ip link set $1 up
         /usr/bin/sudo /sbin/ip link set $1 up
         sleep 0.5s
         sleep 0.5s
         /usr/bin/sudo /usr/sbin/brctl addif $switch $1
         /usr/bin/sudo /sbin/brctl addif $switch $1
         exit 0
         exit 0
  else
  else
Строка 70: Строка 109:
  qemu-system-x86_64 -hda /path/to/hda.img -net nic,macaddr=$macaddress -net tap
  qemu-system-x86_64 -hda /path/to/hda.img -net nic,macaddr=$macaddress -net tap


* Внутри каждой виртуальной машины нужно сконфигурировать уникальный адрес IP из одной и той же подсети.


'''Работа с предварительно созданными иинтерфейсами'''
Можно заранее (в стартовом скрипте) настроить все интерфейсы и затем использовать их в виртуальных машинах. При этом обязательно нужно указывать опцию script=no:
kvm &hellup; -net nic,vlan=0,macaddr=00:e0:4c:4f:35:81,model=rtl8139 -net tap,vlan=0,ifname=tap11,script=no


'''Замечания:'''
'''Замечания:'''
Строка 76: Строка 120:
* Вы можете создать общесистемный скрипт, назвав его в /etc/qemu-ifup или же спользовать любое другое имя, указав его при запуске машины:
* Вы можете создать общесистемный скрипт, назвав его в /etc/qemu-ifup или же спользовать любое другое имя, указав его при запуске машины:
  qemu-system-x86_64 -hda /path/to/hda.img -net nic,macaddr=$macaddress -net tap,script=/path/to/qemu-ifup
  qemu-system-x86_64 -hda /path/to/hda.img -net nic,macaddr=$macaddress -net tap,script=/path/to/qemu-ifup
* Каждая виртуальная машина подключенная к внутреннему виртуальному мосту должна иметь свой собственный MAC-адрес, отличный от адресов других машин.
* Каждая виртуальная машина подключенная к внутреннему виртуальному мосту должна иметь свой собственный MAC-адрес, отличный от адресов других машин.
* Для включения в мост необходимо использовать интерфейсы <tt>tap</tt>, но не <tt>tun</tt>. Дело в том, что у интерфейсов <tt>tun</tt> нет заголовков ethernet, которые требуются для работы моста.


== Публичный мост ==
== Публичный мост ==

Версия от 10:33, 13 сентября 2013

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

Настройка сети для виртуальных в kvm очень похожа на настройку в qemu, поэтому любая документация к qemu подходит и для kvm. В этой статье описывается как настроить наиболее часто используемые типы подключения виртуальной машины к сети. Это перевод статьи Networking - KVM.

Пользовательская сеть

Варианты использования:

  • Вам нужен простой способ дать виртуальной машине доступ в Интернет и в вашу локальную сеть;
  • Вам не нужен доступ к виртуальной машине из сети или из других виртуальных машины;
  • Вы готовы пожертвовать производительностью;
  • Внимание: пользовательская сеть не поддерживает некоторые возможности сетей, например ICMP, поэтому некоторые приложения (такие как ping) могут работать неправильно.

Требования:

  • Настроенная и запущенная виртуальная машина;
  • Если вы не хотите запускать её из под root-а, то для вашего пользователя понадобятся права на чтение/запись в /dev/kvm;
  • Если виртуальной машине нужен доступ в Интернет или в локальную сеть, то у хост-системы должен быть доступ в эти сети.

Решение:

  • Просто запустите виртуальную машину с параметрами "-net nic -net user", например:
qemu-system-x86_64 -hda /path/to/hda.img -net nic -net user


Замечания:

  • IP-адрес может быть назначен автоматически DHCP-сервером, встроенным в QEMU;
  • Если вы хотите запустить несколько виртуальных машин, то вам не понадобится назначать для них различные MAC-адреса;
  • Используя опцию "hostfwd" вы можете получить доступ к одном порту на виртуальной машине. Например, если вы хотите передать файл из хост-системы на виртуальную машину, то запустите машину с параметрами "-net nic -net user,hostfwd=tcp::5555-:22". В данном случае вы перенаправить порт 5555 из хост-системы на порт 22 виртуальной машины. Команда "scp -P 5555 file.txt root@localhost:/tmp", выполненная на хост-системе, скопирует файл в виртуальную машину. Также вы можете использовать другой адрес хост-системы для подключения.

Внутренний виртуальный мост

Варианты использования:

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

Требования:

  • Настроенная и запущенная виртуальная машина;
  • Если вы не хотите запускать её из под root-а, то для вашего пользователя понадобятся права на чтение/запись в /dev/kvm;
  • Вам понадобятся следующие программы:
/sbin/ip (пакет iproute2, обычно уже установлен)
/sbin/brctl или /usr/sbin/brctl (пакет bridge-utils, устанавливается вместе с kvm)
/sbin/tunctl или /usr/sbin/tunctl (пакет tunctl, нужно установить самостоятельно)

Если вы не хотите запускать их из под root-a, по вам понадобится настроить sudo для их запуска.

Решение:

Подготовка

В Седьмой платформе

  • В Centaurus уже подготовлен системный скрипт для запуска мостового интерфейса: /etc/init.d/bridge, достаточно создать нужное количество виртуальных интерфейсов, добавить их в /etc/sysconfig/bridge и запустить "службу" bridge:

/etc/sysconfig/bridge:

ip link | grep -q tap100: || tunctl -u $USERNAME -t tap100
INTERFACES="tun100"
BRIDGE_INTERFACE="br0"

Скрипт /etc/init.d/bridge при этом нельзя запускать автоматически при старте системы, но запускайте только вручную от пользователя с помощью sudo:

sudo service bridge start

Либо можно использовать реальный интерфейс, например, eth1:

/etc/sysconfig/bridge:

INTERFACES="eth1"
BRIDGE_INTERFACE="br0"

В такой конфигурации скрипт /etc/init.d/bridge можно запускать автоматически при старте системы:

chkconfig bridge on


В старых дистрибутивах

  • Создать и сконфигурировать мост, например:
sudo brctl addbr br1
sudo ip link set br1 up


В любой системе

  • Для связи по сети между виртуальной машиной и хост-системой нужно задать адрес IP мосту, например:
sudo ip addr add 192.168.100.1/24 dev br1

или, чтобы не задавать адрес вручную, создайте файл /etc/net/ifaces/br1/ipv4address, содержащий единственную строку "192.168.100.1/2" (Это не обязательно, если доступ по сети в/из виртуальную машину не нужен.)

Также можно сконфигурировать сервер DHCP, чтобы он выдавал адреса в подсети интерфейса br1 (см. man dhcpd).

Включение виртуальной машины в мост
  • Создать скрипт qemu-ifup следующего содержания:
#!/bin/sh
set -x

switch=br0

if [ -n "$1" ];then
        /usr/bin/sudo /sbin/tunctl -u `whoami` -t $1
        /usr/bin/sudo /sbin/ip link set $1 up
        sleep 0.5s
        /usr/bin/sudo /sbin/brctl addif $switch $1
        exit 0
else
        echo "Error: no interface specified"
        exit 1
fi
  • Сгенерировать MAC-адрес вручную или автоматически, используя скрипт:
#!/bin/bash
# generate a random mac address for the qemu nic
printf 'DE:AD:BE:EF:%02X:%02X\n' $((RANDOM%256)) $((RANDOM%256))
  • Запустить каждую виртуальную машину, заменяя $macaddress значением, полученным на предыдущем шаге:
qemu-system-x86_64 -hda /path/to/hda.img -net nic,macaddr=$macaddress -net tap
  • Внутри каждой виртуальной машины нужно сконфигурировать уникальный адрес IP из одной и той же подсети.

Работа с предварительно созданными иинтерфейсами

Можно заранее (в стартовом скрипте) настроить все интерфейсы и затем использовать их в виртуальных машинах. При этом обязательно нужно указывать опцию script=no:

kvm &hellup; -net nic,vlan=0,macaddr=00:e0:4c:4f:35:81,model=rtl8139 -net tap,vlan=0,ifname=tap11,script=no

Замечания:

  • Если вы не хотите запускать машину от root-а, то скрипт qemu-ifup должен корректно работать от вашего пользователя;
  • Вы можете создать общесистемный скрипт, назвав его в /etc/qemu-ifup или же спользовать любое другое имя, указав его при запуске машины:
qemu-system-x86_64 -hda /path/to/hda.img -net nic,macaddr=$macaddress -net tap,script=/path/to/qemu-ifup
  • Каждая виртуальная машина подключенная к внутреннему виртуальному мосту должна иметь свой собственный MAC-адрес, отличный от адресов других машин.
  • Для включения в мост необходимо использовать интерфейсы tap, но не tun. Дело в том, что у интерфейсов tun нет заголовков ethernet, которые требуются для работы моста.

Публичный мост

Предупреждение: Данный метод может не работать с большинством беспроводных устройств.

Варианты использования:

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

Требования:

  • Настроенная и запущенная виртуальная машина;
  • Если вы не хотите запускать её из под root-а, то для вашего пользователя понадобятся права на чтение/запись в /dev/kvm;
  • Вам понадобятся следующие программы. Если вы не хотите запускать их из под root-a, по вам понадобится настроить sudo для их запуска:
/sbin/ip
/usr/sbin/brctl
/usr/sbin/tunctl
  • Хост-система должна иметь доступ в интернет и в локальную сеть.

Вариант №1: Использование средств дистрибутива

  • Создать файл /etc/net/ifaces/breth0/options следующего содержания:
TYPE=bri
BOOTPROTO=dhcp
HOST=eth0
DISABLED=no
NM_CONTROLLED=no
  • Применить новые настройки сети командой:
/etc/init.d/network restart
  • Интерфейс моста breth0 должен получить IP-адрес, а интерфейс eth0 должен быть без адреса.

Особенности VLANов

Если вы используете VLANы но до виртуальной машины трафик не доходит, выполните команды:

# cd /proc/sys/net/bridge
# ls
bridge-nf-call-arptables  bridge-nf-call-iptables
bridge-nf-call-ip6tables  bridge-nf-filter-vlan-tagged
# for f in bridge-nf-*; do echo 0 > $f; done


Варинат №2: "Ручной"

  • Создать мост командой:
sudo /usr/sbin/brctl addbr br0
  • Добавить физический интерфейс в этот мост, например eth0:
sudo /usr/sbin/brctl  addif br0 eth0
  • Создать скрипт qemu-ifup следующего содержания:
#!/bin/sh
set -x

switch=br0

if [ -n "$1" ];then
        /usr/bin/sudo /usr/sbin/tunctl -u `whoami` -t $1
        /usr/bin/sudo /sbin/ip link set $1 up
        sleep 0.5s
        /usr/bin/sudo /usr/sbin/brctl addif $switch $1
        exit 0
else
        echo "Error: no interface specified"
        exit 1
fi
  • Сгенерировать MAC-адрес вручную или автоматически, используя скрипт:
#!/bin/bash
# generate a random mac address for the qemu nic
printf 'DE:AD:BE:EF:%02X:%02X\n' $((RANDOM%256)) $((RANDOM%256))
  • Запустить каждую виртуальную машину, заменяя $macaddress значением, полученным на предыдущем шаге:
qemu-system-x86_64 -hda /path/to/hda.img -net nic,macaddr=$macaddress -net tap

Замечания:

  • Если вы не хотите запускать машину от root-а, то скрипт qemu-ifup должен корректно работать от вашего пользователя;
  • Вы можете создать общесистемный скрипт, назвав его в /etc/qemu-ifup или же спользовать любое другое имя, указав его при запуске машины:
qemu-system-x86_64 -hda /path/to/hda.img -net nic,macaddr=$macaddress -net tap,script=/path/to/qemu-ifup
  • Каждая виртуальная машина подключенная к внутреннему виртуальному мосту должна иметь свой собственный MAC-адрес, отличный от адресов других машин.


Маршрутизация/iptables

Также вы можете объединить виртуальные машины tap-интерфесом в хост-система и настроить правила iptables в хост-система, чтобы она была маршутизатором и сетевым экраном для виртуальных машин.

Настройки маршрутизации сводятся к созданию маршрута по умолчанию в виртуальной машине, указывающего на хост-систему, разрешение пересылки пакетов (IP forwarding) и настройки маршрута на tap-интерфейс виртуальной машины в хост-системе.

Заблаговременно проверьте настройки:

  • Хост-система: Разрешить пересылку пакетов и добавить маршрут до виртуальной машины (должно быть помещено в скрипт - маршрут необходимо добавить после запуска виртуальной машины):
sysctl -w net.ipv4.ip_forward=1                 # разрешить пересылку пакетов IPv4
route add -host <ip-of-client> dev <tap-device> # добавить маршрут до виртуальной машины
  • Виртуальная машина: маршрут по умолчанию указывает на хост-систему (<ip-of-host> должен быть в одной сети с <ip-of-client>):
route add default gw <ip-of-host>
  • Виртуальная машина v2: если IP-адрес хост-системы не в одной сети с <ip-of-client>, тогда надо вручную добавить маршрут до хост-системы перед добавлением маршрута по умолчанию:
route add -host <ip-of-host> dev <network-interface>
route add default gw <ip-of-host>

VDE

Другой способ настройки сети это VDE (Virtual Distributed Ethernet).