Не удается выполнить пинг / получить доступ к хосту docker на 172.17.0.1 изнутри контейнера

Мой хост docker прослушивает 172.17.0.1.

Я могу свернуть его с хост-компьютера, но когда я сворачиваю тот же ip / порт из контейнера, я получаю тайм-аут.

Я могу пинговать что угодно из контейнера, но я не могу получить доступ к хосту.

Что я упускаю из виду?

Контейнер - это образ Дженкинса, запускаемый этой командой:

docker run -d --name jenkins -v jenkins_home:/var/jenkins_home -p 8080:8080 -p 50000:50000 jenkins/jenkins:2.222.3

Запуск curl на хосте:

локон http://172.17.0.1:2375 {"сообщение":"страница не найдена"}

Запуск curl из docker приведет к тайм-ауту.

локон http://172.17.0.1:2375 curl: (7) Не удалось подключиться к порту 2375 172.17.0.1: время ожидания подключения истекло

Обычно это происходит из-за того, что iptables на хосте блокирует доступ из сетей docker. Вы можете посмотреть на iptables -S или iptables -nvL чтобы ознакомиться с вашими текущими правилами.


Тем не менее, если вы все-таки откроете docker API, вам нужно быть осторожным с тем, кто может получить доступ к этому API. Использование порта 2375 обычно означает, что вы не настроили mTLS, см. руководство docker по настройке mTLS. Это означает, что любой, у кого есть доступ к порту, может отправлять вызовы API, что означает, что непривилегированный локальный пользователь или любой другой контейнер имеет возможность получить root на вашем хосте. В вашем случае это так же просто, как:

docker -H tcp://172.17.0.1:2375 run -it --rm --privileged --pid host debian nsenter -t 1 -m -u -n -i bash

Рекомендуемое решение состоит в том, чтобы либо использовать DinD для запуска docker engine внутри контейнера, либо предоставить общий доступ к сокету docker в качестве монтирования файла / тома с соответствующим доступом UID /GID к файлу. Это гарантирует, что только этот контейнер имеет доступ к движку docker, а не ко всем пользователям и любому контейнеру, запущенному на хосте. Чтобы справиться с проблемами доступа к UID / GID с файлами, смонтированными в томе, я сделал это специально для изображений Дженкинса в моем дженкинс-докер репо, и в моем есть более общее решение скрипт fix-perms в моем репозитории docker-base.

@BMitch - Я понял это - но вы тоже все поняли правильно (если вы опубликуете это в качестве ответа, я приму и удалю свой) iptables заблокировали доступ. как только я открыл его - все сработало, как и ожидалось.

Как настроен брандмауэр на хосте? Пожалуйста, включите выходные данные iptables -S в свой вопрос.

@BMitch - ты был прав. iptables заблокировали доступ. вы можете опубликовать это в качестве ответа.

Кроме того, подключение сокета docker к сети делает тривиальным взлом сервера. Любой, у кого есть доступ к сети, будь то непривилегированный локальный пользователь или кто-либо удаленный, может запустить docker -H tcp://172.17.0.1:2375 run -it --rm --privileged --pid host debian nsenter -t 1 -m -u -n -i bash, чтобы получить root. Либо предоставьте доступ к файлу сокета с групповыми разрешениями и подключением тома, либо настройте mTLS. Redirecting…