Назад | Перейти на главную страницу

Блокировать все входящие запросы на любом порту, кроме списка исходных IP-адресов

У меня есть несколько CentOS 7 VPS под управлением Docker, которые организованы Cattle (Rancher).

Эти VPS должны быть доступны только с нескольких IP-адресов в Интернете, а все другие источники должны быть исключены / игнорироваться. Я правильно настроил firewalld, и ограничение работает для стандартных системных служб, таких как SSH, но когда я развертываю для них контейнер, открытый порт разрешается откуда угодно.

Кажется, что Docker сопоставляет IP / порт хоста с IP / портом контейнера (что правильно), но затем это правило вставляется в netfilter ПЕРЕД моим явным списком разрешенных источников ...

Есть ли способ обойти это? Любая помощь приветствуется.

Я боролся с этим несколько часов, но вот решение, использующее iptables вместо того firewalld.

Ключ в том, чтобы поставить ваши блоки раньше, чем Docker. Однако у Docker есть отвратительная привычка помещать свои правила прямо в начало FORWARD цепь на filter стол; при каждом перезапуске службы. Итак ... мне пришлось проявить творческий подход и использовать mangle стол и POSTROUTING цепочка, вот так:

*mangle
:IS-ALLOWED -
-A IS-ALLOWED ! -o docker0 -j RETURN
-A IS-ALLOWED -o docker0 -s 1.1.1.1 -j RETURN
-A IS-ALLOWED -j DROP
-I POSTROUTING -j IS-ALLOWED
COMMIT

*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:IS-ALLOWED -
-A IS-ALLOWED -s 1.1.1.1 -j RETURN
-A IS-ALLOWED -i lo -j RETURN
-A IS-ALLOWED -j DROP
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -j IS-ALLOWED
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
COMMIT

Это ограничивает доступ только 1.1.1.1 для служб машины (SSH, ICMP и т. д.), а службы перенаправления Docker на docker0 интерфейс.

Да, вам просто нужно сделать так, чтобы ваши записи блокирующего брандмауэра оценивались до записей, добавленных докером.

В моей среде docker добавляет разрешающие правила в цепочку под названием DOCKER и запрещающие правила в цепочку под названием DOCKER-ISOLATION. Они оцениваются в начале цепочки FORWARD. Так что, если ваш env похож на мой, просто разместите свои собственные правила в верхней части цепочки FORWARD. Это находится в таблице «Фильтр». Недавно я запутался в таблицах filter и nat.

Надеюсь, что это поможет - Дилан