Вопрос или проблема
Почему:
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
.