Firewalld блок / падение и разрешить по IP

1139
Daniel Böttner

У нас есть корневой сервер Linux, который в первую очередь является сервером Docker. Хостинг контейнеров и CI Runner.

Для защиты этого сервера основная идея на данный момент заключается в

  • заблокировать весь трафик
  • за исключением одного (или нескольких) разрешенных IP-адресов.

Я вчера добавил богатые правила для ip4

  • блокировка 0.0.0.0/0
  • явно разрешая наш статический IP

Это привело к тому, что меня заблокировали от доступа. Контейнер Docker, где все еще доступны. Контейнеры генерируют новый интерфейс, насколько я понимаю, эти интерфейсы должны отвечать только за связь между хостом и контейнером. По крайней мере, я надеюсь, что firewalld фильтрует трафик до того, как трафик будет перенаправлен, например, с eth0 на dockerinterface1234.

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

2

2 ответа на вопрос

1
Aeyoun

Принятие из моего руководства по IP-зонам для firewalld :

Начните с изменения зоны по умолчанию для удаления:

firewallctl config set default-zone drop 

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

 firewallctl new --permanent zone --name "myzone" firewallctl zone "myzone" --permanent add source "198.51.100.0/24" firewallctl zone "myzone" --permanent add source "2001:0DB8::/32" 

(Не забудьте быть готовым к IPv6!) Убедитесь, что ваши зоны выглядят хорошо:

 firewallctl info zones --active 

На этом этапе вы начинаете добавлять порты или службыmyzone . Эти сервисы будут доступны только из добавляемой зоны / IP-подсети, а не из стандартной / общедоступной зоны.

0
unilynx

В Википедии есть хорошая схема потока пакетов на https://upload.wikimedia.org/wikipedia/commons/3/37/Netfilter-packet-flow.svg.

Docker помещает свои правила сопоставления портов в стадию «mangle prerouting». Этот этап выполняется перед «фильтрованием ввода», когда большинство брандмауэров пытаются разместить свои правила фильтрации ввода, но если вы посмотрите на схему, вы увидите, что пакеты будут избегать этого этапа («решение о маршрутизации»), если они будут переадресованы. Что, вероятно, то, что происходит с вами.

Вместо того, чтобы бороться с правилами Докера, вы можете полностью вытеснить их, используя «сырую» таблицу. Сбросить весь трафик с 'eth0' на порт 12345

iptables -t raw -I PREROUTING -i eth0 -p tcp --dport 12345 -j LOG

Обратите внимание, что «необработанная» таблица также влияет на внутренний трафик (Docker), поэтому, если вы собираетесь отбрасывать ее в зависимости от IP-адресов источника, убедитесь, что вы также включили в белый список локальный диапазон IP-адресов хоста и докера.