Как сделать сетевой мост в linux

Добавил пользователь Валентин П.
Обновлено: 05.10.2024

Оригинал: How to setup bridged networking in KVM - Tutorial
Автор: Igor Ljubuncic
Дата публикации: 25 июня 2011 года
Перевод: А.Кривошей
Дата перевода: август 2011 г.

Итак, к настоящему времени мы достаточно хорошо разбираемся в настройке 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.
Для более углубленного изучения вопроса можно почитать следующую документацию:

Итак, теперь вы знаете, что нас ждет. Сетевые мосты действительно не так просты. Есть несколько вещей, которые вам необходимо знать, чтобы уверенно продолжать. Во-первых, поддерживает ли ваш сетевой адаптер мосты? Например, на некоторых ноутбуках беспроводные адаптеры действительно не поддерживают этот режим работы. Во-вторых, нравится ли вам возиться с настройками сети? В третьих, действительно ли вам необходим сетевой мост? Может быть вас устроит 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 подключены к свитчеру или маршрутизатору):

Обратите внимание, что виртуальный адаптер может быть недоступен, пока вы не запустите виртуальную машину. Поэтому пока можно не добавлять виртуальный адаптер. 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.

сетевые мосты KVM

Создание виртуальной машины

Мы уже изучали, как это делается, поэтому не будем повторяться. На финальной стадии, во вкладке Advanced options, задайте фиксированный уникальный MAC-адрес, чтобы избежать конфликта с другими устройствами.

выбор сетевого моста

получение адреса роутера

Если вам повезет и ваш сетевой адаптер поддерживат сетевые мосты, то вам не нужно будет ничего дополнительно настраивать. Но скорее всего вам не повезет, так что приготовьтесь к ручному вводу нужных настроек.
Чтобы убедиться, что все работает, попробуйте ping:

проверка моста с помощью ping

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

Альтернативный способ (работает не всегда)

Вы можете не оказаться среди счастливчиков. Network Manager может блокировать работу моста и может выявиться еще масса проблем. Для того, чтобы обойти их, вы можете попробовать создать отдельный виртуальный адаптер и связать его с физическим устройством, которое поддерживает режим сетевого моста "из коробки". Помните о конфликте IP-адресов.

подключение к физической сети

подключение к физической сети 2

В заключение, если у вас все работает, вы можете попробовать очень грязный хак. Создайте виртуальную сеть, которая разделяет такой же диапазон адресов /24 с вашей сетью. Например, если ваш роутер имеет адрес 192.168.2.0, создайте виртуальную сеть, диапазон адресов которой начинается с 192.168.2.160 и имеет всего несколько значений, например 16. Убедитесь, что ваш маршрутизатор никогда не отдаст эти адреса другим клиентам сети.
Пример: Я создал сеть 192.168.2.160/28. Не думаю, что маршрутизатор будет использовать адреса из этого диапазона, но при необходимости я могу ограничить их использование в настройках DHCP. Теперь свяжите виртуальную сеть с физическим устройством, в моем случае с беспроводным адаптером eth1.

создание небольшой подсети

задание диапазона адресов для dhcp

Далее, создайте свою виртуальную машину и свяжите ее с eth1, как было показано выше. В онлайне они должны замечательно работать вместе. У хоста адрес .103, у виртуальной сетевой карты virbr1 .161, в то время как виртуальная машина работает с адресом .168.

работа созданной сети онлайн

созданная сеть работает

На скриншоте ниже приведен пинг из физической системы Windows 7, находящейся в той же сети с адресом .103. Пингуется виртуальный адаптер с адресом .161 на Ubuntu Lucid. Оба адаптера беспроводные и соединены через один и тот же маршрутизатор.

пинг виртуальной машины из физической

Существующие виртуальные машины

Для виртуальных машин, которые были созданы ранее, вы также можете отредактировать установки путем изменения директив в /etc/libvirt/. Каждая виртуальная машина имеет отдельный конфигурационный файл в формате .xml. Для применения изменений необходимо перезапустить виртуальную машину. Пример:

Заключение

Настройка сетевых мостов в KVM не слишком интуитивна. В данном аспекте она отстает от VirtualBox на два - три года. Ограничения в использовании сетевых мостов связаны в основном с функциональностью и топологией вашей сети.
Если вам повезет, ваш сетевой адаптер будет поддерживать сетевые мосты. Если нет, необходимо создать виртуальный сетевой мост и связать его с физическим или виртуальным сетевым адаптером. Затем необходимо решить потенциальные проблемы с DNS, DHCP или маршрутизацией. После этого вы можете попробовать применить описанный выше хак и поупражняться в создании подсети в подсети, только убедитесь, что диапазоны адресов не пересекаются. Теперь соедините ваш виртуальный адаптер с физическим устройством.
Данное руководство не претендует на всеобъемлющий охват проблемы, поэтому я буду рад любым вашим комментариям и предложениям по преодолению трудностей, связанных с настройкой сетевых мостов в KVM.

linux

Вот и в Linux программный коммутатор называется мостом. Производительность таких коммутаторов невысока — ни о каких десяти гигабитах речь не идет. Кроме того, встроенная функциональность ядра Linux для этой цели достаточно ограниченна по сравнению с новыми проектами вроде Open vSwitch. Тем не менее в ряде случаев она может оказаться полезной.

Программные мосты Linux

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

Но для начала вспомним, как делаются мосты.

Возводим программные мосты Linux

Вернее, не вспомним, а научимся это делать с помощью iproute2. Классическая утилита brctl уже давно объявлена устаревшей, вместе с ifconfig и прочими командами из net-tools, и дистрибутивы Linux начинают их удалять, так что лучше сразу действовать по-новому.

Поддержка сетевых мостов есть в Linux для ядер 2.4 и старше. Нужный для работы пакет bridge-utils доступен в репозиториях. brctl addif и brctl addbr являются самыми популярными командами при создании моста.

Фактически, бридж — виртуальный коммутатор — устройство второго уровня модели OSI, оперирующее MAC адресами.

Каждый создаваемый коммутатор выглядит в выводе ip a отдельным интерфейсом.

Прежде всего установим пакет

Добавляем сетевой мост

Интерфейсы (в примере, eth0) можно добавлять в бридж (br0) так:

Их имена можно узнать из вывода ip a (ip addr show). Добавляется обычно 2 интерфейса. В примере один, так требуется делать, например, при настройке моста для системы LXC контейнеризации.

Несколько интерфейсов добавляются в мост в любом порядке

При необходимости так же интерфейс убирается:

Все включенные в сетевой мост интерфейсы работают как одно устройство. Таковым бридж и является выполняя те же функции, что физический коммутатор.

Один интерфейс включается не больше, чем в один бридж.

У самого бриджа нет IP адреса, что делает невозможным подключение к нему извне. Если бриджей несколько можно настроить STP (spanning-tree-protocol), что предотвратит возникновение петель при коммутации.

При базовой конфигурации с одним сетевым мостом это не требуется.

Чтобы изменения сохранялись после перезагрузки нужно внести правки в /etc/network/interfaces

iface eth1 inet manual

Затем выполняется ifup br0 чтобы поднять мост и все интерфейсы, в него включенные.

Для статического IP:

iface eth1 inet manual

Поддерживаются регулярные выражения — bridge_ports regex eth*

Опции, которые могут потребоваться при работе с сетевыми мостами:

bridge_stp off — выключает Spanning Tree Protocol
bridge_waitport 0 — нулевая задержка при смене состояния порта
bridge_fd 0 — нулевая задержка при пересылке

Посмотреть информацию по всем сетевым мостам на машине можно так:

Пример добавления моста для LXC

После установки LXC полноценно пакет работать не будет если отсутствует сетевой мост. Добавляется он при этом очень легко.

Сначала нужно посмотреть имя моста:

Затем добавить его

bridge name bridge id STP enabled interfaces
lxcbr0 8000.000000000000 no

brctl addif и добавление интерфейсов обычно не требуется, в /etc/network/interaces для моста прописывается сетевые настройки идентичные существующим для интерфейса, смотрящего во внешнюю сеть.

Создаем сетевой мост (bridge, br0). Например, для виртуальных машин KVM


При установке kvm изначально создается виртуальная локальная сеть, из которой гостевые VM могут выходить "наружу", но с ними снаружи до настройки DST-NAT/FORWARD никто не сможет взаимодействовать. Если необходимо, чтобы виртуальные машины были доступны так же, как и обычные компьютеры, их можно подключить к сети черед мост (bridge). Предположим, есть хост Linux, на нем настроен KVM. На хосте есть два физических сетевых адаптеров, один из которых планируется отдать для подключения виртуальных машин к физической сети (LAN, WAN, не имеет значения).

Пусть есть два сетевых адаптера: eno1 и eno2.
eno2 - управляющий, ему будет назначен какой-то ip-адрес, через него хост настраивается.
eno1 - адаптер, подключенный к сети LAN, в которой будут доступны виртуальные машины.
При этом eno1 и eno2 могут быть подключены в одну и ту же сеть, не важно.

Создадим bridge br0, привязанный к адаптеру eno1.

На примере хоста KVM на CentOS 7.

Проверим, подгружен ли модуль bridge:

Если не подгружен, можно подгрузить:

Возможно, потребуется установить утилиты bridge:

NetwokManager выключаем, он на практике только мешает на сервере:

На всякий случай, копируем конфиг сетевого адаптера eno1 (у меня это были базовые, нетронутые настройки):

Создаем конфиг бриджа br0:

Совет : обратите внимание, что Bridge пишется в конфиге с большой буквы!

Изменяем конфиг eno1:

Фактически полностью сохраняется конфиг, внизу появляется привязка к bridge br0.

Кто-то после этого делает service network restart, я все же хочу убедиться, что все будет ок и после перезагрузки, поэтому reboot. При этом не забывайте, что если вы что-то напутаете (например, если для eno1 у вас были какие-то правила iptables, или в конфиге ошибетесь), то лучше вам быть рядом с хостом и его физической клавиатурой.

После перезагрузки если все ок и в листинге ip link бридж br0 присутствует, можно приступать или к настройке KVM (на CentOS 7) или, если уже настроено, виртуальные машины можно подключать к сети через br0, например:

Все, мы создали выделенный сетевой мост br0 (на базе адаптера eno2) который не имея собственного IP адреса, подключает виртуальные машины к нужному сегменту реальной сети. При этом что бы ни случилось с трафиком VM, есть отдельный административный сетевой адаптер eno2.


Почтовый сервер Шифрование Squid 3proxy VPN Mikrotik Настройка сервера Виртуальные машины kvm Защита почты Резервное копирование Групповые политики SELinux WDS IPFW OpenVPN firewalld systemd Mobile libvirt Samba WiFi Iptables NAT Lightsquid Remote desktop Postfix Dovecot Удаление данных Софт Безопасность Настройка прокси Winbox User agent Хостинг Передача данных Онлайн сервисы Privacy LetsEncrypt VPN сервер RRDTool sendmail Rsync Linux SSH Система Windows Синхронизация Облако fail2ban FreeBSD

Читайте также: