Почему сервис Docker Swarm создаётся без сети и не использует docker_gwbridge, как ожидалось?

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

Почему:

docker service create --name alp alpine apk update

Использует интерфейс docker0 вместо docker_gwbridge, как описано в документации по swarm?

Это известно / ожидаемо / сломано?

Длинная версия

Я усиливаю безопасность docker swarm и наткнулся на аномалию:
Если я правильно понимаю концепцию сети swarm (я выделил это жирным), то служба без сети все равно должна использовать docker_gwbridge, когда обращается к сети, чтобы выйти, например, в интернет.

docker_gwbridge – это мостовая сеть, которая соединяет оверлейные
сети (включая входящую сеть) с физической сетью отдельного Docker
демона. По умолчанию каждый контейнер, работающий в службе,
подключен к сети docker_gwbridge локального хоста Docker.

Я создаю эту простую службу
sudo docker service create --name alp alpine apk update и смотрю на логи nft (я знаю, что docker использует iptables).

Я вижу, что эта служба использует docker0 вместо docker_gwbridge.

Вот вывод:

Dec 20 14:52:44 manager1 kernel: NFT-FORWARD: IN=docker0 OUT=eth0 PHYSIN=veth3689ddb MAC=02:42:e9:4c:8b:bc:02:42:ac:11:00:04:08:00 SRC=172.17.0.4 DST=172.22.240.1 LEN=68 TOS=0x00 PREC=0x00 TTL=63 ID=27536 DF PROTO=UDP SPT=50844 DPT=53 LEN=48
Dec 20 14:52:44 manager1 kernel: NFT-FORWARD: IN=docker0 OUT=eth0 PHYSIN=veth3689ddb MAC=02:42:e9:4c:8b:bc:02:42:ac:11:00:04:08:00 SRC=172.17.0.4 DST=172.22.240.1 LEN=68 TOS=0x00 PREC=0x00 TTL=63 ID=27537 DF PROTO=UDP SPT=50844 DPT=53 LEN=48
Dec 20 14:52:46 manager1 kernel: NFT-FORWARD: IN=docker0 OUT=eth0 PHYSIN=veth3689ddb MAC=02:42:e9:4c:8b:bc:02:42:ac:11:00:04:08:00 SRC=172.17.0.4 DST=172.22.240.1 LEN=68 TOS=0x00 PREC=0x00 TTL=63 ID=28100 DF PROTO=UDP SPT=50844 DPT=53 LEN=48
Dec 20 14:52:46 manager1 kernel: NFT-FORWARD: IN=docker0 OUT=eth0 PHYSIN=veth3689ddb MAC=02:42:e9:4c:8b:bc:02:42:ac:11:00:04:08:00 SRC=172.17.0.4 DST=172.22.240.1 LEN=68 TOS=0x00 PREC=0x00 TTL=63 ID=28101 DF PROTO=UDP SPT=50844 DPT=53 LEN=48 

Когда я создаю службу с --network whatever, и whatever является оверлеем, тогда я вижу трафик, как описано, проходящим через docker_gwbridge.

Почему это происходит? Если я правильно понял документы, этого не должно происходить, и мне бы хотелось понять, почему (особенно с точки зрения безопасности)

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

Создание службы Docker Swarm без явного указания сети вызывает вопрос, связанный с поведением сетевых интерфейсов, таких как docker0 и docker_gwbridge.

Введение

При создании службы в Docker Swarm, согласно документации Docker, ожидается, что контейнеры будут использовать именно сеть docker_gwbridge для доступа к внешним ресурсам. Однако, в вашем случае наблюдается использование интерфейса docker0, что может вызвать обеспокоенность, особенно с точки зрения безопасности.

Почему используется docker0?

При создании службы без указания конкретной сети, Docker по умолчанию подключает контейнеры к стандартной bridge сети, которая создается во время установки Docker — это как раз и есть docker0. Эта команда:

docker service create --name alp alpine apk update

создает службу, но не указывает, к какой сети контейнеры должны подключаться, что приводит к использованию docker0.

Режим работы сетей Docker

Docker использует разные типы сетей для управления подключениями между контейнерами и внешними ресурсами. В случае Swarm, при отсутствии явного указания на использование сети, Docker будет использовать bridge, представляющую собой docker0.

При создании службы с указанием определенной сети, например:

docker service create --name alp --network whatever alpine apk update

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

Технические аспекты

В вашем лог-файле наблюдаются записи, которые подтверждают, что трафик идет через docker0:

IN=docker0 OUT=eth0 PHYSIN=veth3689ddb ...

Это подтверждает, что контейнер при создании службы использует именно данную сеть. При этом docker_gwbridge используется только в том случае, если служба подключена к оверлейной сети.

Безопасность

С точки зрения безопасности, использование docker0 может представлять определенные риски, так как эта сеть имеет доступ ко всем контейнерам, работающим на одном узле Docker. В отличие от сеть оверлей, где общение между контейнерами осуществляется в рамках Swarm и в большей степени изолировано, docker0 открывает связи в пределах локального узла.

Заключение

Ваша ситуация с использованием docker0 вместо docker_gwbridge вполне ожидаема и объяснима исходя из архитектуры и принципов работы Docker. Для повышения безопасности рекомендуется всегда явно указывать сети, особенно в продуктивной среде, чтобы избежать несанкционированного доступа и утечек данных.

Если ваша цель — полностью использовать возможности Swarm и обеспечить достойный уровень безопасности, создавайте службы с явным указанием нужной сети, чтобы гарантировать работу через docker_gwbridge.

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

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