Ключевые слова:virtual, virtualbox, linux, (найти похожие документы)
From: Leonid Evdokimov <leon@darkk.net.ru.>
Date: Mon, 3 Feb 2010 17:02:14 +0000 (UTC)
Subject: Руководство по настройке сети в VirtualBox
Оригинал: http://darkk.livejournal.com/43813.html
Неоднократно я встречал вопросы людей, которые не могут по той или иной
причине правильно настроить работу с сетью в виртуальной машине
VirtualBox используя Linux в качестве HOST-машины, поэтому и
появилось это руководство.
VirtualBox-2.0.4 (я использую OSE редакцию) предоставляет следующие
возможности работы с сетью при настройке виртуального сетевого
адаптера:
* NAT
* Internal Network
* Host interface
И не смотря на то, что VirtualBox предоставляет свои скрипты для
управления этими интерфейсами (VBoxAddIf, VBoxDeleteIf и VBoxTunctl), я
рассмотрю подробнее каждый из способов в контексте интеграции его в
систему управления сетевыми интерфейса дистрибутива на примере Gentoo
-- это позволит вам более гибко сконфигурировать сетевые интерфейсы не
нарушая методы конфигурации сети принятые в вашем дистрибутиве.
NAT
NAT -- самый простой из способов подключения виртуальной машины к сети.
Виртуальная машина будет видна в реальной сети под тем же адресом, что
и HOST-машина, т.к. VirtualBox будет производить трансляцию сетевых
адресов (NAT).
Из известных проблем с NAT в VirtualBox можно отметить тот факт, что
трансляция производится только для протоколов TCP и UDP,
соответственно, банальный ping работать будет не корректно, и,
например, работы VPN основного на pptp ожидать тоже не приходится.
Еще один минус состоит в том, что нетривиально становится подключиться
к сетевым сервисам самой виртуальной машины. Как ниже написал
[info] curl_init, это возможно с помощью использования
VBoxManage, например для проброса TCP-порта host:2223 на guest:2222
нужно сделать:
$ VBoxManage setextradata guest0 "VBoxInternal/Devices/pcnet/0/LUN#0/Config/fwdname/Protocol" TCP
$ VBoxManage setextradata guest0 "VBoxInternal/Devices/pcnet/0/LUN#0/Config/fwdname/GuestPort" 2222
$ VBoxManage setextradata guest0 "VBoxInternal/Devices/pcnet/0/LUN#0/Config/fwdname/HostPort" 2223
Но мне такой способ кажется ужасным чуть менее чем полностью. К тому же
он требует перезапуска виртуальной машины для того, чтоб изменения
вступили в силу.
Резюмируя, могу порекомендовать использование NAT в VirtualBox только в
том случае, если требования к доступу к сети из виртуальной машины
ограничиваются серфингом и почтой. :)
Internal Network
Используется для взаимодействия виртуальных машин между собой и
представляет некоторое подобие виртуального сетевого коммутатора
(switch), который никак не взаимодействует с реальным миром. В
принципе, всё, что можно сделать с помощью Internal Network, может быть
реализовано и на базе Host Interface, но у данного способа есть два
преимущества (согласно руководству пользователя VirtualBox):
* Безопасность -- пакеты не проходят через сетевую подсистему
host-машины и, соответственно, их технически сложнее прослушать.
* Скорость -- ввиду того, что не эксплуатируется сетевой стек
физической машины можно достичь несколько большей
производительности.
На самом же деле безопасность мнимая -- т.к. пользователь имеющий
доступ администратора к host-машине может исследовать любой участок
памяти и, соответственно, вопрос лишь в увеличении технической
сложности прослушивания. Возможен также вариант, что для прослушивания
трафика Internal Network достаточно даже прав пользователя, который
запускает виртуальную машину.
Прирост производительности по сравнению с Host Interface мне не
известен, возможно, он исключительно теоретический.
Но с другой стороны в руководстве не упомянут еще один существенный
плюс -- простота конфигурации виртуальной сети между виртуальными
машинами.
В любом случае, данный способ не позволяет подключить виртуальную
машину к физической сети и интереса для нас более не представляет.
Host interface
"Но то все присказка была, а теперь начинается сказка".
По настоящему широкие возможности конфигурации сети дает использование
Host interface и именно с ним обычно связаны наибольшие трудности.
Сразу оговорюсь, все примеры конфигурирования сети будут приводиться в
двух вариантах: для init-скриптов Gentoo (baselayout-1) и
консольных инструментов для конфигурации сети, т.е. ifconfig, brctl,
tunctl и прочих.
Существует две типичных конфигурации сети в таком случае:
непосредственное подключение виртуальной машины к реальной сети через
мост (bridge) или использования NAT, но уже не описанными выше
средствами VirtualBox, а с использованием NAT в ядре Linux. Эти две
конфигурации мы и рассмотрим.
Для настройки tun/tap интерфейса и bridge нам потребуется tunctl и
brctl входящие в пакеты sys-apps/usermode-utilities и
net-misc/bridge-utils соответственно.
Также вместо tunctl можно использовать openvpn или VBoxTunctl,
поставляемый с VirtualBox: "VBoxTunctl is identical to tunctl from
Usermode Linux except for the name". Но init-скрипты Gentoo на
настоящий момент приспособлены для openvpn или tunctl и про
существование VBoxTunctl не знают.
Предположим, что физическая сеть у нас подключена в host-системе через
интерфейс eth0 и host interface у нас будет назван tap_vbox. Имя
tap_vbox и нужно будет использовать в качестве имени сетевого
интерфейса в VirtualBox.
Host interface и сетевой мост
Приведу выдержку из своего /etc/conf.d/net
tuntap_tap_vbox="tap"
config_tap_vbox=( "null" )
tunctl_tap_vbox="-u darkk"
config_eth0=( "null" )
depend_br0() {
need net.eth0 net.tap_vbox
}
bridge_br0="eth0 tap_vbox"
config_br0=( "dhcp" )
После чего я запускаю sudo /etc/init.d/net.br0 start, с помощью
/etc/init.d/net.br0 status убеждаюсь, что bridge запущен и работает
(это стоит сделать ввиду того, что некоторая часть инициализации может
быть запущена в фоновом режиме), и загружаю виртуальную машину. Сеть в
виртуальной машине запускается и работает.
Стоит обратить внимание на то, что интерфейс eth0 не конфигурируется, а
вместо него настраивается br0 (в данном случае, по DHCP). И то,
настройка интерфейса br0 нужна для того и только для того, чтобы
подключить host-систему к сети, подключенной к eth0.
В командной строке те же результаты достигаются примерно такой
последовательностью команд:
$ sudo ifconfig eth0 up
$ sudo tunctl -u $USER -t tap_vbox
Set 'tap_vbox' persistent and owned by uid 1000
$ sudo ifconfig tap_vbox up
$ sudo brctl addbr br0
$ sleep 1m; brctl show
$ sudo brctl addif br0 eth0
$ sudo brctl addif br0 tap_vbox
После чего сеть опять таки работает.
Уверен, вы удивлены -- зачем же сделано sleep 1m; brctl show, объясняю
выдержкой из /var/log/messages:
sudo: darkk : TTY=pts/5 ; PWD=/home/darkk ; USER=root ; COMMAND=/sbin/brctl addbr br0
rc-scripts: We only hotplug for ethernet interfaces
Такая запись появлялась в случае, если в /etc/conf.d/net уже
существовала конфигурация моста для интерфейса br0, при этом мост
удалялся через несколько секунд после запуска, что выглядело достаточно
странно.
Можно было бы просто удалить полностью информацию о br0 из
/etc/conf.d/net, но тогда появляется другой сюрприз:
sudo: darkk : TTY=pts/5 ; PWD=/home/darkk ; USER=root ; COMMAND=/sbin/brctl addbr br0
rc-scripts: Configuration not set for br0 - assuming DHCP
dhcpcd[29405]: br0: dhcpcd 4.0.2 starting
dhcpcd[29405]: br0: broadcasting for a lease
dhcpcd[29405]: br0: timed out
dhcpcd[29405]: br0: trying to use old lease in `/var/lib/dhcpcd/dhcpcd-br0.lease'
dhcpcd[29405]: br0: probing for an IPV4LL address
dhcpcd[29405]: br0: checking 169.254.215.238 is available on attached networks
dhcpcd[29405]: br0: using IPv4LL address 0.0.0.0
В итоге на время экспериментов я просто добавил в /etc/conf.d/net
строчку:
config_br0=( "null" )
и закоментировал все другие упоминания о конфигурации br0.
Если же всё настроено и должно работать, но не работает, то стоит еще
проверить настройки sysctl -a | grep ^net.bridge.bridge-nf и настройки
iptables, возможно, пакеты блокируются на этом уровне.
Для работы моста включение net.ipv4.ip_forward не требуется, если
продвинутая фильтрация пакетов на мосту вам не нужна -- все опции
net.bridge.bridge-nf* также можно отключить сбросив их в ноль.
Еще одна занимательная грабля состоит в том, что для построения моста
не получается использовать беспроводной адаптер из-за особенностей
работы wi-fi: при использовании моста MAC-адреса пакетов не меняются,
соответственно, точка доступа будет получать как пакеты с MAC-адресом
виртуальной сетевой карты так и с MAC-адресом вашей настоящей карты --
у меня есть подозрение, что при работе с wi-fi в managed режиме (при
использовании точки доступа) такая ситуация не предусмотрена, т.к.
MAC-адрес виртуальной сетевой карты должен быть предварительно
зарегистрирован на точке доступа (associated with Access Point).
За более подробной информацией рекомендую поизучать wiki проекта
aircrack-ng, например статью про утилиту aireplay-ng.
Один из способов обойти это ограничение -- настроить arp-proxy, но
работу с arp-proxy я описывать не буду. Другой способ -- использовать
NAT вместо моста, о чем и написано в следующем параграфе.
Host interface и NAT
И снова выдержка из моего /etc/conf.d/net
tuntap_tap_vbox="tap"
config_tap_vbox=( "192.168.128.1/24" )
tunctl_tap_vbox="-u darkk"
Или альтернативный путь:
$ sudo tunctl -u $USER -t tap_vbox
Set 'tap_vbox' persistent and owned by uid 1000
$ sudo ifconfig tap_vbox 192.168.128.1 up
После чего нужно настроить в виртуальной машине использование
192.168.128.1 в качестве шлюза по-умолчанию, присвоить виртуальной
машине IP-адрес (в guest-системе), например, 192.168.128.2 и настроить
NAT на host-машине по любому другому руководству.
Если другие руководства читать невыносимо лень -- можете попробовать
такие команды (но я настоятельно рекомендую всё-таки изучить
какое-нибудь другое руководство):
$ sudo sysctl net.ipv4.ip_forward=1
$ sudo iptables -t nat -I POSTROUTING -o eth0 -j MASQUERADE
$ sudo iptables -t filter -I FORWARD --in-interface tap_vbox --out-interface eth0 \
--source 192.168.128.2 -j ACCEPT
$ sudo iptables -t filter -I FORWARD --in-interface eth0 --out-interface tap_vbo \
--destination 192.168.128.2 -j ACCEPT
Если же вам надо, чтобы виртуальная машина была полноправным членом
сети -- можно добавить alias на eth0 и настроить несколько более
сложный NAT, но это уже выходит за рамки данного HOWTO.
Началась подписка на журнал Linux Format на 2010 год.
Спешите оформить подписку на единственный в России ежемесячный журнал о Linux!
Все, оформившие подписку на печатную версию журнала, получают диск с архивом журнала Linux Format за
2005-2009г. в подарок. Также в подарок вы получаете именную электронную версию в формате PDF.
Теперь вы можете приступить к чтению журнала сразу в момент выхода свежего номера, не дожидаясь,
пока вам доставят бумажную версию.
Кроме того, все, оформившие подписку на первую половину или весь 2010 год в
интернет-магазине ГНУ/Линуксцентра, автоматически становятся участниками розыгрыша ценных призов: