Виртуальные сетевые устройства в Linux: Linux Bridge

Кирилл Беспалов
3 min readOct 30, 2017

--

High level описание некоторых виртуальных сетевых устройств доступных в ядре Linux.

Linux Bridge

Уровень: L2

Команды:

  • brctl addbr|delbr <name> - создание и удаление;
  • brctl addif|delif <brname> <ifname> -добавление интерфейса;
  • brctl showmacs <brname> отобразить таблицу коммутации;
  • brctl show-список устройств.

Описание:

Как и физический мост, linux bridge позволяет объединить два или более ethernet сегментов в одну L2 сеть, образуя тем самым широковещательный домен, в котором каждое из устройств указаниемMACадреса (пр. broadcast адрес FF:FF:FF:FF:FF:FF) сможет обмениваться фреймами с другими устройствами из этой же сети.

Кроме того, linux bridge имеет таблицу коммутации, которая строится в ходе его работы и поддержку STP протокола для предотвращения образования петель, поэтому корректнее все таки сравнивать с физическим коммутатором, а не мостом.

Для начала работы, достаточно создать bridge используя набор утилит из пакета bridge-utils, и подключить в качестве портов необходимые физические или виртуальные интерфейсы хоста, объединив тем самым их в один сегмент.

Этот шаг отсоединит интерфейсы от сетевого стека ядра Linux и подключит их в качестве L2 интерфейсов (портов) моста, сбросив при этом их ip адреса.

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

Использование на практике:

Одно из частых применений — объединение виртуальных машин или контейнеров (пр. docker0) в один L2 сегмент, предоставляя тем самым им возможность обмена данными, а также подключения их, например, к внешней сети, благодаря объединению с физическим интерфейсом хоста в одну сеть.

Объединение в L2 сегмент трех виртуальных машин и физического интерфейса eth0 внешней сети хоста.

Комбинируя Linux Bridge и VLAN можно создать несколько изолированных друг от друга широковещательных доменов, получив тем самым простой tenant networking для виртуальных машин/контейнеров. Это удобной способ на канальном уровне разделить сети виртуальных машин, например в целях безопасности.

Схема соединения может выглядеть следующим образом (упрощена):

Виртуальные машины двух физических хостов разделенных на два широковещательных L2 домена RED и BLUE.

Здесь виртуальные машины VM под номерами 1,2,4 образуют один L2 сегмент, трафик которого изолирован от трафика виртуальных машин 3 и 5 благодаря использованию VLAN интерфейсов с разными VID.

Достигнуть этого можно несколькими путями. Один из них выглядит следующим образом:

  1. Создать два sub-интерфейса физического интерфейса eth0 с разными VID eth0.1 и eth0.2 :
ssh root@host1 and root@host2

vconfig add eth0 1 # BLUE TENANT
vconfig add eth0 2 # RED TENANT

2. Создать два моста br1 и br2, каждый из которых будет объединять в L2 сегмент виртуальные машины принадлежащие одному tenant’у: RED или BLUE

ssh root@host1 and root@host2brctl add br1    # BLUE TENANT's bridge
brctl add br2 # RED TENANT's bridge

3. Добавить интерфейсы виртуальных машин vm_eth0 и sub-интерфейсы eth0 к соответствующему мосту в зависимости от принадлежности к tenant’у:

ssh root@HOST1# BLUE TENANT
brctl addif br1 vm1_eth0
brctl addif br1 vm2_eth0
brctl addif br1 eth0.1
# RED TENANT
brctl addif br2 eth0.2
brctl addif br2 vm3_eth0
------------------------------------ssh root@HOST2# BLUE TENANT
brctl addif br1 vm4_eth0
brctl addif br1 eth0.1
# RED TENANT
brctl addif br2 eth0.2
brctl addif br2 vm5_eth0

Таким образом, для host1 схема соединения будет выглядеть следующим образом:

To be continued…

--

--