Cómo usar Docker con un firewall UFW

Sorprendentemente, Docker no funciona de manera inmediata con el “Firewall universal” o UFW de Linux. Ambos modifican la misma configuración de iptables, y esto puede generar configuraciones incorrectas que expongan contenedores que se suponía que no eran públicos. Aquí se explica cómo solucionarlo.

¿Por qué Docker no funciona con UFW?

UFW pretende ser un firewall muy simple. El problema es que tanto UFW como Docker intentan modificar las mismas reglas de firewall subyacentes, y este conflicto requiere una configuración adicional para resolver si desea ejecutar UFW y Docker juntos.

Si configura un firewall UFW básico para denegar de forma predeterminada y permitir HTTP y SSH, esto parecerá seguro, pero no impedirá que Docker inicie contenedores vinculados a otros puertos. Este problema puede ser difícil de detectar, ya que UFW y Docker son sistemas separados. UFW le está mintiendo sin saberlo y no mostrará los puertos abiertos de los contenedores Docker.

Esto puede ser un gran problema si no lo detecta. Por ejemplo, tal vez desea ejecutar un panel de administración interno en el puerto 8000 e incluirlo en la lista blanca de su propia dirección IP. Si bien esta no es la configuración más segura para empezar, generalmente está bien, especialmente si el panel tiene autenticación adicional.

Sin embargo, UFW mostrará la regla de firewall como correctamente incluida en la lista blanca y, por supuesto, será visible para usted desde su ubicación incluida en la lista blanca. Pero, si se ejecuta a través de Docker, será visible en el puerto 8000 desde cualquier lugar de forma predeterminada.

Arreglando la configuración de Docker

Hay una solución que proporciona Docker, editando /etc/default/docker o /etc/docker/daemon.json y simplemente apagando Docker’s iptables funcionalidad en total:

DOCKER_OPTS="--iptables=false"

Esto funciona, sin embargo, esta es solo una solución a medias. Deshabilita la capacidad de Docker para administrar su propia red y puede hacer que los contenedores no puedan acceder a Internet de forma inmediata. Esto aún puede funcionar, pero deberá mantener manualmente iptables reglas para contenedores Docker y redes personalizadas, lo cual es complicado, molesto y anula el propósito de la simplicidad de UFW.

La solución real es complicada, pero afortunadamente es lo suficientemente común como para que hay un útil repositorio de Github detallando el problema y los pasos para solucionarlo. Esencialmente, necesita modificar la configuración de UFW en /etc/ufw/after.rules para agregar el siguiente bloque al final:

# BEGIN UFW AND DOCKER
*filter
:ufw-user-forward - [0:0]
:ufw-docker-logging-deny - [0:0]
:DOCKER-USER - [0:0]
-A DOCKER-USER -j ufw-user-forward

-A DOCKER-USER -j RETURN -s 10.0.0.0/8
-A DOCKER-USER -j RETURN -s 172.16.0.0/12
-A DOCKER-USER -j RETURN -s 192.168.0.0/16

-A DOCKER-USER -p udp -m udp --sport 53 --dport 1024:65535 -j RETURN

-A DOCKER-USER -j ufw-docker-logging-deny -p tcp -m tcp --tcp-flags FIN,SYN,RST,ACK SYN -d 192.168.0.0/16
-A DOCKER-USER -j ufw-docker-logging-deny -p tcp -m tcp --tcp-flags FIN,SYN,RST,ACK SYN -d 10.0.0.0/8
-A DOCKER-USER -j ufw-docker-logging-deny -p tcp -m tcp --tcp-flags FIN,SYN,RST,ACK SYN -d 172.16.0.0/12
-A DOCKER-USER -j ufw-docker-logging-deny -p udp -m udp --dport 0:32767 -d 192.168.0.0/16
-A DOCKER-USER -j ufw-docker-logging-deny -p udp -m udp --dport 0:32767 -d 10.0.0.0/8
-A DOCKER-USER -j ufw-docker-logging-deny -p udp -m udp --dport 0:32767 -d 172.16.0.0/12

-A DOCKER-USER -j RETURN

-A ufw-docker-logging-deny -m limit --limit 3/min --limit-burst 10 -j LOG --log-prefix "[UFW DOCKER BLOCK] "
-A ufw-docker-logging-deny -j DROP

COMMIT
# END UFW AND DOCKER

Puede hacerlo manualmente, pero también se proporciona una buena utilidad en este repositorio que lo automatizará y proporcionará algunos comandos útiles para verificar el estado real del firewall. Puedes descargarlo desde este repositorio:

sudo wget -O /usr/local/bin/ufw-docker https://github.com/chaifeng/ufw-docker/raw/master/ufw-docker

sudo chmod +x /usr/local/bin/ufw-docker

Luego, instale la configuración y reinicie UFW.

ufw-docker install

sudo systemctl restart ufw

Una vez reiniciado, los cambios deberían aplicarse automáticamente, pero si no es así, es posible que deba reiniciar Docker o su máquina en general. Una vez que esté habilitado, todos los puertos deberían estar correctamente bloqueados.

Lista blanca de puertos de contenedores Docker con UFW

Esta solución requiere que configure el puerto de manera un poco diferente. los ufw-docker La utilidad tiene un comando que incluirá de forma selectiva los puertos en la lista blanca de contenedores Docker específicos.

ufw-docker allow httpd 80

Sin embargo, si desea utilizar una regla más avanzada, como una lista blanca basada en IP, deberá utilizar ufw route allow

ufw route allow proto tcp from 1.2.3.4 to any port 9443

Deja un comentario

En esta web usamos cookies para personalizar tu experiencia de usuario.    Política de cookies
Privacidad