Брандмауэр в мостовых контейнерах LXC

Вопрос или проблема

Я новичок в сетях и пытаюсь реализовать брендмауэр внутри контейнера LXC (Alpine Linux), который подключен мостом с другим контейнером LXC (Alpine Linux) через интерфейс br0.

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

До сих пор у меня было много проблем с применением/работой правил брендмауэра.

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

Я использую nftables для настройки параметров брендмауэра.

Мой базовый процесс:

установить nftables
добавить политику для сброса пакетов в цепочке пересылки
я перепробовал все возможные конфигурации, которые мог придумать для этих правил.

Я читал, что из-за того, что контейнер закодирован мостом, пакеты данных идут только по слою 2, поэтому правила брендмауэра для слоя 3 не будут применяться к пакету, это правда?

Я смог использовать правила слоя 2 для блокировки трафика (например, правила мостов в nftables и правила ebtables), но ничего на уровне слоя 3 пока нет.

Для справки, вот настройка интерфейса контейнера:

WLAN0/WLAN1 -> br0 (Контейнер A) -> br0 (Контейнер B) -> eth0 -> интернет

Сейчас я пытаюсь применять правила брендмауэра внутри контейнера A.

Если нужна дополнительная информация, дайте знать 🙂

Ответ или решение

Организация безопасности в контейнерах LXC с использованием межсетевого экрана представляет собой важную задачу, особенно в инфраструктуре с использованием мостов, как в вашем случае. Ваше стремление заблокировать весь трафик, идущий от клиентского устройства через контейнер, сталкивается с рядом технических аспектов, связанных с сетевыми структурами и уровневой моделью OSI. Разберем вашу проблему поэтапно, через призму теории, примера и применения.

Теория

В контейнеризованных средах, таких как LXC (Linux Containers), межсетевые экраны могут применяться как на уровне самого контейнера, так и на уровне хоста. Контейнеры в LXC используют интерфейсы для сетевого взаимодействия, которые могут быть физически связаны через мосты (bridge). Эти мосты работают на канальном уровне (Layer 2) модели OSI, что позволяет объединять различные сетевые сегменты и обеспечивать передачу кадров на этом уровне.

Когда контейнеры соединены через мост (например, br0 в вашем сценарии), передача данных между ними осуществляется по Layer 2. Это значит, что при таком соединении традиционные правила фаервола, работающие на сетевом уровне 3 (Layer 3), могут не срабатывать, так как они ориентированы на IP-пакеты.

Эти аспекты вызывают необходимость использования различных подходов:

  1. ebtables и nftables (bridge rules) для обработки кадров на канальном уровне.
  2. Конфигурация межсетевых фильтров на уровне хоста.
  3. Proper forwarding и network bridge настройки, которые учитывают специфику модели OSI.

Пример

Предположим, у вас есть два контейнера (A и B) с интерфейсом, настроенным через br0, который связан с внешним интерфейсом eth0 для доступа к Интернету. Вы хотите заблокировать весь трафик, проходящий через контейнер A. Наблюдаемые трудности могут быть связаны с тем, что правила, примененные в iptables/nftables на уровне 3 для контейнера A, не затрагивают фактически передаваемый по Layer 2 трафик. Это характерно для следущей сетевой конфигурации:

  • WLAN0/WLAN1 → br0 (Container A) → br0 (Container B) → eth0 → Internet

В старом подходе для iptables необходимо было контролировать маршруты и ICMP-пакеты, но специфика контейнеров LXC и их мостов требует настройку ebtables и создания bridge rules в nftables, которые будут применяться на уровне канальных кадров.

Применение

Настройка ebtables:

Убедитесь, что ebtables установлены и properly initialized. Далее, создайте правила для блокировки трафика на уровне L2:

ebtables -A FORWARD -i wlan0 -o wlan1 -j DROP

Это правило обеспечит, что любой трафик с wlan0, направленный через wlan1, будет отброшен.

Настройка nftables с использованием правил мостов:

Откройте конфигурацию nftables и добавьте bridge rules:

nft add table bridge filter
nft add chain bridge filter forward { type filter hook forward priority 0 \; }
nft add rule bridge filter forward ether saddr <client_mac_address> drop

Здесь <client_mac_address> должен быть заменен на MAC-адрес устройства клиента, от которого вы хотите блокировать трафик.

Проверка Layer 3 правил:

Хотя применение Layer 3 правил может быть неэффективным из-за текущей конфигурации, иногда они могут быть полезны для управления входящим и исходящим потоком для самого контейнера, когда пакет уже поднялся на уровень IP.

nft add table inet filter
nft add chain inet filter forward { type filter hook forward priority 0 \; }
nft add rule inet filter forward ip saddr <client_ip_address> drop

Здесь <client_ip_address> — это IP-адрес клиентского устройства.

Настройка forwarding и bridge:

Проверьте конфигурации Linux и примените соответствующие настройки для бриджа и маршрутизации. Это часто требует validation sysctl параметров:

sysctl -w net.bridge.bridge-nf-call-iptables=1
sysctl -w net.bridge.bridge-nf-call-ip6tables=1

Эти настройки гарантируют, что iptables/nftables правила, несмотря на мостовую сеть, также будут применяться к трафику на уровнях 3 и 4 модели OSI.

Заключение

Таким образом, чтобы успешно заблокировать трафик в вашей сетевой конфигурации, вы должны адаптировать подход с учетом специфичности работы bridged LXC контейнеров. Использование ebtables и bridge rules в nftables может значительно упростить решение задачи. Не забывайте периодически проверять правила и логи системы для выявления случайных уязвимостей или несоответствий. Совершенствование сетевых навыков со временем поможет вам разрабатывать более сложные и надежные сетевые стратегии.

Оцените материал
Добавить комментарий

Капча загружается...