Saltar al contenido

¿Pasos para limitar las conexiones externas al contenedor docker con iptables?

Te damos la bienvenida a nuestro sitio web, en este lugar encontrarás la resolución que buscas.

Solución:

Solución 1:

Dos cosas a tener en cuenta al trabajar con las reglas de firewall de docker:

  1. Para evitar que Docker golpee sus reglas, use el DOCKER-USER cadena
  2. Docker hace el mapeo de puertos en el PREROUTING cadena de la nat mesa. Esto sucede antes de la filter reglas, entonces --dest y --dport verá la IP interna y el puerto del contenedor. Para acceder al destino original, puede utilizar -m conntrack --ctorigdstport.

Por ejemplo:

iptables -A DOCKER-USER -i eth0 -s 8.8.8.8 -p tcp -m conntrack --ctorigdstport 3306 --ctdir ORIGINAL -j ACCEPT
iptables -A DOCKER-USER -i eth0 -s 4.4.4.4 -p tcp -m conntrack --ctorigdstport 3306 --ctdir ORIGINAL -j ACCEPT
iptables -A DOCKER-USER -i eth0 -p tcp -m conntrack --ctorigdstport 3306 --ctdir ORIGINAL -j DROP

NOTA: Sin --ctdir ORIGINAL, esto también coincidiría con los paquetes de respuesta que regresan para una conexión desde el contenedor al puerto 3306 en algún otro servidor, ¡que casi con seguridad no es lo que desea! No necesitas esto estrictamente si, como yo, tu primera regla es -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPTya que eso se ocupará de todos los paquetes de respuesta, pero sería más seguro seguir usando --ctdir ORIGINAL de todas formas.

Solución 2:

Con Docker v.17.06 hay una nueva cadena de iptables llamada DOCKER-USER. Esta es para sus reglas personalizadas: https://docs.docker.com/network/iptables/

A diferencia de la cadena DOCKER, no se reinicia al construir/iniciar contenedores. Por lo tanto, podría agregar estas líneas a su configuración/secuencia de comandos de iptables para aprovisionar el servidor incluso antes de instalar la ventana acoplable e iniciar los contenedores:

-N DOCKER
-N DOCKER-ISOLATION
-N DOCKER-USER
-A DOCKER-ISOLATION -j RETURN
-A DOCKER-USER -i eth0 -p tcp -m tcp --dport 3306 -j DROP
-A DOCKER-USER -j RETURN

Ahora el puerto para MySQL está bloqueado para el acceso externo (eth0), aunque la ventana acoplable abre el puerto para el mundo. (Estas reglas asumen que su interfaz externa es eth0).

Eventualmente, tendrá que limpiar iptables, reiniciar el servicio docker primero, si lo estropeó demasiado tratando de bloquear el puerto como lo hice yo.


Solución 3:

ACTUALIZAR: Si bien esta respuesta sigue siendo válida, la respuesta de @SystemParadox usando DOCKER-USER en combinación con --ctorigdstport es mejor.

Aquí hay una solución que persiste bien entre reinicios y le permite afectar el expuesto puerto en lugar de interno Puerto.

iptables -t mangle -N DOCKER-mysql
iptables -t mangle -A DOCKER-mysql -s 22.33.44.144/32 -j RETURN
iptables -t mangle -A DOCKER-mysql -s 22.33.44.233/32 -j RETURN
iptables -t mangle -A DOCKER-mysql -j DROP
iptables -t mangle -A PREROUTING -i eth0 -p tcp -m tcp --dport 3306 -j DOCKER-mysql

Creé una imagen de Docker que usa este método para administrar automáticamente las iptables por usted, usando variables de entorno o dinámicamente con etcd (o ambos):

https://hub.docker.com/r/colinmollenhour/confd-firewall/


Solución 4:

ACTUALIZAR: Si bien es válida en 2015, esta solución ya no es la forma correcta de hacerlo.

La respuesta parece estar en la documentación de Docker en https://docs.docker.com/articles/networking/#the-world

Las reglas de reenvío de Docker permiten todas las direcciones IP de origen externo de forma predeterminada. Para permitir que solo una IP o red específica acceda a los contenedores, inserte una regla negada en la parte superior de la cadena de filtros DOCKER. Por ejemplo, para restringir el acceso externo de modo que solo la fuente IP 8.8.8.8 pueda acceder a los contenedores, se podría agregar la siguiente regla: iptables -I DOCKER -i ext_if ! -s 8.8.8.8 -j DROP

Lo que terminé haciendo fue:

iptables -I DOCKER -i eth0 -s 8.8.8.8 -p tcp --dport 3306 -j ACCEPT
iptables -I DOCKER -i eth0 -s 4.4.4.4 -p tcp --dport 3306 -j ACCEPT
iptables -I DOCKER 3 -i eth0 -p tcp --dport 3306 -j DROP

no toqué el --iptables o --icc opciones

Puntuaciones y reseñas

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *