В терминологии Ethernet «коммутатор» (switch) и «мост» (bridge) — это синонимы. Термин switch придумали, чтобы отличать многопортовые коммутаторы от первых двухпортовых мостов. Программные реализации коммутатора Ethernet по традиции называют мостами, независимо от числа портов.
Вот и в Linux программный коммутатор называется мостом. Производительность таких коммутаторов невысока — ни о каких десяти гигабитах речь не идет. Кроме того, встроенная функциональность ядра Linux для этой цели достаточно ограниченна по сравнению с новыми проектами вроде Open vSwitch. Тем не менее в ряде случаев она может оказаться полезной.
РЕКОМЕНДУЕМ:
Как удалить лишние прошивки Linux
Программные мосты Linux
Объединять два физических сетевых интерфейса в «тупой» мост имеет смысл только в качестве вынужденной меры, если на объекте нет свободных портов аппаратного коммутатора, но есть устройство с Linux и неиспользуемыми сетевыми картами.
Осмысленно применять эту фичу стоит в других направлениях. Во-первых, сетевой интерфейс не обязан быть физическим — это может быть и туннель. Некоторые приложения требуют общего широковещательного сегмента. Если тебе нужно обеспечить работу таких приложений в удаленной сети через интернет, ты можешь соединить свои сети туннелем, который способен инкапсулировать кадры Ethernet. О настройке таких туннелей в Linux я уже писал в статье «Неизвестные туннели Linux»: это GRE, L2TPv3 и VXLAN (а также OpenVPN в режиме TAP и WireGuard).
Второй важный момент — программный мост не обязан быть тупым. В отличие от большинства аппаратных коммутаторов, Linux может выступать в роли невидимого на сетевом уровне прозрачного файрвола.
Но для начала вспомним, как делаются мосты.
Возводим программные мосты Linux
Вернее, не вспомним, а научимся это делать с помощью iproute2. Классическая утилита brctl уже давно объявлена устаревшей, вместе с ifconfig и прочими командами из net-tools, и дистрибутивы Linux начинают их удалять, так что лучше сразу действовать по-новому.
Для примера объединим интерфейсы eth0 и eth1 в мост br0.
1 2 3 |
$ sudo ip link add name br0 type bridge $ sudo ip link set dev eth0 master br0 $ sudo ip link set dev eth1 master br0 |
Удалить интерфейс из моста можно было бы командой ip link set dev eth0 nomaster.
Что в iproute2 хорошо, так это унификация разных команд. Когда-то стандартным способом просмотреть информацию об интерфейсах моста была команда brctl show.
1 |
$ sudo brctl show br0 bridge name bridge id STP enabled interfaces br0 8000.0008a20a52cf no eth0 eth1 |
В iproute2 на смену множеству особых случаев пришла общая концепция ведущего интерфейса (master) и ведомых (slave). Просмотреть все ведомые интерфейсы можно командой ip link show master <interface>. Эта команда будет работать и для моста, и для транка LACP, и для всего прочего, что подразумевает отношения ведущий — ведомый. Единственный недостаток — формат вывода не заточен под конкретный тип интерфейса.
1 |
$ ip --brief link show master br0 eth0 UP 9a:a3:32:c1:d6:8b <BROADCAST,MULTICAST,UP,LOWER_UP> eth2 UP 00:08:a2:0a:52:cf <BROADCAST,MULTICAST,UP,LOWER_UP> |
Делаем прозрачный файрвол
Прежде всего нужно убедиться, что твое ядро не собрано с CONFIG_BRIDGE_NETFILTER=n. Затем — проверить, что установлены в единицу следующие опции sysctl: net.bridge.bridge-nf-call-iptables, net.bridge.bridge-nf-call-ip6tables, net.bridge.bridge-nf-call-arptables.
А теперь хорошая новость: больше ничего особенного делать не потребуется. Если в ядре есть нужный модуль и его работа не заблокирована опциями sysctl, то все правила xtables автоматически применяются не только к маршрутизируемому, но и к коммутируемому трафику. Для проверки можно заблокировать пользователям моста ICMP: sudo iptables -I FORWARD -i br0 -p icmp -j DROP.
Заключение
На этом. Теперь вы знаете, что из себя представляют программные мосты в Linux.
Возможности Linux открывают большой простор для самых изощренных конфигураций на всех уровнях модели OSI. Если внимательно читать документацию, там, как правило, можно найти что-то на любой, даже самый необычный случай.