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:
- Para evitar que Docker golpee sus reglas, use el
DOCKER-USER
cadena - Docker hace el mapeo de puertos en el
PREROUTING
cadena de lanat
mesa. Esto sucede antes de lafilter
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 ACCEPT
ya 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