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 показана такая петля.
Если функция STP включена, мосты будут отправлять друг другу блоки данных протокола Bridge (BPDU), чтобы выбрать корневой мост и заблокировать интерфейс, сделав топологию сети бесконтурной (рис. 2).
В 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.
Чтобы изменить время ожидания ответа от 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.
Но с фильтром VLAN достаточно одного мостового устройства, чтобы настроить все конфигурации VLAN, как показано на рисунке 5.
С помощью следующих команд можно включить фильтр 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.
Начиная с версии 4.11 ядро предоставляет собственный способ поддержки мостового соединения VxLAN. Топология выглядит так, как показано на рисунке 7. Конечная точка vxlan0 на этом рисунке была добавлена с поддержкой облегчённого туннеля (LWT) для работы с несколькими VNI.
Чтобы создать туннель, сначала нужно добавить соответствующие идентификаторы 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).
Но то, как Linux взаимодействовал со встроенными коммутаторами SR-IOV, ограничивало их функциональность и гибкость. А модель ядра для управления встроенным коммутатором SR-IOV не позволяла осуществлять переадресацию, если она не была основана на MAC/VLAN.
Чтобы виртуальные коммутаторы также поддерживали динамическую FDB (как показано на рисунке 9) и сохраняли преимущества фильтра VLAN, обеспечивая при этом оптимальную производительность, в версии ядра 4.9 для Linux была добавлена поддержка switchdev. Switchdev позволяет разгрузить аппаратный коммутатор, например устройства Mellanox Spectrum, коммутаторы на базе DSA и карты MLX5 CX6 Dx, от пересылки данных на уровне 2.
В режиме 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: