Настройка сети в KVM
Настройка сети в 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", выполненная на хост-системе, скопирует файл в виртуальную машину. Также вы можете использовать другой адрес хост-системы для подключения.
Внутренний виртуальный мост
Варианты использования:
- Организация сети между двумя или более виртуальными машинами. Эта сеть не будет доступна ни другим виртуальным машинам ни из реальной сети.
Требования:
- Настроенная и запущенная виртуальная машина;
- Если вы не хотите запускать её из под root-а, то для вашего пользователя понадобятся права на чтение/запись в /dev/kvm;
- Вам понадобятся следующие программы. Если вы не хотите запускать их из под root-a, по вам понадобится настроить sudo для их запуска:
/sbin/ip /usr/sbin/brctl /usr/sbin/tunctl
Решение:
- Создать мост, например:
sudo /usr/sbin/brctl addbr br0
- Создать скрипт 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-адрес, отличный от адресов других машин.
Публичный мост
Предупреждение: Данный метод может не работать с большинством беспроводных устройств.
Варианты использования:
- Вы хотите назначать 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).