Как правильно ограничить доступ к контейнерам Docker, чтобы разрешить только источники в локальной сети?

Я пытался найти способ обеспечить избирательный доступ к контейнерам только из локальной сети, частью которой является хост докера (Linux). Я видел, как этот вопрос задавали/ответили на Reddit, Stack и некоторых других сайтах. Они просто указывают, когда вы публикуете порты, чтобы включить адрес локального хоста в ваш компоновочный yaml, например:

      ports:
  - 127.0.0.1:8080:8080

Полагаю, это имеет смысл, но после реализации я вижу вот что в iptables, созданном докером:

      Chain DOCKER (5 references)
target     prot opt source               destination
ACCEPT     tcp  --  anywhere             172.22.0.2           tcp dpt:8080

И когда я перенаправляю порт на своем шлюзе, к нему можно получить доступ за пределами локальной сети.

Я видел, как другие указывали на эту страницу, на которой показано, как ограничить все контейнеры: https://docker-docs.netlify.app/network/iptables/ , но я не думаю (?), что этот вариант подойдет мне, потому что я хотите выборочно контролировать, какие контейнеры ограничены.

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

Возможно релевантная информация: сервер Ubuntu 22, контейнеры используют сетевой режим по умолчанию (мост), ufw установлен/активен.

2 ответа

Вот что мне наконец помогло — с https://github.com/chaifeng/ufw-docker

Измените файл конфигурации UFW /etc/ufw/after.rules и добавьте в конец файла следующие правила:

      # BEGIN UFW AND DOCKER
*filter
:ufw-user-forward - [0:0]
:ufw-docker-logging-deny - [0:0]
:DOCKER-USER - [0:0]
-A DOCKER-USER -j ufw-user-forward

-A DOCKER-USER -j RETURN -s 10.0.0.0/8
-A DOCKER-USER -j RETURN -s 172.16.0.0/12
-A DOCKER-USER -j RETURN -s 192.168.0.0/16

-A DOCKER-USER -p udp -m udp --sport 53 --dport 1024:65535 -j RETURN

-A DOCKER-USER -j ufw-docker-logging-deny -p tcp -m tcp --tcp-flags FIN,SYN,RST,ACK SYN -d 192.168.0.0/16
-A DOCKER-USER -j ufw-docker-logging-deny -p tcp -m tcp --tcp-flags FIN,SYN,RST,ACK SYN -d 10.0.0.0/8
-A DOCKER-USER -j ufw-docker-logging-deny -p tcp -m tcp --tcp-flags FIN,SYN,RST,ACK SYN -d 172.16.0.0/12
-A DOCKER-USER -j ufw-docker-logging-deny -p udp -m udp --dport 0:32767 -d 192.168.0.0/16
-A DOCKER-USER -j ufw-docker-logging-deny -p udp -m udp --dport 0:32767 -d 10.0.0.0/8
-A DOCKER-USER -j ufw-docker-logging-deny -p udp -m udp --dport 0:32767 -d 172.16.0.0/12

-A DOCKER-USER -j RETURN

-A ufw-docker-logging-deny -m limit --limit 3/min --limit-burst 10 -j LOG --log-prefix "[UFW DOCKER BLOCK] "
-A ufw-docker-logging-deny -j DROP

COMMIT
# END UFW AND DOCKER

Единственная разница в том, что я изменил все ссылки на 192.168.0.0/24, чтобы они соответствовали моей локальной сети. Я провел небольшое тестирование, и пока оно не нарушает внутреннюю сеть Docker, защищает контейнеры от публичного доступа и позволяет мне использовать ufw для создания правил.

Сообщение «Ограничить доступ в Интернет — Docker Container» приняло этот ответ Билала Усеана :

Создание сети для доступа в Интернет

сеть докеров создать --subnet=172.19.0.0/16 Интернет

Создание сети для блокировки доступа в Интернет

сеть докеров создать --internal --subnet 10.1.1.0/24 без Интернета

Если вы хотите подключить докер-контейнер к Интернету

       docker network connect internet container-name

Если вы хотите заблокировать доступ в Интернет

       docker network connect no-internet container-name

Примечание

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

Другие вопросы по тегам