Подключение ВМ qemu в локальную сеть

Материал из Gentoo Linux Wiki

Перейти к: навигация, поиск
Вернуться в раздел советов

Содержание

[править] Введение

Настраивал я все это дело в последней (8) версии qemu, но думаю, что и в 6 принцип тот-же. В результате приведенных ниже настроек получаются две сети: реальная сеть (192.168.1.0/24) и виртуальная сеть (192.168.5.0/24), между которыми маршрутизатором является хост компьютер.


[править] Настройка ядра

Сеть поднимается так: Я делал сеть с использованием TUN/TAP интерфейса. Для этого ядро должно поддерживать этот интерфейс (я собрал его модулем):

Code: Конфигурация ядра
hj@hj hj $ zcat /proc/config.gz | grep CONFIG_TUN
CONFIG_TUN=m
или
CONFIG_TUN=y

Если результат отличается то вам придется пересобрать ядро с поддержкой TUN/TAP интерфейса.

После подгрузки модуля

Code: Подгрузка модуля
# modprobe tun

появляется устройство /dev/net/tun. Я выставил на него права 666.


[править] Запуск qemu

Настройка этого интерфейса при запуске qemu настраивается при помощи скриптов /etc/qemu-ifup и /etc/qemu-ifup-sudo:

Файл: /etc/qemu-ifup
#!/bin/sh
sudo /etc/qemu-ifup-sudo $@
Файл: /etc/qemu-ifup-sudo
#!/bin/sh
/sbin/ifconfig $1 192.168.5.1
Примечание: Разбиение на два скрипта нужно лишь для удобства последующего редактирования скрипта /etc/qemu-ifup-sudo без перенастройки sudo. Если вы разрешили пользователю выполнять ЛЮБЫЕ команды через sudo, то такого разбиения не требуется

Не забудьте сделать их исполняемыми:

# chmod +x /etc/qemu-ifup*

Для работы этих скриптов надо правильно настроить sudo (для справки см. man sudo, man visudo, man sudoers). Например, можно написать в конце /etc/sudoers следующую строку:

Файл: /etc/sudoers
%users  ALL = NOPASSWD: /etc/qemu-ifup-sudo *

Для того, чтобы виртуальная машина при запуске видела реальную машину по сети qemu надо запустить следующим образом:

Code: Запуск ВМ
$ qemu -hda ./win2kas.hd -net nic,vlan=0 -net tap,vlan=0

Эта команда говорит qemu, что надо создать сетевую карту в виртуальной машине, подключив ее к виртуальной сети 0 (-net nic,vlan=0) и поднять tap интерфейс на хост компьютере, также подключив его к виртуальной сети 0 (-net tap,vlan=0). Адрес для tap интерфейса берется из скрипта /etc/qemu-ifup (см. выше). Адрес сетевой карты в виртуальной машине конфигурируется стандартными средствами гостевой ОС и должен находится в той-же сети, что и адрес tap интерфейса. Например у меня настроено так: Адрес tap интерфейса: 192.168.5.1, а адрес сетевой карты в виртуальной машине: 192.168.5.2. Если планируется использовать только один сетевой адаптер в ВМ, то параметр vlan можно не указывать.

[править] Маршрутизация

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

Code: Включение маршрутизации
# echo 1 > /proc/sys/net/ipv4/ip_forward

в результате получается следующая конструкция сети:

Code: Схема полученной сети
+-----+  +----------------+  +---------+
| LAN |--|eth0  HOST  tap0|--| VM Qemu |
+-----+  +----------------+  +---------+

т.е. хост компьютер становится маршрутизатором между виртуальной сетью и реальной сетью. Для того, чтобы гонять между этими сетями широковещательные пакеты и иметь общую arp таблицу, можно на хост компьютере поднять arp proxy. Обращаться к ВМ можно по адресу 192.168.5.2.

Чтобы сделать так, что из сети видно ВМ так, как будто она подключена к реальной сети напрямую и имеет свой IP адрес можно сделать так:

поднять альяс eth который будет адресом нашей ВМ:

Code: eth0:1
# ifconfig eth0:1 192.168.1.50 up

ВНИМАНИЕ, адрес eth0:1 должен находиться в диапазоне адресов вашей локальной сети, в моем случае сеть имеет диапазон адресов 192.168.1.1-192.168.1.254.

Затем используя пакет iptables настроить nat для нашей ВМ:

Code: Правила iptables
# iptables -t nat -A POSTROUTING -s 192.168.5.2 -j SNAT --to-source 192.168.1.50
# iptables -t nat -A PREROUTING -d 192.168.1.50 -j DNAT --to-destination 192.168.5.2

После этих манипуляций ВМ будет видна из реальной сети по адресу 192.168.1.50.

[править] Окончательная настройка

Для того, чтобы интерфейс eth0:1 и настройки iptables производились при старте qemu можно добавить эти строки в скрипт /etc/qemu-ifup-sudo.

Code: Новый скрипт /etc/qemu-ifup-sudo
#!/bin/sh
/sbin/ifconfig $1 192.168.5.1
ifconfig eth0:1 192.168.1.50 up
iptables -t nat -A POSTROUTING -s 192.168.5.2 -j SNAT --to-source 192.168.1.50
iptables -t nat -A PREROUTING -d 192.168.1.50 -j DNAT --to-destination 192.168.5.


[править] Заключение

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

С наилучшими пожеланиями HJ.


[править] Альтернативная настройка с помощью Bridge

[править] Конфигурация ядра

Также, как и в предыдущем случае, нам понадобится включить поддержку tun/tap:

Linux Kernel Configuration:
Device Drivers --->
  Network device support --->
    Network device support (NETDEVICES [=y]) --->
      <M> Universal TUN/TAP device driver support
# echo tun >> /etc/modules.autoload.d/kernel-2.6
# modprobe tun

Ещё необходимо включить Bridhing:

Linux Kernel Configuration:
Networking --->
  Networking support (NET [=y]) --->
    Networking options --->
      <M> 802.1d Ethernet Bridging
# echo bridge >> /etc/modules.autoload.d/kernel-2.6
# update-modules
# modprobe bridge

[править] Настройка bridge

Во-первых, надо сделать

# emerge bridge-utils

Во-вторых, меняем настройки /etc/conf.d/net

Например, если у вас там раньше было что-то типа:

Файл: Старый /etc/conf.d/net
config_eth0=( "dhcp" )
dhcpcd_eth0="-t 10"
fallback_route_eth0=( "default via 192.168.1.1" )

То теперь надо написать:

Файл: Новый /etc/conf.d/net
bridge_br0="eth0"
config_eth0=( "null" )

config_br0=( "dhcp" )
dhcpcd_br0="-t 10"
fallback_route_br0=( "default via 192.168.1.1" )

brctl_br0=( "setfd 1" "sethello 1" "stp on" )
depend_br0() {
        need net.eth0
}

Подробности см. в /etc/conf.d/net.example и en:HOWTO_setup_a_gentoo_bridge

В-третих, добавляем нужные скрипты в автозапуск и удаляем ненужные:

# ln -sf /etc/init.d/net.lo /etc/init.d/net.br0
# rc-update add net.br0 default
# rc-update del net.eth0
Примечание: Мы удаляем net.eth0 из автозагрузки, потому что он будет подниматься автоматически в нужное время как зависимость net.br0.

Теперь, либо перезагружаемся, либо останавливаем net.eth0 и запускаем net.br0, а также все зависимые службы.

[править] Настройка qemu

Также как и впредыдущем варианте настройки, пишем два скрипта /etc/qemu-ifup и /etc/qemu-ifup-sudo:

Файл: /etc/qemu-ifup
#!/bin/sh
sudo /etc/qemu-ifup-sudo $@
Файл: /etc/qemu-ifup-sudo
#!/bin/sh
echo "Executing /etc/qemu-ifup"
echo "Bringing up $1 for bridged mode..."
/sbin/ifconfig $1 0.0.0.0 promisc up
echo "Adding $1 to br0..."
/sbin/brctl addif br0 $1

Делаем эти файлы исполняемыми и настраиваем sudo (см. выше)


[править] Запуск qemu

В строке запуска qemu надо всего лишь добавить два параметра: -net nic и -net tap. Вот, например, как это выглядит у меня:

Code: Запуск qemu

$ qemu -m 256 -localtime -net nic -net tap ~/qemu/hda2k.img

Вот и всё! Донастройка нового сетевого интерфейса производится уже внутри гостевой ОС.

Личные инструменты