Библиотека сайта rus-linux.net
Создание сетевого моста в KVM
Оригинал: How to setup bridged networking in KVM - TutorialАвтор: Igor Ljubuncic
Дата публикации: 25 июня 2011 года
Перевод: А.Кривошей
Дата перевода: август 2011 г.
Еще одна статья из серии заметок И.Любинчича, посвященной KVM. Предыдущие статьи:
Итак, к настоящему времени мы достаточно хорошо разбираемся в настройке KVM. Мы изучили несколько руководств, включая основы установки и использования, работу с сетью и носителями, а также совместную работу VirtualBox и KVM. Следующим логичным шагом будет освоение настройки сетевого моста, чтобы позволить нашей виртуальной машине работать с внешними IP-адресами, если нам необходимо пробросить порты и т.д.
То, что я вам хочу сегодня показать, будет несколько отличаться от того, что вы увидите в большинстве других руководств. А именно, я хочу попробовать обойти метод грубой силы, который описан в различных источниках. Я покажу вам два возможных способа вывести ваши виртуальные машины во внешний мир. Один из методов - это хак, впрочем абсолютно легальный. Вы его точно никогда не видели! И мы также немного поговорим об ограничениях и возможных проблемах.
Подготовительные действия
Начнем с проверки. Сетевые мосты часто вызывают затруднения и требуют некоторого знания командной строки Linux. Однако иногда без них не обойтись. Если вам нужно запускать некоторые типы серверов внутри виртуальной машины, вам может понадобиться присвоить ей внешний IP-адрес, так как другие хосты должны будут соединяться с ней напрямую.
Пример: ваш маршрутизатор раздает адреса в диапазоне 10.0.0.X. Ваши физические хосты используют 10.0.0.4, но виртуальная машина имеет адрес 192.168.2.133. Без некоторых изменений в интерпретации системой отправлямых и получаемых пакетов клиенты в сети 10.0.0 не смогут сообщаться с клиентами в сети 192.168.2.
Вы можете обойти эту проблему с помощью сетевого моста. Это позволит вашей виртуальной машине соединяться с роутером и получать внешние IP-адреса. В данном контексте под внешними подразумеваются любые адреса, используемые вашими физическими хостами.
По умолчанию KVM создает свой собственный сетевой мост, 192.168.122.1. Это устройство работает как виртуальный маршрутизатор к вашим виртуальным машинам и раздает им IP-адреса в этом диапазоне. Однако мы хотим дать нашим машинам доступ к внешним адресам. В данном руководстве это диапазон 192.168.2.
Два альтернативных решения
Мы попробуем решить эту проблему двумя способами.
Во-первых, мы создадим мост. С помощью него будут соединены два устройста - физическое eth1 и виртуальное vnet0. После того, как мы убедимся, что наш мост работает правильно, мы внесем изменения в конфиграционный файл сети на диске. Виртуальные машины будут получать свои IP-адреса от маршрутизатора.
Я не могу гарантировать, что второй способ всегда работает, но обычно он срабатывает. Если ваш сетевой адаптер поддерживает сетевые мосты "из коробки", то вы сможете использовать его напрямую. В этом случае вам необходимо всего лишь назначить небольшую подсеть вашему виртуальному мосту в KVM, которая не будет перекрывать адреса, используемые физическими хостами в сети.
Ограничения
Существует ряд обстоятельств, которые могут серьезно осложнить применение рекомендаций, представленных в данном руководстве. Например, ваш маршрутизатор или ваш сетевой адаптер может не поддерживать сетевые мосты. Доступный вам диапазон IP-адресов может быть ограниченным. Могут возникнуть проблемы с брандмауэром. Наконец, в Ubuntu могут возникнуть проблемы и конфликты, если сетевым мостом управляет Network Manager.
Для более углубленного изучения вопроса можно почитать следующую документацию:
Bridge setup on Linux Foundation
KVM Networking - Ubuntu Community Documentation
Итак, теперь вы знаете, что нас ждет. Сетевые мосты действительно не так просты. Есть несколько вещей, которые вам необходимо знать, чтобы уверенно продолжать. Во-первых, поддерживает ли ваш сетевой адаптер мосты? Например, на некоторых ноутбуках беспроводные адаптеры действительно не поддерживают этот режим работы. Во-вторых, нравится ли вам возиться с настройками сети? В третьих, действительно ли вам необходим сетевой мост? Может быть вас устроит NAT?
Базовые концепции настройки сети
Хотя моей тестовой системой является Ubuntu, мне бы хотелось, чтобы инструкции, которые я привожу, работали в любом дистрибутиве. Следование заветам документации сообщества Ubuntu KVM - вещь хорошая, но их инструкции будут работать только в системах на базе Debian. Поэтому давайте отклонимся немного в сторону и познакомимся с концепциями работы сети, принятыми в системах RedHat и SUSE.
В системах на базе Debian, таких как Ubuntu, постоянные настройки сети хранятся в /etc/network/interfaces. В системах на базе RedHat и семестве SUSE сетевые настройки находятся в индивидуальных файлах, расположенных в директории /etc/sysconfig/network, названия которых обычно начинаются с ifcfg-ethX или ifcfg-eth-MAC-address.
Также вы можете создавать мосты с помощью утилиты brctl в командной строке, без правки конфигурационных файлов, но изменения не будут сохраняться при перезапуске сетевых служб. Этот способ рекомендуется для тестирования перед внесением изменением в любые системные файлы. И не забывайте делать резервные копии своих настроек перед их изменением.
Создание моста
Теперь можно начинать. Надеюсь, что сначала вы будете работать с командами brctl, ifconfig и dhclient. Заранее прошу прощения, если буду опускать какие-либо детали, которые мне кажутся неважными. Дополнительную информацию всегда можно найти в более подробных руководствах. В целом, последовательность действий следующая (команды выполняются с sudo или от имени root, предполагается, что br0, физические и/или виртуальные устройства eth0/1 и DHCP подключены к свитчеру или маршрутизатору):
ifconfig eth0 0.0.0.0 ifconfig eth1 0.0.0.0 brctl addbr br0 brctl addif br0 eth0 brctl addif br0 eth1 dhclient br0
Обратите внимание, что виртуальный адаптер может быть недоступен, пока вы не запустите виртуальную машину. Поэтому пока можно не добавлять виртуальный адаптер. KVM сделает это автоматически, если вы зададите в опциях сетевой мост.
Если вы видите, что ваш сетевой мост получил внешний IP-адрес от DHCP-сервера, вы на правильном пути. В домашних условиях DHCP-сервер, как правило, находится в маршрутизаторе. Если же у вас прямое интернет-соединение, то скорее всего ничего не выйдет, так как ваш ISP может не допускать получение более чем одного IP-адреса на пользователя.
После того, как сетевой мост заработал, убедитесь, что работоспособность вашей сети не нарушена. Возможно, вам придется отредактировать /etc/resolv.conf или таблицу маршрутизации.
Если все заработало, вы можете захотеть сохранить изменения в файле конфигурации сети. Обратите внимание, что экземпляр, который я привожу - это типовой файл конфигурации, похожий на тот, что описывается в документации. У вас он может отличаться. Например, может понадобиться активировать Spanning Tree Protocol (STP) для сетевого моста.
Специально для этого случая мы хотим отредактировать /etc/network/interface и добавить br0. Если вам необходим STP, необходимо заменить bridge_stp off на bridge_stp on. Вы можете проверить результат с помощью команды btctl show.
Создание виртуальной машины
Мы уже изучали, как это делается, поэтому не будем повторяться. На финальной стадии, во вкладке Advanced options, задайте фиксированный уникальный MAC-адрес, чтобы избежать конфликта с другими устройствами.
Если вам повезет и ваш сетевой адаптер поддерживат сетевые мосты, то вам не нужно будет ничего дополнительно настраивать. Но скорее всего вам не повезет, так что приготовьтесь к ручному вводу нужных настроек.
Чтобы убедиться, что все работает, попробуйте ping:
Если пинг проходит, значит все в порядке. Теперь вы можете делать видимыми в сети службы, расшаривать данные и делать все, что вам нужно. Наслаждайтесь.
Альтернативный способ (работает не всегда)
Вы можете не оказаться среди счастливчиков. Network Manager может блокировать работу моста и может выявиться еще масса проблем. Для того, чтобы обойти их, вы можете попробовать создать отдельный виртуальный адаптер и связать его с физическим устройством, которое поддерживает режим сетевого моста "из коробки". Помните о конфликте IP-адресов.
В заключение, если у вас все работает, вы можете попробовать очень грязный хак. Создайте виртуальную сеть, которая разделяет такой же диапазон адресов /24 с вашей сетью. Например, если ваш роутер имеет адрес 192.168.2.0, создайте виртуальную сеть, диапазон адресов которой начинается с 192.168.2.160 и имеет всего несколько значений, например 16. Убедитесь, что ваш маршрутизатор никогда не отдаст эти адреса другим клиентам сети.
Пример: Я создал сеть 192.168.2.160/28. Не думаю, что маршрутизатор будет использовать адреса из этого диапазона, но при необходимости я могу ограничить их использование в настройках DHCP. Теперь свяжите виртуальную сеть с физическим устройством, в моем случае с беспроводным адаптером eth1.
Далее, создайте свою виртуальную машину и свяжите ее с eth1, как было показано выше. В онлайне они должны замечательно работать вместе. У хоста адрес .103, у виртуальной сетевой карты virbr1 .161, в то время как виртуальная машина работает с адресом .168.
На скриншоте ниже приведен пинг из физической системы Windows 7, находящейся в той же сети с адресом .103. Пингуется виртуальный адаптер с адресом .161 на Ubuntu Lucid. Оба адаптера беспроводные и соединены через один и тот же маршрутизатор.
Существующие виртуальные машины
Для виртуальных машин, которые были созданы ранее, вы также можете отредактировать установки путем изменения директив в /etc/libvirt/. Каждая виртуальная машина имеет отдельный конфигурационный файл в формате .xml. Для применения изменений необходимо перезапустить виртуальную машину. Пример:
Заключение
Настройка сетевых мостов в KVM не слишком интуитивна. В данном аспекте она отстает от VirtualBox на два - три года. Ограничения в использовании сетевых мостов связаны в основном с функциональностью и топологией вашей сети.
Если вам повезет, ваш сетевой адаптер будет поддерживать сетевые мосты. Если нет, необходимо создать виртуальный сетевой мост и связать его с физическим или виртуальным сетевым адаптером. Затем необходимо решить потенциальные проблемы с DNS, DHCP или маршрутизацией. После этого вы можете попробовать применить описанный выше хак и поупражняться в создании подсети в подсети, только убедитесь, что диапазоны адресов не пересекаются. Теперь соедините ваш виртуальный адаптер с физическим устройством.
Данное руководство не претендует на всеобъемлющий охват проблемы, поэтому я буду рад любым вашим комментариям и предложениям по преодолению трудностей, связанных с настройкой сетевых мостов в KVM.