Linux bridge

Dependences: STP

Мост (bridge) в сетевой подсистеме Linux — это частичная реализация стандарта IEEE 802.1D. При этом на данный момент bridge не реализует протокол RSTP, который заменяет STP в стандарте IEEE 802.1D-2004. Хотя, существует внешний код (userspace), который реализует протокол RSTP (IEEE 802.1w) поверх моста.

Пару слов о стандарте IEEE 802.1D: в нем описаны мосты (bridge), их поведение, описано какие кадры необходимо выбрасывать, а какие перенаправлять, описан также протокол STP. Т.е. коммутаторы второго уровня — это реализация данного стандарта. Обычные «неуправляемые» коммутаторы являются частичной реализацией стандарта, так они не поддерживают протокол STP, фильтрацию, многоадресную рассылку (multicast) и т. д.

В Linux bridge входят:
  • объединение множества сегментов сети на канальном уровне (программный коммутатор)
  • протокол STP
  • IGMP Snooping (код представлен в феврале 2010)
  • фильтрация/NAT посредством брандмауэра ebtables

Грубо говоря, мост объединяет множество сетевых интерфейсов и пропускает кадры по логике аппаратного сетевого моста: кадр будет отправлен на тот порт, с которым ассоциирован MAC адрес получателя, при условии, что этот порт отличается от порта источника кадра; если же записи MAC адреса получателя нет, то кадр отправляется на все порты, кроме исходного порта. В случае программного коммутатора понятие «физический порт» заменяем на «логический сетевой интерфейс». При чем интерфейс может указывать на виртуальный сетевой адаптер, интерфейс VLAN 802.1Q и т. п.

Для того, чтобы сетевой адаптер передавал ядру кадры с чужим MAC адресом получателя, необходимо переключить адаптер в promiscuous режим. Без этого мост не будет функционировать должным образом. Если какой-то интерфейс будет не в promiscuous режиме, bridge не будет перенаправлять однонаправленные кадры этого сегмента на другие интерфейсы моста по одной причине — он не получит этих кадров, так как сетевой адаптер отбросит их. Установка данного режима производится следующей командой:

# ifconfig eth0 promisc

В мост нельзя добавлять интерфейсы с назначенным IP адресом, вместо этого сетевой адрес назначается на интерфейс моста. Убрать установленный IP адрес с интерфейса можно командой:

# ifconfig eth0 0.0.0.0

Для связи с сетевой подсистемой bridge используется консольная утилита brctl. Мост позволяет не просто перенаправлять кадры, но и преобразовывать их тип. Например, можно включить в мост интерфейс сетевого адаптера и интерфейс VLAN 802.1Q. Если необходимо назначить адрес на интерфейс VLAN 802.1Q, но интерфейс сетевого адаптера находится в мосте, тогда интерфейс VLAN нужно создавать поверх интерфейса моста.

Например:

# ifconfig eth0 0.0.0.0 promisc
# brctl addbr br0
# brctl addif br0 eth0

Создаем VLAN 100:

# vlan add br0 100

Получаем адрес на интерфейсе VLAN:

# dhclient br0.100

При включении интерфейса в мост он не передает данные, пока не перейдет в состояние Forwarding (см. протокол STP). Время перехода между состояниями Learning и Forwarding называется forwarding delay. Чтобы установить его значение для моста, используется команда brctl setfd. Когда мост используется на компьютере для объединения нескольких сегментов сети, например физическую сеть и виртуальную сеть, часто протокол STP не нужен. Для его отключения используется команда brctl stp off. Из описанного выше вырисовывается проблема: если мост настраивается скриптами запуска и является интерфейсом, на котором запускается DHCP клиент, мы получаем timeout до того момента, пока интерфейс не перейдет в режим Forwarding. Поэтому необходимо приметь следующие настройки:

# brctl setfd br0 0
# brctl stp br0 off

Но эту конфигурацию необходимо применить до поднятия интерфейса br0. Настройка скриптов запуска специфическая для конкретного дистрибутива. В Gentoo Linux можно посмотреть пример в /usr/share/doc/openrc/net.example. Также скрипты запуска сами переводят интерфейсы в promiscuous режим и заботятся о правильной последовательности
выполняемых команд. В Gentoo Linux эта фукциональность находится в /lib/rc/net/bridge.sh.

Мосты широко используются для объединения физической сети с виртуальной; или нескольких виртуальных сетей для связи нескольких виртуальных машин. При запуске виртуальной машины (с соответствующими настройками) есть пара интерфейсов. Первый интерфейс, на хост-машине, часто называется tap0. Второй, на гостевой системе, является виртуальным Ethernet адаптером и обычно называется eth0. Весь трафик, который отправляется на tap0, приходит на eth0 и наоборот. Когда мы помещаем интерфейс tap0 в мост на хост-системе, говорим что этот мост объединяет виртуальную сеть с другими сегментами, включенными в него. В данном случае виртуальная сеть будет представлена виртуальным каналом точка-точка между интерфейсами tap0 и eth0.

Благодарим за статью: Дмитрия Подгорного

Войти