Найти в Дзене
Linux | Network | DevOps

Знакомство с командами и функциями Linux для создания мостов

Linux-мост — это модуль ядра, который работает как сетевой коммутатор, перенаправляя пакеты между подключёнными к нему интерфейсами. Обычно он используется для перенаправления пакетов на маршрутизаторах, шлюзах или между виртуальными машинами и сетевыми пространствами имён на хосте. Начиная с серий ядер 2.4 и 2.6, в Linux-мосте реализована базовая поддержка протокола связующего дерева (Spanning Tree Protocol, STP), многоадресной рассылки и Netfilter. В более поздних версиях были добавлены следующие функции: В этой статье вы познакомитесь с этими функциями и некоторыми полезными командами для их включения и управления ими. Вы также кратко рассмотрите Open vSwitch как альтернативу бриджингу в Linux. Все команды, используемые в этой статье, являются частью модуля iproute2, который вызывает сообщения Netlink для настройки моста. Для установки и настройки мостов используются две iproute2 команды: ip link и bridge. ip link можно добавлять и удалять мосты, а также настраивать их параметры. b
Оглавление

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

Начиная с серий ядер 2.4 и 2.6, в Linux-мосте реализована базовая поддержка протокола связующего дерева (Spanning Tree Protocol, STP), многоадресной рассылки и Netfilter. В более поздних версиях были добавлены следующие функции:

  • Настройка через Netlink
  • Фильтр VLAN
  • Сопоставление туннелей VxLAN
  • Протокол управления группами в Интернете версии 3 (IGMPv3) и протокол обнаружения многоадресных слушателей версии 2 (MLDv2)
  • Switchdev

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

Основные команды для работы с мостом

Все команды, используемые в этой статье, являются частью модуля iproute2, который вызывает сообщения Netlink для настройки моста. Для установки и настройки мостов используются две iproute2 команды: ip link и bridge.

ip link можно добавлять и удалять мосты, а также настраивать их параметры. bridge отображает мосты на конечных распределительных платах (FDB), основных распределительных платах (MDB) и виртуальных локальных сетях (VLAN) и управляет ими.

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

  • Показать справочную информацию об объекте bridge:# ip link help bridge
  • # bridge -h
  • Скопировать фрагмент кода
  • Создайте мост под названием br0:# ip link add br0 type bridge
  • Скопировать фрагмент кода
  • Показать детали моста:# ip -d link show br0
  • Скопировать фрагмент кода
  • Отображение сведений о мосте в удобном формате JSON (это хороший способ получить пары «ключ-значение» для моста):# ip -j -p -d link show br0
  • Скопировать фрагмент кода
  • Добавьте интерфейсы в мост:# ip link set veth0 master br0
  • # ip link set tap0 master br0
  • Скопировать фрагмент кода

Протокол связующего дерева

Цель протокола связующего дерева — предотвратить образование сетевых петель, которые могут привести к перегрузке сети. На рисунке 1 показана такая петля.

Рис. 1. Без STP сеть может быть настроена в виде петли.
Рис. 1. Без STP сеть может быть настроена в виде петли.
-3

Если функция STP включена, мосты будут отправлять друг другу блоки данных протокола Bridge (BPDU), чтобы выбрать корневой мост и заблокировать интерфейс, сделав топологию сети бесконтурной (рис. 2).

Рис. 2. STP может выбрать канал и заблокировать его.
Рис. 2. STP может выбрать канал и заблокировать его.
-5

В Linux-мостах поддержка STP реализована начиная с серий ядер 2.4 и 2.6. Чтобы включить STP в мосте, введите:

# ip link set br0 type bridge stp_state 1

Скопировать фрагмент кода

Примечание: Linux-мост не поддерживает протокол Rapid Spanning Tree (RSTP).

Теперь вы можете отобразить состояние блокировки STP на мосту:

# ip -j -p -d link show br0 | grep root_port

"root_port": 1,

# ip -j -p -d link show br1 | grep root_port

"root_port": 0,

# bridge link show

7: veth0@veth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 master br0 state forwarding priority 32 cost 2

8: veth1@veth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 master br1 state forwarding priority 32 cost 2

9: veth2@veth3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 master br0 state blocking priority 32 cost 2

10: veth3@veth2: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 master br1 state forwarding priority 32 cost 2

Скопировать фрагмент кода

Строка с номером 9 в выводе показывает, что интерфейс veth2 находится в состоянии блокировки, как показано на рисунке 3.

Рис. 3. Связь между br0 и veth2 заблокирована.
Рис. 3. Связь между br0 и veth2 заблокирована.
-7

Чтобы изменить время ожидания ответа от STP, введите:

# ip link set br0 type bridge hello_time 300

# ip -j -p -d link show br0 | grep \"hello_time\"

"hello_time": 300,

Скопировать фрагмент кода

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

Фильтр VLAN

Фильтр VLAN появился в ядре Linux 3.8. Раньше для разделения трафика VLAN на мосту администратору нужно было создать несколько интерфейсов моста/VLAN. Как показано на рисунке 4, для поддержки трёх VLAN и обеспечения того, чтобы трафик VLAN направлялся в соответствующие VLAN, потребуется три моста — br0, br2, и br3.

Рис. 4. Без фильтра VLAN для трёх виртуальных локальных сетей требовалось три моста и сетевые конфигурации.
Рис. 4. Без фильтра VLAN для трёх виртуальных локальных сетей требовалось три моста и сетевые конфигурации.
-9

Но с фильтром VLAN достаточно одного мостового устройства, чтобы настроить все конфигурации VLAN, как показано на рисунке 5.

Рис. 5. С помощью фильтра VLAN один мост может обслуживать несколько виртуальных локальных сетей.
Рис. 5. С помощью фильтра VLAN один мост может обслуживать несколько виртуальных локальных сетей.
-11

С помощью следующих команд можно включить фильтр VLAN и настроить три виртуальные локальные сети:

# ip link set br0 type bridge vlan_filtering 1

# ip link set eth1 master br0

# ip link set eth1 up

# ip link set br0 up

# bridge vlan add dev veth1 vid 2

# bridge vlan add dev veth2 vid 2 pvid untagged

# bridge vlan add dev veth3 vid 3 pvid untagged master

# bridge vlan add dev eth1 vid 2-3

# bridge vlan show

port vlan-id

eth1 1 PVID Egress Untagged

2

3

br0 1 PVID Egress Untagged

veth1 1 Egress Untagged

2

veth2 1 Egress Untagged

2 PVID Egress Untagged

veth3 1 Egress Untagged

3 PVID Egress Untagged

Скопировать фрагмент кода

Затем с помощью следующей команды включается фильтр VLAN на мосту br0:

ip link set br0 type bridge vlan_filtering 1

Скопировать фрагмент кода

Следующая команда заставляет порт veth1 моста передавать данные только из VLAN 2:

bridge vlan add dev veth1 vid 2

Скопировать фрагмент кода

Следующая команда, аналогичная предыдущей, заставляет порт veth2 моста передавать данные VLAN 2. Параметр pvid приводит к тому, что нетегированные кадры назначаются этой VLAN на входе (veth2 в мост), а параметр untagged приводит к тому, что пакет нетегируется на выходе (мост в veth2):

bridge vlan add dev veth2 vid 2 pvid untagged

Скопировать фрагмент кода

Следующая команда выполняет ту же операцию, что и предыдущая, но на этот раз для veth3. Параметр master указывает на то, что настройка канала осуществляется на программном мосту. Однако, поскольку master является параметром по умолчанию, эта команда выполняет ту же функцию, что и предыдущая:

bridge vlan add dev veth3 vid 3 pvid untagged master

Скопировать фрагмент кода

Следующая команда включает трафик VLAN 2 и VLAN 3 на eth1:

bridge vlan add dev eth1 vid 2-3

Скопировать фрагмент кода

Чтобы отобразить состояние трафика VLAN, включите статистику VLAN (добавлена в ядро 4.7) следующим образом:

ip link set br0 type bridge vlan_stats_enabled 1

Скопировать фрагмент кода

Предыдущая команда позволяет просматривать только глобальную статистику VLAN на мосту и не обеспечивает достаточной детализации для отображения состояния каждой VLAN. Чтобы включить статистику по каждой VLAN, если в мосту есть no портовых VLAN, вам также нужно включить vlan_stats_per_port (добавлено в ядре 4.20). Вы можете выполнить следующую команду:

ip link set br0 type bridge vlan_stats_per_port 1

Скопировать фрагмент кода

Затем вы можете отобразить статистику по каждой виртуальной локальной сети:

# bridge -s vlan show

port vlan-id

br0 1 PVID Egress Untagged

RX: 248 bytes 3 packets

TX: 333 bytes 1 packets

eth1 1 PVID Egress Untagged

RX: 333 bytes 1 packets

TX: 248 bytes 3 packets

2

RX: 0 bytes 0 packets

TX: 56 bytes 1 packets

3

RX: 0 bytes 0 packets

TX: 224 bytes 7 packets

veth1 1 Egress Untagged

RX: 0 bytes 0 packets

TX: 581 bytes 4 packets

2 PVID Egress Untagged

RX: 6356 bytes 77 packets

TX: 6412 bytes 78 packets

veth2 1 Egress Untagged

RX: 0 bytes 0 packets

TX: 581 bytes 4 packets

2 PVID Egress Untagged

RX: 6412 bytes 78 packets

TX: 6356 bytes 77 packets

veth3 1 Egress Untagged

RX: 0 bytes 0 packets

TX: 581 bytes 4 packets

3 PVID Egress Untagged

RX: 224 bytes 7 packets

TX: 0 bytes 0 packets

Скопировать фрагмент кода

Сопоставление туннелей VLAN

VxLAN создает виртуальные сети уровня 2 поверх базовой сети уровня 3. Конечная точка туннеля VxLAN (VTEP) создает и завершает работу туннелей VxLAN. Модерирование VxLAN — это функция, предоставляемая VTEP для завершения работы туннелей VxLAN и сопоставления идентификатора сети VxLAN (VNI) с традиционной VLAN конечного хоста.

Раньше для сопоставления туннелей VLAN администраторам нужно было добавлять локальные порты и сетевые устройства VxLAN (netdevs) в мост с фильтрацией VLAN. Локальные порты настраивались как магистральные порты, через которые проходили все VLAN. Затем к мосту нужно было добавить сетевое устройство VxLAN для каждого VNI. Сопоставление VLAN и VNI осуществлялось путем настройки идентификатора VLAN порта (pvid) для каждой VLAN на соответствующем сетевом устройстве VxLAN, как показано на рисунке 6.

Рис. 6. Раньше для VxLAN требовалось несколько сетевых устройств.
Рис. 6. Раньше для VxLAN требовалось несколько сетевых устройств.
-13

Начиная с версии 4.11 ядро предоставляет собственный способ поддержки мостового соединения VxLAN. Топология выглядит так, как показано на рисунке 7. Конечная точка vxlan0 на этом рисунке была добавлена с поддержкой облегчённого туннеля (LWT) для работы с несколькими VNI.

Рис. 7. Теперь Linux-мосты могут работать с несколькими VNI и одним VxLAN.
Рис. 7. Теперь Linux-мосты могут работать с несколькими VNI и одним VxLAN.
-15

Чтобы создать туннель, сначала нужно добавить соответствующие идентификаторы VID в интерфейсы:

bridge vlan add dev eth1 vid 100-101

bridge vlan add dev eth1 vid 200

bridge vlan add dev vxlan0 vid 100-101

bridge vlan add dev vxlan0 vid 200

Скопировать фрагмент кода

Теперь включите сопоставление туннелей VLAN на порту моста:

# ip link set dev vxlan0 type bridge_slave vlan_tunnel on

Скопировать фрагмент кода

Кроме того, вы можете включить туннель с помощью этой команды:

# bridge link set dev vxlan0 vlan_tunnel on

Скопировать фрагмент кода

Затем добавьте сопоставление туннелей VLAN:

# bridge vlan add dev vxlan0 vid 2000 tunnel_info id 2000

# bridge vlan add dev vxlan0 vid 1000-1001 tunnel_info id 1000-1001

# bridge -j -p vlan tunnelshow

[ {

"ifname": "vxlan0",

"tunnels": [ {

"vlan": 100,

"vlanEnd": 101,

"tunid": 100,

"tunidEnd": 101

},{

"vlan": 200,

"tunid": 200

} ]

} ]

Скопировать фрагмент кода

Многоадресная рассылка

В модах Linux с версии ядра 2.6 включена поддержка IGMPv2 и MLDv1. Поддержка IGMPv3/MLDv2 была добавлена в ядре 5.10.

Чтобы использовать многоадресную рассылку, включите отслеживание многоадресной рассылки, запросы и статистику следующим образом:

# ip link set br0 type bridge mcast_snooping 1

# ip link set br0 type bridge mcast_querier 1

# ip link set br0 type bridge mcast_stats_enabled 1

# tcpdump -i br0 -nn -l

02:47:03.417331 IP 0.0.0.0 > 224.0.0.1: igmp query v2

02:47:03.417340 IP6 fe80::3454:82ff:feb9:d7b4 > ff02::1: HBH ICMP6, multicast listener querymax resp delay: 10000 addr: ::, length 24

Скопировать фрагмент кода

По умолчанию, когда отслеживание включено, мост использует IGMPv2/MLDv1. Вы можете изменить версии с помощью следующих команд:

ip link set br0 type bridge mcast_igmp_version 3

ip link set br0 type bridge mcast_mld_version 2

Скопировать фрагмент кода

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

# bridge mdb show

dev br0 port br0 grp ff02::fb temp

dev br0 port eth1 grp ff02::fb temp

dev br0 port eth2 grp ff02::fb temp

dev br0 port eth2 grp 224.1.1.1 temp

dev br0 port br0 grp ff02::6a temp

dev br0 port eth1 grp ff02::6a temp

dev br0 port eth2 grp ff02::6a temp

dev br0 port br0 grp ff02::1:ffe2:de9f temp

dev br0 port eth1 grp ff02::1:ffe2:de9f temp

dev br0 port eth2 grp ff02::1:ffe2:de9f temp

Скопировать фрагмент кода

Bridging также поддерживает многоадресный мониторинг и запросы в одной VLAN. Настройте их следующим образом:

bridge vlan set vid 10 dev eth1 mcast_snooping 1 mcast_querier 1

Скопировать фрагмент кода

С помощью этой команды можно отобразить статистику моста (информацию о многоадресной передаче RX/TX):

# ip link xstats type bridge

br0

IGMP queries:

RX: v1 0 v2 1 v3 0

TX: v1 0 v2 131880 v3 0

IGMP reports:

RX: v1 0 v2 1 v3 0

TX: v1 0 v2 496 v3 18956

IGMP leaves: RX: 0 TX: 0

IGMP parse errors: 0

MLD queries:

RX: v1 1 v2 0

TX: v1 51327 v2 0

MLD reports:

RX: v1 66 v2 6

TX: v1 3264 v2 213794

MLD leaves: RX: 0 TX: 0

MLD parse errors: 0

Скопировать фрагмент кода

Вы можете настроить и другие параметры многоадресной рассылки, в том числе mcast_router, mcast_query_interval, и mcast_hash_max.

Bridge switchdev

При подключении виртуальных машин (ВМ) к физическим сетям в Linux всегда используется мостовое соединение с помощью драйвера virtio tap. Вы также можете подключить виртуальную функцию (VF) Single Root I/O Virtualization (SR-IOV) в гостевой системе виртуальной машины для повышения производительности (рис. 8).

Рис. 8. Виртуальные машины.
Рис. 8. Виртуальные машины.
-17

Но то, как Linux взаимодействовал со встроенными коммутаторами SR-IOV, ограничивало их функциональность и гибкость. А модель ядра для управления встроенным коммутатором SR-IOV не позволяла осуществлять переадресацию, если она не была основана на MAC/VLAN.

Чтобы виртуальные коммутаторы также поддерживали динамическую FDB (как показано на рисунке 9) и сохраняли преимущества фильтра VLAN, обеспечивая при этом оптимальную производительность, в версии ядра 4.9 для Linux была добавлена поддержка switchdev. Switchdev позволяет разгрузить аппаратный коммутатор, например устройства Mellanox Spectrum, коммутаторы на базе DSA и карты MLX5 CX6 Dx, от пересылки данных на уровне 2.

Рис. 9. Switchdev обеспечивает широкую поддержку разгрузки трафика на аппаратном уровне.
Рис. 9. Switchdev обеспечивает широкую поддержку разгрузки трафика на аппаратном уровне.
-19

В режиме switchdev мост активен, и включена соответствующая конфигурация, например MLX5_BRIDGE для коммутатора MLX5 SRIOV eSwitch. В режиме switchdev можно подключить к мосту ретрансляторы VF, и кадры, которые должны передаваться через мост, будут передаваться только аппаратно. Их маршрутизация будет осуществляться в коммутаторе на уровне контроллера сетевого интерфейса (NIC).

Как только кадр проходит через VF и попадает к своему представителю, мост узнаёт, что исходный MAC-адрес VF находится за определённым портом. Мост добавляет запись с MAC-адресом и портом в свою базу данных FDB. Сразу после этого мост отправляет сообщение драйверу mlx5, и драйвер добавляет соответствующее правило или строку в две таблицы, расположенные в eSwitch на сетевой карте. Позже кадры с тем же MAC-адресом назначения, поступающие от VF, не проходят через ядро, а направляются напрямую через сетевую карту на соответствующий порт.

Поддержка Switchdev для встроенных коммутаторов в сетевых картах проста, но для полнофункциональных коммутаторов, таких как Mellanox Spectrum, возможности разгрузки гораздо шире: они поддерживают хеширование групп агрегации каналов (LAG) (объединение в группы, объединение каналов), туннелирование (VxLAN и т. д.), маршрутизацию и разгрузку TC. Маршрутизация и разгрузка TC не относятся к бриджингу, но LAG можно подключать как к бриджу, так и к туннелям VxLAN с полной поддержкой разгрузки.

Мостовое соединение с Netfilter

По умолчанию трафик, перенаправляемый мостом, не проходит через брандмауэр iptables. Чтобы правила iptables для перенаправления фильтровали трафик уровня 2, введите:

ip link set br0 type bridge nf_call_iptables 1

Скопировать фрагмент кода

Та же процедура работает для ip6tables и arptables.

Время устаревания моста

Время устаревания определяет, сколько секунд MAC-адрес будет храниться в FDB после получения пакета с этого адреса. По истечении этого времени записи удаляются. Чтобы изменить таймер, введите:

ip link set br0 type bridge ageing_time 20000

Скопировать фрагмент кода

Бриджинг в сравнении с Open vSwitch

Бриджинг в Linux очень полезен и стал популярен за последние несколько лет. Он обеспечивает пересылку на уровне 2 и соединяет виртуальные машины и сети с поддержкой VLAN/многоадресной рассылки. Бриджинг в Linux стабилен, надёжен и прост в настройке.

С другой стороны, у Linux-мостов тоже есть некоторые ограничения. Например, отсутствует поддержка некоторых типов туннелей. Если вы хотите упростить управление сетью, получить больше возможностей для работы с туннелями (GRE, VXLAN и т. д.), переадресацию на уровне 3 и интеграцию с программно-конфигурируемыми сетями (SDN), вы можете попробовать Open vSwitch (OVS).

Где можно узнать больше

Чтобы узнать больше о сетевых интерфейсах Linux и других сетевых темах, ознакомьтесь с этими статьями от Red Hat Developer:

Linux | Network | DevOps

Чат

YouTube

VK

Rutube