15 мая 2008 г.

VirtualBox HOW-TO - Строим мосты

Сегодня мы поговорим о работе локалки в виртуальном окружении VirtualBox. Вводные слова на предмет "как я докатился до жизни такой" можно поглядеть здесь. С сетью здесь не так все гладко как в vmware. Если там уж нат, то нат, работает как часы сразу же после инсталляции. Гостевая ОС тут же начинает видеть Хост-систему, а то и дальше, в зависимости уже от настроек последней. Если мост (юзается отдельный ифейс), буть добр, в гостевой ОС пропиши требуемый ип, если он в вашей сети не выдается динамически, и работай. в VirtualBox'e не так все user-friendly. NAT здесь убогий донельзя. НА каждый ифейс выдается диапазон 10.0.x.0, где x=2,3,4.... Шлюзом становится нечто под адресом 10.0.x.15, оно же DHCP. Как со всем этим выйти во внешнюю относительно гостевой ОС сеть - непонятно, ибо по умолчанию никакх интерфейсов VBox не создает. А вручную чтой-то не попробовал. К тому же в руководстве что то блеется по поводу проброса нужных портов во "внешний мир". В общем, если NAT-вопрос допилю, то отдельный man будет иметь место.
Сейчас же речь пойдет о Host Interface Networking and Bridging, попросту о мостовом соединении гостевой и хостовой ОС. Здесь все более-менее понять можно, хотя до меня и не с первого раза осенило на предмет "как, бля, это запустить??". Поехали ;)
Эксурса в теорию не провожу ввиду того, что теория эта отлично изложена в User Manual, доступного для скачивания на той же странице, где и сам дистрибутив. Поэтому или мне тут безоговорочно верим, или идем читать ;)
Для работы моста в linux-системе требуется доступ пользователя, от имени которого будет запущен VBox, к туннельному устройству /dev/net/tun . С правами мучаться незачем, поэтому
delayer@inspire:~> ls -l /dev/net/tun
crw-rw-rw- 1 root root 10, 200 Окт 7 2007 /dev/net/tun
delayer@inspire:~> su
Пароль:
inspire:/home/delayer # chown root.vboxusers /dev/net/tun
То бишь всех пользователей, что будут рулить виртмашинами, пихаем в группу vboxusers. На собственность root'a посягать незачем.
Пару слов о том, что вообще престоит сделать.
Мост в VBox можно сделать постоянными (появляющимися при загрузке hostОS) - permanent, и динамическими, живущими только до ребута - dynamic. Я думаю, понятен момент, что мост создается на базе физического сетевого устройства, например eth0. Далее создается виртуальное устройство vbox0 (1,2,3...), которое будет нами включено в мост (bridge) с eth0. Управление vbox-интерфейсами осуществляется с помощью трех утилит:
  • VBoxAddIF, которая создает перманентные TAP ифейсы
# VBoxAddIF vbox0 user bridge0
где user - тот, кто будет это ифейс юзать (в моем случае пользователь virtual), а bridge0 - мостовой интерфейс, созданный ранее;
  • VBoxDeleteIF, которая, соответственно, делит созданные ранее vboxX устройства
# VBoxDeleteIF vbox0
  • VBoxTunctl - с ее помощью можно создавать/удалять временные (dynamic) интерфейсы
# VBoxTunctl -t vbox0 -u user ## создали
# VBoxTunctl -d vbox0 ## удалили

Теперь чуть больше частности.
В качестве hostOS будет openSuSE. Для создания моста нам потребуется пакетик bridge-utils, поэтому его нужно установить =)
# yast2 --install bridge-utils
Для того, чтобы можно было управлять мостовым интерфейсом через ifup/ifdown, требуется создать конфиг-файл для bridge0 (естественно с правами root'a) и внести туда следующие изменения:
создать конфиг файл для ифейса моста /etc/sysconfig/network/ifcfg-bridge0 c примерно таким текстом
inspire:/# vi /etc/sysconfig/network/ifcfg-bridge0
BOOTPROTO='static' #IP-адрес задается статически
#DHCLIENT_TIMEOUT=20 # если выбрана DHCP-раздача, раскомментить
BROADCAST='' # оставляем на
MTU='' # усмотрение ОС
NAME='bridge interface' # произвольное имя интерфейса
BRIDGE='yes' # ифейс выполняет функции моста
BRIDGE_PORTS='wlan0' # "моститься" будем на базе wlan0
IPADDR='169.254.0.1' # IP-адрес
NETMASK='255.255.255.0' # маска подсети (в моем случае я просто
# беру параметры настроек wlan0
REMOTE_IPADDR=''
STARTMODE='auto' # интерфейс поднимается при старте hostOS
USERCONTROL='no' # контроль осуществляется системой
То бишь мы указываем, что наш интерфейс будет иметь статический адрес такой-то, маску такую-то (если подразумевается DHCP, то BOOTPROTO='dhcp' это будет bridge-интферфейс, стартующий при запуске системы. А дальше ifdown wlan0 && ifup bridge0.
В моей системе wlan0 - беспроводной интерфейс, на котором висит DHCP-сервер, раздающий адреса для подключаемых в режиме ad-hoc пользователей. Так как вновь появившийся bridge0 взял на себя все параметры wlan0 (сам wlan0 запускается без адреса, маски и так далее, см. ifconfig), то и DHCP-сервер пришлось переконфигурировать на прослушивание brigde0. В этом двойная выгода - и wi-fiподключения не остались без адресов, и все создаваемые vboxX интерфейсы (а соответственно и внутренние интерфейсы гостевых ОС виртуальной машины) видят DHCP, тем самым могут без проблем получить адрес. После этого они будут находиться в раных условиях с wi-fi подключениями - в моем случае это маршрутизация как внутри локалки, так и сразу в интернет. Ну разве не сказка? ;)
Однако, отвлеклись. Далее создается хост-интерфейс vbox0 согласно вышеизложенной теории
inspire:/# VBoxAddIF vbox0 virtual bridge0
После этого он аттачится к вирт машине или консольно
inspire:/# VBoxManage modifyvm "Debian_4.0_r0" -hostifdev1 vbox0
или графически
Машина - Свойства - Сеть - Включить Адаптер, и в поле Имя интерфейса впаять vbox0
Все, стартуем виртуальную машину, запускаем там любой конфигуратор сети и говорим имеющемуся там сетевому интерфейсу получить данные по DHCP. Или выставляем статически, исходя из IP-конфигурации brigde0 (в том плане, чтобы они друг друга видели).
Каждая гостевая ОС использует свой vboxX интерфейс, поэтому если машин несколько, то насоздавать виртуальных интерфейсов следует согласно потребностям. Bridge0 дублировать не нужно.

3 комментария:

  1. ## Посе установки пакета перед первым запуском VirtualBox
    ## нам необходимо добавить пользователя из-под которого будет работать (в VirtualBox'е) в группу vboxusers командой

    gpasswd -a (пользователь) vboxusers

    ##Create TAP interface vbox0

    VBoxTunctl -t vbox0 -u (пользователь)

    ## (vbuser) имя пользавателя под которым вы заходите в систему и запускаете VirtualBox
    ## Create a br0 bridge

    brctl addbr br0

    ##Make your real network interface be promiscuous
    #ifconfig eth1 0.0.0.0 promis

    fconfig br0 192.168.1.1

    ## Link TAP vbox0 to bridge br0

    brctl addif br0 vbox0

    ## Activate TAP interface

    ifconfig br0 up
    ifconfig vbox0 up

    ## Change the permission of /dev/net/tun

    chmod 0666 /dev/net/tun

    ### проверяем мостовое соединение

    brctl show

    ### должно показать такое сообщение
    # bridge name bridge id STP enabled interfaces
    # br0 8000.00ffd3d3e48c yes vbox0

    ## перезапускаем сеть
    ## проверяем таблицу роутинга

    route -e

    ## настраиваим NAT в таблице iptables

    ОтветитьУдалить
  2. А как настроить виртуальный интерфейс чтобы он загружался каждый раз? Дело в том что после каждой перезагрузки приходиться набирать VBoxAddIF tap0 user br0.

    ОтветитьУдалить
  3. доки вибокса говорят об обратном - AddIf должен добавлять ифейс перманентно, а вышеозначенный Tunctl - на время сеанса.

    ОтветитьУдалить