No se puede hacer ping / acceder al host de docker en 172.17.0.1 desde el interior de un contenedor

Mi host de docker escucha en 172.17.0.1.

Puedo enrollarlo desde la máquina host, pero cuando enrollo la misma ip / puerto desde el contenedor, obtengo el tiempo de espera.

Puedo hacer ping a cualquier cosa desde el contenedor, pero no puedo acceder al host.

¿Qué me estoy perdiendo ?

El contenedor es la imagen de Jenkins ejecutada por este comando:

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

Ejecución de curl en el host:

rizo http://172.17.0.1:2375 {"message":"página no encontrada"}

Ejecutar curl desde la ventana acoplable agotará el tiempo de espera.

rizo http://172.17.0.1:2375 curl: (7) No se pudo conectar al puerto 172.17.0.1 2375: Se agotó el tiempo de espera de la conexión

Por lo general, esto se debe a que iptables en el host está bloqueando el acceso desde las redes de docker. Puedes mirar iptables -S o iptables -nvL para ver las reglas.


Dicho esto, si abre la API de Docker, debe tener cuidado con quién puede acceder a esa API. El uso del puerto 2375 normalmente significa que no ha configurado mTLS, consulte guía de docker para configurar MTL. Esto significa que cualquier persona con acceso al puerto puede enviar llamadas a la API, lo que significa que un usuario local sin privilegios, o cualquier otro contenedor, tiene la capacidad de obtener root en su host. En tu caso, es tan fácil como:

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

La solución recomendada es usar DinD para ejecutar el motor de docker dentro de un contenedor, o compartir el socket de docker como un montaje de archivo/volumen con el acceso UID/GID apropiado al archivo. Esto garantiza que solo ese contenedor tenga acceso al motor de docker en lugar de todos los usuarios y cualquier contenedor que se ejecute en el host. Para manejar los problemas de acceso de UID/GID con archivos montados en un volumen, he hecho esto específicamente para las imágenes de Jenkins en mi jenkins-docker repositorio, y hay una solución más genérica en mi fix-script de permanentes en mi repositorio base de docker.

@BMitch-Lo he descubierto , pero también lo hiciste bien (si lo publicas como respuesta, aceptaré y eliminaré el mío), las iptables bloquearon el acceso. una vez que lo abrí, funcionó como se esperaba.

¿Cómo se configura el firewall en el host? Incluya la salida ‘iptables-S’ en su pregunta.

@BMitch-tenías razón. iptables bloqueó el acceso. puedes publicar esto como respuesta.

Además, exponer el socket docker a la red hace que sea trivial piratear el servidor. Cualquier persona con acceso a la red, ya sea un usuario local sin privilegios o cualquier persona remota, puede ejecutar docker-H tcp://172.17.0.1:2375 run-it rm rm --privileged --pid host debian nsenter-t 1-m-u-n-i bash para obtener root. Otorgue acceso al archivo de socket con permisos de grupo y un montaje de volumen, o configure MTL. Redirecting…