Настройка сети в KVM: различия между версиями
Alex (обсуждение | вклад) (Новая страница: «= Настройка сети в KVM = Настройка сети для виртуальных в kvm очень похожа на настройку в qemu, п...») |
м (Откат правок 213.110.204.192 (обсуждение) к последней версии ЕвгенийИТ) Метка: откат |
||
(не показано 17 промежуточных версий 7 участников) | |||
Строка 1: | Строка 1: | ||
= Настройка сети в KVM = | = Настройка сети в KVM = | ||
Настройка сети для виртуальных в kvm очень похожа на настройку в qemu, поэтому любая документация к qemu подходит и для kvm. В этой статье описывается как настроить наиболее часто используемые типы подключения виртуальной машины к сети. | Настройка сети для виртуальных машин в kvm очень похожа на настройку в qemu, поэтому любая документация к qemu подходит и для kvm. В этой статье описывается как настроить наиболее часто используемые типы подключения виртуальной машины к сети. Эта статья основана на [http://www.linux-kvm.org/page/Networking Networking - KVM]. | ||
== Пользовательская сеть == | == Пользовательская сеть == | ||
Строка 29: | Строка 29: | ||
'''Варианты использования:''' | '''Варианты использования:''' | ||
# Организация сети между двумя или более виртуальными машинами. Эта сеть не будет доступна ни другим виртуальным машинам, ни из реальной сети. | |||
# Организация сети между виртуальными машинами и хост-системой. От первого варианта отличается только добавлением адреса на мостовой интерфейс хоста. Если возникнет потребность, можно добавить реальный интерфейс в мост, тогда виртуальные машины будут подключены к реальной LAN. | |||
'''Требования:''' | '''Требования:''' | ||
* Настроенная и запущенная виртуальная машина; | * Настроенная и запущенная виртуальная машина; | ||
* Если вы не хотите запускать её из под root-а, то для вашего пользователя понадобятся права на чтение/запись в /dev/kvm; | * Если вы не хотите запускать её из под root-а, то для вашего пользователя понадобятся права на чтение/запись в /dev/kvm; | ||
* Вам понадобятся следующие программы | * Вам понадобятся следующие программы: | ||
/ | : /sbin/ip (пакет iproute2, обычно уже установлен) | ||
/ | : /sbin/brctl или /usr/sbin/brctl (пакет bridge-utils, устанавливается вместе с kvm) | ||
/ | : /sbin/tunctl или /usr/sbin/tunctl (пакет tunctl, нужно установить самостоятельно) | ||
Если вы не хотите запускать их из под root-a, то вам понадобится настроить sudo для их запуска. | |||
====Решение:==== | |||
=====Подготовка===== | |||
'''В Седьмой платформе''' | |||
* Во-первых, можно стартовать виртуальные машины с помощью libvirtd и управлять ими посредством virsh, при этом всё будет сделано автоматически. Нужно только правильно указать интерфейс (опция <tt>--network bridge</tt>). | |||
* Во-вторых, можно использовать мостовой интерфейс virbr0, который появляется в системе после установки пакета kvm. Интерфейсу уже назначен IP 192.168.122.1/24 (см. конфигурация ю файле /etc/libvirt/qemu/networks/default.xml). | |||
Перед запуском виртуальной машины создайте tap-интерфейс, добавьте его мост и потом используйте его при запуске kvm: | |||
sudo tunctl -u $USERNAME -t tap11 | |||
sudo brctl addif virbr0 tap11 | |||
sudo ip link set tap11 up | |||
kvm -m 1024 -no-fd-bootchk -localtime -show-cursor -hda w40G.img -net nic,vlan=0,macaddr=00:e0:4c:4f:35:82,model=rtl8139 -net tap,vlan=0,ifname=tap11,script=no | |||
Создать tap-интерфейсы и добавить их в мост можно и с помощью скриптов /etc/net (см. man etcnet). | |||
* В-третьих, можно использовать системный скрипт для запуска мостового интерфейса: /etc/init.d/bridge, достаточно создать нужное количество виртуальных интерфейсов, добавить их в /etc/sysconfig/bridge и запустить "службу" bridge: | |||
/etc/sysconfig/bridge: | |||
ip link | grep -q tap100: || tunctl -u $USERNAME -t tap100 | |||
INTERFACES="tap100" | |||
BRIDGE_INTERFACE="br0" | |||
Скрипт /etc/init.d/bridge при этом нельзя запускать автоматически при старте системы, но запускайте только вручную от пользователя с помощью sudo: | |||
sudo service bridge start | |||
В дальнейшем виртуальные машины нужно запускать с использованием этих готовых интерфейсов, например: | |||
kvm -m 1024 -no-fd-bootchk -localtime -show-cursor -hda w40G.img -net nic,vlan=0,macaddr=00:e0:4c:4f:35:81,model=rtl8139 -net tap,vlan=0,ifname=tap100,script=no | |||
'''В старых дистрибутивах''' | |||
* Нужно создать и сконфигурировать мост, например: | |||
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). | |||
=====Включение виртуальной машины в мост===== | |||
* Необходимо (стандартный вариант) | |||
- наличие двух сетевых карт на хосте '''eth0''' и '''eth1''' подключенных к локальной сети, | |||
- интерфейс '''eth0''' настроен и работает в сети, '''eth1''' включен настройки не обязательны | |||
* Создать мост '''br0''' (''некоторые разработчики считают, что команды '''tunctl''' и '''brctl''' устарели'') | |||
- создаем мост br0 штатными средствами | |||
'''''ip link add br0 type bridge''''' | |||
- добавляем физический итерфейс eth1 в мост | |||
'''''ip link set eth1 master br0''''' | |||
- поднимаем мостовой интерфейс br0 | |||
'''''ip link set up dev br0''''' | |||
-- вышеприведенных трех команд достаточно, чтобы при использовании virt-manager, поднять машину работающую в локальной сети | |||
-- указать в virt-manager (создать сеть на базе 'Общее устройство' и указать имя моста 'br0') | |||
* Создать скрипт qemu-ifup следующего содержания без sudo и "устаревших" утилит: | |||
- скрипт необходим для запуска qemu-system-x86_64 c параметрами в консоли | |||
- мост должен быть создан '''''ip link add br0 type bridge; ip link set eth1 master br0; ip link set up dev br0''''' | |||
- вносим и сохраняем в файл '''''mcedit /etc/qemu-ifup''''' и делаем его исполняемым '''''chmod +x /etc/qemu-ifup''''' следующий код: | |||
#!/bin/sh | |||
set -x | |||
switch=br0 | |||
if [ -n "$1" ];then | |||
ip tuntap add $1 mode tap user `whoami` | |||
ip link set $1 up | |||
sleep 0.5s | |||
ip link set $1 master $switch | |||
exit 0 | |||
else | |||
echo "Error: no interface specified" | |||
exit 1 | |||
fi | |||
- команда настройки сети для qemu-system-x86_64 | |||
-device e1000,netdev=net0,mac='DE:AD:BE:EF:87:0D' -netdev tap,id=net0,script=/etc/qemu-ifup | |||
- Общая команда запуска виртуальной машины может выглядеть так | |||
' | qemu-system-x86_64 -enable-kvm -accel accel=kvm,thread=multi \ | ||
-vga qxl \ | |||
-cpu core2duo \ | |||
-m 2048 \ | |||
-drive format=qcow2,file=/var/lib/libvirt/images/korpus_bs1.qcow2 \ | |||
-device e1000,netdev=net0,mac='DE:AD:BE:EF:87:0D' -netdev tap,id=net0,script=/etc/qemu-ifup | |||
* Создать скрипт qemu-ifup следующего содержания: | * Создать скрипт qemu-ifup следующего содержания (c использованием sudo, возможно необходимы предварительные настройки): | ||
#!/bin/sh | #!/bin/sh | ||
set -x | set -x | ||
Строка 52: | Строка 136: | ||
if [ -n "$1" ];then | if [ -n "$1" ];then | ||
/usr/bin/sudo | /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/bin/sudo /sbin/brctl addif $switch $1 | ||
exit 0 | exit 0 | ||
else | else | ||
Строка 70: | Строка 154: | ||
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 ... -net nic,vlan=0,macaddr=00:e0:4c:4f:35:81,model=rtl8139 -net tap,vlan=0,ifname=tap11,script=no | |||
'''Замечания:''' | '''Замечания:''' | ||
Строка 76: | Строка 165: | ||
* Вы можете создать общесистемный скрипт, назвав его в /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, которые требуются для работы моста. | |||
== Публичный мост == | == Публичный мост == | ||
Строка 165: | Строка 254: | ||
== Маршрутизация/iptables == | == Маршрутизация/iptables == | ||
Также вы можете объединить виртуальные машины tap-интерфесом в хост- | Также вы можете объединить виртуальные машины tap-интерфесом в хост-системе и настроить правила iptables в хост-система, чтобы она была маршутизатором и сетевым экраном для виртуальных машин. | ||
Настройки маршрутизации сводятся к созданию маршрута по умолчанию в виртуальной машине, указывающего на хост-систему, разрешение пересылки пакетов (IP forwarding) и настройки маршрута на tap-интерфейс виртуальной машины в хост-системе. | Настройки маршрутизации сводятся к созданию маршрута по умолчанию в виртуальной машине, указывающего на хост-систему, разрешение пересылки пакетов (IP forwarding) и настройки маршрута на tap-интерфейс виртуальной машины в хост-системе. | ||
Строка 188: | Строка 277: | ||
Другой способ настройки сети это VDE (Virtual Distributed Ethernet). | Другой способ настройки сети это VDE (Virtual Distributed Ethernet). | ||
== Известные баги == | |||
=== Отказы сети в гостевых Windows === | |||
Под большой нагрузкой сетевой интерфейс в гостевой машине с ОС Windows перестаёт принимать и отправлять пакеты в хост-машину. Такое поведение характерно для любой модели виртуального интерфейса и для любой версии Windows в QEMU-KVM как минимум до версии 1.4. | |||
Существует обходное решение: нужно заново проинициализировать сетевой интерфейс гостевой машины. Либо это можно сделать из гостевой ОС, либо из хост-машины парой команд virsh <tt>detach-interface</tt> и <tt>atttach-interface</tt> (и это надёжнее). Проверяем работоспособность при этом, очевидно, командой ping. | |||
Варианты скриптов для гостевой машины: [http://habrahabr.ru/post/176823/], [http://rickosborne.org/blog/2007/02/stupid-windows-tricks-restart-network-adapter-when-it-hangs/]. | |||
В скрипте для хоста перед проверкой пинга требуется проверить, работает ли гостевая ОС. | |||
[[category:Etcnet]] | [[category:Etcnet]] | ||
[[category:KVM]] | [[category:KVM]] | ||
{{Category navigation|title=Виртуализация|category=Виртуализация|sortkey={{SUBPAGENAME}}}} |
Текущая версия от 01:40, 21 апреля 2022
Настройка сети в 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", выполненная на хост-системе, скопирует файл в виртуальную машину. Также вы можете использовать другой адрес хост-системы для подключения.
Внутренний виртуальный мост
Варианты использования:
- Организация сети между двумя или более виртуальными машинами. Эта сеть не будет доступна ни другим виртуальным машинам, ни из реальной сети.
- Организация сети между виртуальными машинами и хост-системой. От первого варианта отличается только добавлением адреса на мостовой интерфейс хоста. Если возникнет потребность, можно добавить реальный интерфейс в мост, тогда виртуальные машины будут подключены к реальной LAN.
Требования:
- Настроенная и запущенная виртуальная машина;
- Если вы не хотите запускать её из под root-а, то для вашего пользователя понадобятся права на чтение/запись в /dev/kvm;
- Вам понадобятся следующие программы:
- /sbin/ip (пакет iproute2, обычно уже установлен)
- /sbin/brctl или /usr/sbin/brctl (пакет bridge-utils, устанавливается вместе с kvm)
- /sbin/tunctl или /usr/sbin/tunctl (пакет tunctl, нужно установить самостоятельно)
Если вы не хотите запускать их из под root-a, то вам понадобится настроить sudo для их запуска.
Решение:
Подготовка
В Седьмой платформе
- Во-первых, можно стартовать виртуальные машины с помощью libvirtd и управлять ими посредством virsh, при этом всё будет сделано автоматически. Нужно только правильно указать интерфейс (опция --network bridge).
- Во-вторых, можно использовать мостовой интерфейс virbr0, который появляется в системе после установки пакета kvm. Интерфейсу уже назначен IP 192.168.122.1/24 (см. конфигурация ю файле /etc/libvirt/qemu/networks/default.xml).
Перед запуском виртуальной машины создайте tap-интерфейс, добавьте его мост и потом используйте его при запуске kvm:
sudo tunctl -u $USERNAME -t tap11 sudo brctl addif virbr0 tap11 sudo ip link set tap11 up kvm -m 1024 -no-fd-bootchk -localtime -show-cursor -hda w40G.img -net nic,vlan=0,macaddr=00:e0:4c:4f:35:82,model=rtl8139 -net tap,vlan=0,ifname=tap11,script=no
Создать tap-интерфейсы и добавить их в мост можно и с помощью скриптов /etc/net (см. man etcnet).
- В-третьих, можно использовать системный скрипт для запуска мостового интерфейса: /etc/init.d/bridge, достаточно создать нужное количество виртуальных интерфейсов, добавить их в /etc/sysconfig/bridge и запустить "службу" bridge:
/etc/sysconfig/bridge:
ip link | grep -q tap100: || tunctl -u $USERNAME -t tap100 INTERFACES="tap100" BRIDGE_INTERFACE="br0"
Скрипт /etc/init.d/bridge при этом нельзя запускать автоматически при старте системы, но запускайте только вручную от пользователя с помощью sudo:
sudo service bridge start
В дальнейшем виртуальные машины нужно запускать с использованием этих готовых интерфейсов, например:
kvm -m 1024 -no-fd-bootchk -localtime -show-cursor -hda w40G.img -net nic,vlan=0,macaddr=00:e0:4c:4f:35:81,model=rtl8139 -net tap,vlan=0,ifname=tap100,script=no
В старых дистрибутивах
- Нужно создать и сконфигурировать мост, например:
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).
Включение виртуальной машины в мост
- Необходимо (стандартный вариант)
- наличие двух сетевых карт на хосте eth0 и eth1 подключенных к локальной сети, - интерфейс eth0 настроен и работает в сети, eth1 включен настройки не обязательны
- Создать мост br0 (некоторые разработчики считают, что команды tunctl и brctl устарели)
- создаем мост br0 штатными средствами ip link add br0 type bridge - добавляем физический итерфейс eth1 в мост ip link set eth1 master br0 - поднимаем мостовой интерфейс br0 ip link set up dev br0
-- вышеприведенных трех команд достаточно, чтобы при использовании virt-manager, поднять машину работающую в локальной сети -- указать в virt-manager (создать сеть на базе 'Общее устройство' и указать имя моста 'br0')
- Создать скрипт qemu-ifup следующего содержания без sudo и "устаревших" утилит:
- скрипт необходим для запуска qemu-system-x86_64 c параметрами в консоли - мост должен быть создан ip link add br0 type bridge; ip link set eth1 master br0; ip link set up dev br0 - вносим и сохраняем в файл mcedit /etc/qemu-ifup и делаем его исполняемым chmod +x /etc/qemu-ifup следующий код: #!/bin/sh set -x switch=br0 if [ -n "$1" ];then ip tuntap add $1 mode tap user `whoami` ip link set $1 up sleep 0.5s ip link set $1 master $switch exit 0 else echo "Error: no interface specified" exit 1 fi - команда настройки сети для qemu-system-x86_64 -device e1000,netdev=net0,mac='DE:AD:BE:EF:87:0D' -netdev tap,id=net0,script=/etc/qemu-ifup
- Общая команда запуска виртуальной машины может выглядеть так
qemu-system-x86_64 -enable-kvm -accel accel=kvm,thread=multi \ -vga qxl \ -cpu core2duo \ -m 2048 \ -drive format=qcow2,file=/var/lib/libvirt/images/korpus_bs1.qcow2 \ -device e1000,netdev=net0,mac='DE:AD:BE:EF:87:0D' -netdev tap,id=net0,script=/etc/qemu-ifup
- Создать скрипт qemu-ifup следующего содержания (c использованием sudo, возможно необходимы предварительные настройки):
#!/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 ... -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).
Известные баги
Отказы сети в гостевых Windows
Под большой нагрузкой сетевой интерфейс в гостевой машине с ОС Windows перестаёт принимать и отправлять пакеты в хост-машину. Такое поведение характерно для любой модели виртуального интерфейса и для любой версии Windows в QEMU-KVM как минимум до версии 1.4.
Существует обходное решение: нужно заново проинициализировать сетевой интерфейс гостевой машины. Либо это можно сделать из гостевой ОС, либо из хост-машины парой команд virsh detach-interface и atttach-interface (и это надёжнее). Проверяем работоспособность при этом, очевидно, командой ping. Варианты скриптов для гостевой машины: [1], [2]. В скрипте для хоста перед проверкой пинга требуется проверить, работает ли гостевая ОС.