Рейтинг:2

Блокировать трафик к/от хоста с одной стороны моста

флаг in

Если у меня есть два интерфейса Ethernet eth0 и eth1. Они соединены мостом (br0). Хост, на котором работает мост, может обмениваться данными с сетью, используя любой из eth0 или eth1, в зависимости от того, какой из них подключен к сети.

Теперь к вопросу:

Как я могу запретить хосту общаться с сетью через eth1?

Что я хотел бы выполнить:

eth0 <-> br0: Принято.
eth1 <-> br0: отклонено.
eth0 <-> eth1: принято.

Прежде чем сказать, что это невозможно и не соответствует модели OSI, вам нужно проверить следующее: br_netfilter (модуль ядра), net.bridge.bridge-nf-call-iptables и прозрачный брандмауэр: https://www.debian.org/doc/manuals/securing-debian-manual/bridge-fw.en.html

Я уже фильтрую пакеты на основе уровня 3 в мосте ( eth0 <-> eth1 ). Что осталось сделать, так это предотвратить самостоятельную связь брандмауэра с сетью на неправильной стороне брандмауэра.

Решение nftables, описанное в одном из комментариев, великолепно, и это способ пойти позже, но сейчас мне нужно быстрое исправление, которое будет работать, пока я не обновлю платформу и не конвертирую приложение для использования nftables.

Приемлемые решения этого вопроса основаны на iptables (предпочтительно) или ebtables (мне нужно изучить это, но на данный момент это более быстрый способ решить эту проблему, чем nftables).

Tom Yan avatar
флаг in
Вы можете использовать iptables и nftables одновременно. Это не будет проблемой, если вы используете только стол моста с последним. (Но это может быть проблемой, если вам по какой-то причине нужно удалить инструменты пользовательского пространства nftables.)
mlom avatar
флаг in
@TomYam В настоящее время ОС не поддерживает nftables (нет поддержки ядра и инструментов пользовательского пространства). Это изменится, но сейчас на короткий срок я бы предпочел не обновлять/перенастраивать ОС. Это встроенная система с минимальной ОС.
Рейтинг:0
флаг cl
A.B

Брандмауэр

Можно использовать правила брандмауэра на уровне моста Ethernet для реализации ограничений OP.

Мост Linux имеет специальный «собственный» порт с именем моста. Мост в целом участвует в пересылке кадров на уровне L2 между портами (интерфейсами, установленными как bridge-), но собственный порт моста участвует в маршрутизации пакетов на уровне L3, как и другие интерфейсы. Сравните это с простым управляемым коммутатором: у него есть порты, но он также может быть доступен для целей управления через IP: такие IP-пакеты могут достигать его с любого порта (по-прежнему как кадры Ethernet), но затем отправляются на сам коммутатор, а не пересылаются на него. другой порт.

Для брандмауэра Netfilter, используемого nftables и блюда, это означает, что трафик мост-порт-мост-порт виден в передний крюк фильтра (цепь фильтр/ВПЕРЕД для блюда). Трафик от собственного порта к другому порту выходной хук фильтра (цепочка filter/OUTPUT), а трафик от порта к собственному порту моста является входной хук фильтра (цепочка фильтр/ВХОД). Эта схема описывает его в части Link Layer (синие прямоугольники в нижнем синем поле).

Итак, здесь трафик для блокировки находится между эт1 и собственный интерфейс (т.е. блокировать дальнейшую обработку в стеке маршрутизации) и наоборот.

Я предполагаю, что здесь только один мост. Теперь, когда эти инструменты были представлены, необходимо сделать больше инвестиций, чтобы использовать их должным образом, особенно в случае нескольких мостов. В любом случае приведенные ниже команды всегда будут работать правильно, поскольку эт1 одновременно может быть портом только одного моста: здесь бр0.

С использованием блюда:

ebtables -A ВВОД -i eth1 -j DROP
ebtables -A ВЫВОД -o eth1 -j DROP

Там нет упоминания о бр0: это представлено ВХОД и ВЫВОД.

Поскольку различные значения по умолчанию по-прежнему принимают трафик, eth0 не будет заблокирован с бр0, ни трафик между eth0 и эт1.

Используя (достаточно недавно, чтобы избежать синтаксических ошибок) nftables: то же самое с начальным шаблоном для добавления:

nft добавить таблицу мост mytable

nft add chain bridge mytable myinput '{ type filter hook input priority filter; политика принять; }'
nft add chain bridge mytable myoutput '{ type filter hook input priority filter; политика принять; }'

nft добавить правило моста mytable myinput iif eth1 drop
nft добавить правило моста mytable myoutput oif eth1 drop

Запись

iptables используется не на уровне Ethernet (L2), а на уровне IP (L3), поэтому не является подходящим инструментом для этого. Возможно, есть также специальная функция, называемая сетевой фильтр моста который будет преобразовывать фреймы Ethernet типа IPv4 для отправки искусственных IP-пакетов в iptables (все еще на пути моста), чтобы их можно было обработать, а затем преобразовать эти пакеты обратно в кадры Ethernet для дальнейшей обработки с помощью блюда. Это позволило бы использовать iptables выполнять такую ​​фильтрацию, если вы следуете и правильно понимаете обработку зеленых полей (сетевой уровень: пакеты) в нижнем синем поле (канальный уровень: Ethernet) в предыдущая схема , но это, скорее всего, приведет к дополнительным нежелательным эффектам. Не используйте эту функцию (и не экспериментируйте с системой, в которой уже запущен Docker), пока не поймете что может сломаться.

Рейтинг:0
флаг it

Извините, но вопрос нуждается в дополнительных пояснениях, так как в настоящее время он не имеет смысла.

Объединив eth0 и eth1 в br0, вы создали 2-портовый Ethernet-коммутатор.

Что вы хотели бы выполнить:

eth0 <-> br0: Принято.
eth1 <-> br0: отклонено.
eth0 <-> eth1: принято.

будет возможно, если вы удалите eth1 из br0 и разрешите пересылку пакетов в ядре для eth0 и eth1.

iptables работают с IP-адресами, т. е. с уровнем 3 (сетью) в модели OSI, поэтому их нельзя использовать в этом сценарии.

Вы говорите о переключении кадров на уровень 2 (ссылка) в модели OSI, поэтому вам нужно проконсультироваться с ebtables, чтобы выполнить любую расширенную фильтрацию.

Ссылки для ознакомления:

https://linux.die.net/man/8/ebtables

Можно ли использовать ebtables для фильтрации трафика по MAC-адресам на простом интерфейсе ethernet, без моста?

Tom Yan avatar
флаг in
Нет, ОП полностью действителен и может быть выполнен с помощью nftables (таблицы моста) или ebtables. Чего OP не хочет, так это «ввода» L2 от eth1, но разрешить «пересылку» L2. `разрешить пересылку пакетов в ядре для eth0 и eth1`, и вы не просите кого-либо просто перейти на L3.
mlom avatar
флаг in
Возможно, вы захотите прочитать об опции ядра: net.bridge.bridge-nf-call-iptables, прежде чем отвечать на этот вопрос.
Roman Spiak avatar
флаг it
@ Том Ян - пожалуйста, знайте, что мой ответ никого не просит перейти на L3. Кроме того, если кто-то создает мост Linux, он должен ожидать, что он будет действовать как правильный коммутатор. Это означает, что в конфигурации по умолчанию все интерфейсы передают кадры и домены коллизий микросегментации. Если вы хотите запретить хостам, подключенным через ETH1, общаться с остальной частью моста - просто не добавляйте его в мост...
Tom Yan avatar
флаг in
«остальная часть моста», по-видимому, вы даже не видите, чего хочет достичь ОП: «br0» не относится к этому

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.