У меня есть несколько 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.
Надеюсь, что это поможет - Дилан