4 июл. 2012 г.

Работа с сетями в VirtualBox


Это перевод статьи Робина Катлинга (Robin Catling) из 61 номера журнала Full Сircle. Прошу прощения у читателей за некоторую грубость перевода, давно не было практики, но надеюсь смысл и тема будут понятны и раскрыты.

Все началось с того, что мне понадобилось запустить Wordpress в песочнице. Самым простым было создание виртуального Ubuntu 11.10 сервера в качестве гостевой системы внутри VirtualBox хоста. Затем я понял, что знаю о сетях гораздо меньше, чем я думал; тематика полная пакетов, свитчей и роутинга. Еще меньше я знал о сетях в VirtualBox, где все виртуализовано программно. Несколько попыток и ускоренный курс сетей чуть позже, миссия выполнена, чтобы уберечь вас от моих ошибок, и вот, что я обнаружил.

Настройки сети в VirtualBox

Установим любую версию VB, начиная с версии 3.0, и увидим, что окно настроек выглядит примерно одинаково.

Для любой из своих виртуальных машин нажимаем Настройки > Сеть. Это дефолтный вид.

У любой виртуальной машины может быть до четырех сетевых адаптеров, которые можно включить при необходимости. Большую часть времени вам пригодится только один. Обычно, когда вы создаете виртуальную машину, вы можете оставить за VB право создать один сетевой адаптер, который позволит вам выходить в Интернет.

Вам могут пригодиться несколько адаптеров различных типов, или адаптеры одного типа с разными настройками, согласно тому, как вы будете использовать виртуальную машину и сети — физические и виртуальные — к которым она подключена.

Для моего виртуального веб-сервера, на котором запущен Wordpress, все немного сложнее, поэтому приступим… Тип адаптера (Adapter type) определяет тип виртуального оборудования доступного вашей виртуальной машине (VM). VB постарается сделать так, чтобы выбранный вами виртуальный адаптер хорошо работал с любой физической сетевой картой, которая стоит у вас на хост машине. Откроем меню Advanced и увидим дополнительные опции. Я пройду по настройкам намеренно не по порядку, начиная с Adapter Type.

Adapter Type: VB постарается эмулировать некоторые распространенные типы сетевых карт, для которых у него есть драйверы и протоколы. PCnet-FAST III стоит по умолчанию, хотя я всегда выбираю Intel PRO/1000MT адаптеры, если ищу хорошей совместимости с аппаратным обеспечением Intel. Есть две серверные версии с большой пропускной способностью, если вы собираетесь запустить свою VM в производственной среде. Владельцам десктопов не стоит беспокоиться об этом. Если у вас проблемы с одним адаптером, попробуйте другой, включая PCnet-FAST II для старых машин.

Mode: довольно колоритно звучащий «Promiscuous mode» должен управлять поведением виртуального маршрутизатора, используемого Внутренней Сетью; Сетевым мостом (Bridged) и Виртуальным адаптером хоста (Host Only). Вы можете заставить сетевой порт VM принимать трафик, направленный другим виртуальным машинам, или, даже хосту, дополнительно к трафику направленному на эту виртуальную машину. Promiscuous mode - это та штука, которую 99% пользователей не нужно трогать, и существует для того, чтобы диагностировать причины возникновения некоторых сетевых проблем.

MAC Address: сокращение от Media Access Control, MAC-адрес это аппаратный адрес, который является уникальным идентификатором каждого сетевого ресурса или нода сети. Это уникальный идентификационный номер, который обычно жестко прописан в физическом сетевом адаптере. VirtualBox генерирует MAC-адреса сетевых карт виртуальных машин.

Есть небольшая кнопка справа, которая генерирует новый MAC-адрес; если вы скопируете виртуальную машину, ей нужен будет свой уникальный MAC-адрес для работы в вашей виртуальной сети наряду с оригиналом.

Чекбокс «Кабель подключен» (Cable connected) делает тоже самое, что и физическое подключение или отключение кабеля. Эта опция подключает виртуальный адаптер к виртуальной сети. Он отличается от самой верхней опции «Включить сетевой адаптер» (Enable network adapter), которая позволяет установить или извлечь сетевой адаптер из машины.

Наконец кнопка «Проброс портов» (Port forwarding) открывает другой диалог, позволяющий определить правила перенаправления трафика для адаптера; как трафик определенного типа перенаправляется между хостом и гостевой машиной. Это применимо лишь к нескольким типам подключения, которые будут рассмотрены ниже. Тип подключения определяется опцией «Тип подключения» (Connection type) (с дополнительной опцией «Имя»), которая является краеугольным камнем работы с сетью в VirtualBox и которая создала мне множество проблем в начале моего эксперимента.

«Здесь обитают драконы»

Существует четыре типа подключений и множество возможных комбинаций настроек. Это как раз то место, где сетевые настройки VirtualBox могут показаться средневековым волшебством. Следовать правильному варианту для достижения вашей цели — легко. Можно найти даже несколько решений для достижения одной и той же цели.

Типы подключения

Здесь можно найти четыре типа подключения:

- NAT Network Adress Translation
- Сетевой мост (Bridged)
- Виртуальный адаптер хоста (Host Only)
- Внутренняя сеть (Internal Network)

«Не подключен» также тип, но используется для устранения проблем с адаптером. В этом режиме VirtualBox говорит гостевой системе, что адаптер есть, но подключения нет.

Network Adress Translation NAT

NAT позволяет гостевой машине выходить в Интернет, но через приватный IP адрес, который нельзя увидеть с хоста или другого места вашей физической сети. Он позволяет вам просматривать веб, скачивать файлы и просматривать почту внутри гостевой машины, но окружающий мир никогда не сможет взаимодействовать с гостевой машиной напрямую.

Когда гостевая машина посылает IP пакет на удаленную машину, сервис NAT VirtualBox перехватывает этот пакет, извлекает из него TCP/IP сегменты, меняет IP адрес на IP адрес машины-хоста и отправляет его. Внешний мир видит лишь IP хост-машины. Хост-машина получает ответ и перенаправляет его гостевой машине.

Например, в вашей домашней сети ваши хост и другие физические машины, обычно имеют адреса начинающиеся с 192.168.x.x. В VirtualBox NAT адаптерах адреса начинаются с 10.0.2.1, и далее до 10.0.2.24 в так называемой подсети. Обычно она не соединена с основной сетью, следовательно в подсеть нельзя попасть с хост-машины. Ваша гостевая машина может выходить в Интернет за обновлениями, веб-серфингом, но невидима для остальной вашей сети.

Руководство к VirtualBox более прозрачно:
«В режиме NAT гостевым сетевым интерфейсам назначаются IP адреса из диапазона 10.0.x.0/24 по умолчанию, где x отвечает за экземпляр NAT интерфейса +2. Поэтому x=2 когда активен только один экземпляр NAT. В этом случае гостю назначается адрес 10.0.2.15, гейту — 10.0.2.2, а сервер имен можно найти на 10.0.2.3.» (Oracle Corporation, 2012, Chapter 9)
NAT полезен в случае, когда вам не важно, какой адрес будет использовать гостевая машина. Вам нужно будет заняться дополнительным конфигурированием, когда понадобится перенаправить трафик или открыть сервисы вроде веб-сервера для внешнего мира. Кроме того, вы не можете обеспечить расшаривание файлов и папок в этой сети.

Сетевой мост (Bridged Adapter)

В режиме Сетевого моста, виртуальные машины ведут себя как любой другой компьютер подключенный к сети, в которой находится хост-машина; сетевой мост соединяет реальную и виртуальную сети. Внешний мир может напрямую взаимодействовать с гостевой машиной.

Сетевой мост соединяется через хост-систему с вашим сетевым устройством, которому назначен IP адрес вашей физической сети. VirtualBox подключается к одной из установленных у вас сетевых карт и обменивается пакетами напрямую; он соединяет физическую и виртуальную сети. В нормальных условиях он будет пытаться получить стандартный 192.168.x.x IP адрес от вашего маршрутизатора, так что ваша виртуальная машина будет выглядеть как физическое устройство наряду с другими устройствами в вашей сети.

У вас может быть более одного активного сетевого устройства на вашем хосте одновременно; например, у моего ноутбука есть ethernet разъем сетевой карты (называемый eth0) и беспроводной адаптер (называемый wlan0). Опция «Имя» позволяет выбрать, какой из них вы будете связывать мостом с VirtualBox.

В моем случае я использую беспроводной адаптер wlan0, потому что он подключен к маршрутизатору, в то время как у eth0 даже не подключен сетевой кабель.

Итак, мой хост подключается под адресом 192.168.0.2, который ему выдал маршрутизатор. Моя виртуальная машина, связанная сетевым мостом, появляется и требует свой IP адрес, на что маршрутизатор выдает ей 192.168.2.6, не зная и не заботясь о том, что VirtualBox ведет трафик через адаптер хост-машины. Моя виртуальная машина становится просто еще одним устройством в сети. Если считать хост-машину и три виртуальных машины, связанных сетевым мостом, то в моей физической сети будет четыре машины.

Идем сюда, тут еще…

NAT полезен, потому что защищает гостевые системы от Интернет, но в случае, когда к ним надо получить доступ с хост-машины, нам нужно настроить перенаправление портов (у меня есть сервера на некоторых моих гостевых машинах). Сетевой мост предоставляет доступ, но делает гостевые машины открытыми.

Если ваш маршрутизатор, коммутатор или провайдер не выделяют вам больше одного IP адреса, то, скорее всего, вы не сможете использовать сетевой мост.

Виртуальный адаптер хоста (Host-only Adapter)

Под виртуальным адаптером хоста виртуальные машины могут общаться между собой и с хост-машиной, но не с внешним миром. Виртуальный адаптер хоста использует свое обособленное сетевое устройство, называемое vboxnet0, для того чтобы установить подсеть и назначить IP адреса гостевым машинам. Гостевые машины не могут общаться с внешним миром, так как они не подключены через физический сетевой интерфейс. Виртуальный адаптер хоста предоставляет ограниченные сервисы, полезные для создания локальной сети под VirtualBox хостом для гостей.

В отличие от других продуктов для виртуализации VirtualBox NAT не соединяет ваше сетевое устройство по умолчанию на вашей хост-машине, поэтому нет прямой сетевой связи с машинами соединенными NAT и нет доступа к приложениям и данным на самом хосте. Давайте взглянем на пример.

У вашего хоста свой сетевой адрес, тот, который он использует для выхода в Интернет, — обычно 192.168.0.101. Под виртуальным адаптером хоста хост-машина становится маршрутизатором с IP адресом по умолчанию 192.168.56.1. Хост создает внутреннюю локальную сеть, обеспечивающую всем гостевым машинам, настроенным на виртуальный адаптер хоста, видимость в локальной сети. Адаптер vboxnet0 начинает использовать адреса с 192.168.56.101 и далее, но вы можете это изменить в настройках.

Аналогично адаптерам сетевого моста, виртуальные адаптеры хоста используют различные диапазоны адресов. Вы с легкостью можете разрешить гостевым машинам получать адреса используя DHCP (динамическое выделение адресов, которые скорее всего будут меняться в каждой сессии), который предоставляет VirtualBox.

Ко всему прочему, виртуальный адаптер хоста для хоста и гостя не имеют выхода в Интернет. Они используются, чтобы соединить хост и гостей чем-то вроде сетевого коммутатора.

Поэтому виртуальный адаптер хоста не предоставляет гостевым машинам доступ в Интернет; у vboxnet0 нет гейта, так что хотя добавление vboxnet0 здорово упрощает сетевое общение хоста и гостей, у вас не будет внешнего доступа или проброски портов, так что вам по-прежнему нужен будет еще один адаптер NAT или сетевой мост, подключенный к вашим гостевым машинам, для получения полного доступа.

Внутренняя сеть (Internal network)

Если вам нужно, чтобы несколько гостевых машин общались друг с другом на одном хосте, но ничего более, тогда вы можете использовать режим внутренней сети. Несмотря на то, что вы можете использовать сетевой мост для той же цели, внутренняя сеть более безопасна. При использовании сетевого моста, все пакеты, отправленные и получаемые с помощью физического адаптера на хост-машине, и трафик может быть перехвачен (например, установкой сниффера на хосте).

Внутренняя сеть создает, согласно руководству по VirtualBox, «программную сеть, которая видна для выбранных машин, но не для приложений, запущенных на хосте или в окружающей среде». Это дает нам сеть, в которой есть хост и виртуальные машины, но ни одна из них не использует физические адаптеры — они полностью виртуальные, и VirtualBox работает виртуальным коммутатором. Вы получаете полностью приватную ЛВС для своих гостевых машин, без доступа из вне, что делает ее очень защищенной. Возможные варианты использования — работа сверх-секретных серверов разработки и клиентов, проведение тестирования на проникновение, или наоборот создание безопасной интрасети для команды или организации. Это идеальный вариант закрытия пространства от неавторизованной установки приложений, скачивания, загрузок и зависания в Фэйсбуке в течении рабочего дня.

Теперь мы видим, что различные типы сетей подходят для различных целей. Что и приводит меня к тому с чего я начал - созданию виртуального сервера для разработки под Wordpress и тестирования.

Гостевой доступ в Интернет

Для начала моей гостевой машине нужен доступ в Интернет для установки обновлений, скачивания пакетов и все такое. Мне нужен доступ к ней с моей хост-машины, но я не хочу, чтобы мой сервер был доступен еще откуда-то из сети.

Отыскав мою машину в менеджере VirtualBox, я выбираю Настройки > Сеть.

Я начинаю со стандартного NAT. Он позволяет гостевой машине получить доступ в Интернет через подключение моего хоста. Гостевая машина не видна из моей сети; я также не могу получить доступ к ресурсам гостевой машины с хост-машины, как и другие гостевые машины.

Настройка виртуального адаптера хоста в менеджере VirtualBox

Простой способ — использовать стандартный виртуальный адаптер хоста, предоставляемый VirtualBox, тот что назван vboxnet0, но вы можете добавить и другие, если хотите использовать несколько отдельных сетей. Если в основном окне VirtualBox вы перейдете Файл > Настройки > Сеть, то сможете настроить vboxnet0 или добавить другие адаптеры.

Чтобы увидеть стандартные настройки, нажмите кнопку редактирования - это кнопка с иконкой отвертки и подписью «Редактировать виртуальную сеть хоста». IP адрес 192.168.56.1 это адрес, по которому гости могут получить доступ к хосту. Я оставил эту настройку как есть.

По умолчанию, у vboxnet0 есть DHCP сервер, настроенный на автоматическую выдачу IP адресов на основе сессий. Я хочу, чтобы мой виртуальный Wordpress сервер сохранял статический IP адрес, поэтому на вкладке DHCP я снимаю галку «Включить сервер».

Добавляем виртуальный адаптер хоста гостевой машине

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

На вкладке «Адаптер 2» моей гостевой машины я устанавливаю «Тип подключения» виртуальный адаптер хоста и стандартное имя vboxnet0. Promiscuous mode не важен, но мне необходима включенная опция «Кабель подключен».

Конфигурирование гостевой машины


Мне нужно, чтобы мой гостевой сервер имел статический IP адрес в сети виртуального адаптера хоста, иначе адрес будет меняться при каждом перезапуске, и мне придется выяснять, какой он, прежде чем я смогу подключиться с хоста. Залогинимся в гостевую машину и введем следующую команду:
ifconfig eth1 192.168.56.101 netmask 255.255.255.0 up
Это установит IP адрес для гостя и поднимет сетевой интерфейс. Он использует 192 — префикс домашних сетей, .168 — в качестве начала ID хоста, .56 — диапазон сети виртуального адаптера хоста и последний идентификатор, любой больше .1 (мой хост) в моей сети виртуального адаптера хоста. Адаптер NAT находится на eth0, поэтому виртуальный адаптер хоста связан с eth1. Теперь я могу использовать SSH или зайти на гостевую машину с хоста, используя IP адрес.
Однако, это лишь временно; если я перезагружусь, эта конфигурация исчезнет. Чтобы сделать ее постоянной, мне нужно добавить ее в /etc/network/interfaces (под root):
#The host-only network
interface
auto eth1
iface eth1 inet static address 192.168.56.101
netmask 255.255.255.0
network 192.168.56.0
broadcast 192.168.56.255

После перезагрузки интерфейс поднимется автоматически. Я могу проверить это, используя команду ifconfig в терминале гостевой машины.

Наименования элементов

Так как я не очень хорош в мире чисел и IP адресов, я предпочитаю использовать имена гостевых машин вместо IP. Чтобы сделать это, я могу добавить алиас в файл /etc/hosts на моей хост-машине.
Я редактирую файл (под root) добавляя строку:
192.168.56.101 ocelotserver

Если я добавлю еще гостевые машины в сеть виртуального адаптера хоста, я могу сделать тоже самое и обращаться к ним по именам.

Порт во время шторма?

Специалисты по сетям уже увидели альтернативный способ добраться до моего виртуального сервера.

Используя NAT адаптер, я могу поработать с конфигурацией, чтобы получить доступ к моему виртуальному серверу с хоста, не используя виртуальный адаптер хоста.

Я могу настроить проброс портов в VirtualBox, используя панель настройки гостевого сетевого адаптера. Переключаемся на NAT адаптер, большая кнопка внизу «Проброс портов». Она открывает окно конфигурации, где я могу настроить проброс портов для данного адаптера именно этой гостевой машины.

Мне нужны два правила; одно для доступа к Apache веб-серверу на моем госте, другое для работы с TCP трафиком (в основном http запросы).

Для простоты я назвал их Apache и TCP, и оба они используют протокол TCP. Если вернуться к привычным номерам портов, то 8888 на хосте перебрасывается на 80 гостевой машины, затем 2222 на хосте на порт 22 гостевой машины; это открывает особый доступ на гостевую машину для сервисных запросов. Все остальные запросы будут отвергнуты VirtualBox так как не будет найден путь.

Это также означает, что все другие гости, которых я запущу, не смогут получить доступ к этому виртуальному серверу, так как под NAT нет сетевого пути.

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

  1. очень толково для меня

    ОтветитьУдалить
  2. Большое спасибо за подробное объяснение!
    Однако, для меня остается загадкой - как пробросить диапазон портов например UDP 17000-25000 ?

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