Программные мосты в Linux

linux

В терминологии 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.

Удалить интерфейс из моста можно было бы командой ip link set dev eth0 nomaster.

Что в iproute2 хорошо, так это унификация разных команд. Когда-то стандартным способом просмотреть информацию об интерфейсах моста была команда brctl show.

В iproute2 на смену множеству особых случаев пришла общая концепция ведущего интерфейса (master) и ведомых (slave). Просмотреть все ведомые интерфейсы можно командой ip link show master <interface>. Эта команда будет работать и для моста, и для транка LACP, и для всего прочего, что подразумевает отношения ведущий — ведомый. Единственный недостаток — формат вывода не заточен под конкретный тип интерфейса.

Делаем прозрачный файрвол

Прежде всего нужно убедиться, что твое ядро не собрано с 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. Если внимательно читать документацию, там, как правило, можно найти что-то на любой, даже самый необычный случай.

Понравилась статья? Поделиться с друзьями:
Добавить комментарий