it-swarm-es.com

El firewall sin complicaciones (UFW) no bloquea nada cuando se usa Docker

Esta es la primera vez que configuro un servidor Ubuntu (14.04 LTS) y tengo problemas para configurar el firewall (UFW).

Solo necesito ssh y http, así que estoy haciendo esto:

Sudo ufw disable

Sudo ufw reset
Sudo ufw default deny incoming
Sudo ufw default allow outgoing

Sudo ufw allow 22/tcp
Sudo ufw allow 80/tcp

Sudo ufw enable
Sudo reboot

Pero aún puedo conectarme a bases de datos en otros puertos de esta máquina. ¿Alguna idea de lo que estoy haciendo mal?

EDIT: estas bases de datos están en contenedores Docker. ¿Podría esto estar relacionado? ¿está anulando mi configuración ufw?

EDIT2: salida de Sudo ufw status verbose

Status: active
Logging: on (low)
Default: deny (incoming), allow (outgoing), deny (routed)
New profiles: skip

To                         Action      From
--                         ------      ----
22/tcp                     ALLOW IN    Anywhere
80/tcp                     ALLOW IN    Anywhere
22/tcp (v6)                ALLOW IN    Anywhere (v6)
80/tcp (v6)                ALLOW IN    Anywhere (v6)
42
ESala

El problema fue usar la bandera -p en los contenedores.

Resulta que Docker realiza cambios directamente en su iptables, que no se muestran con ufw status.

Las posibles soluciones son:

  1. Deje de usar la bandera -p. Utilice el enlace de docker o redes de docker en su lugar.

  2. Ate los contenedores localmente para que no queden expuestos fuera de su máquina:

    docker run -p 127.0.0.1:8080:8080 ...

  3. Si insiste en usar el indicador -p, dígale a Docker que no toque su iptables deshabilitándolos en /etc/docker/daemon.json y reiniciando:

    { "iptables" : false }

Recomiendo la opción 1 o 2. Tenga cuidado con la opción 3 tiene efectos secundarios , como que los contenedores no puedan conectarse a Internet.

61
ESala

16.04 presenta nuevos desafíos. Hice todos los pasos como se muestra Ejecutando Docker detrás del firewall ufwPERO NO pude hacer que Docker plus UFW funcione el 16.04. En otras palabras, no importa lo que hice, todos los puertos acoplables quedaron expuestos globalmente a Internet. Hasta que encontré esto: Cómo configurar Docker 1.12+ para que NO interfiera con IPTABLES/FirewallD

Tuve que crear el archivo /etc/docker/daemon.json y poner lo siguiente en:

{
    "iptables": false
}

Luego emití Sudo service docker stop luego Sudo service docker start FINALMENTE docker simplemente está siguiendo las reglas apropiadas en UFW.

Datos adicionales: ¡Docker anula UFW!

8
Hal Jordan

Si está utilizando el sistema init de systemd (Ubuntu 15.10 y posterior) edite el /etc/docker/daemon.json (podría necesitar crearlo si no existe), asegúrese de que tenga configurada la tecla iptables:

{   "iptables" : false }

EDIT: esto puede hacer que pierda la conexión a Internet desde contenedores internos

Si tiene UFW habilitado, verifique que puede acceder a Internet desde dentro de los contenedores. si no, debe definir DEFAULT_FORWARD_POLICY como ACCEPT en /etc/default/ufw y aplicar el truco descrito aquí: https://stackoverflow.com/a/17498195/507564

4
orshachar

Una solución rápida es cuando se ejecuta Docker y se realiza la asignación de puertos. Siempre puedes hacer

docker run ...-p 127.0.0.1:<ext pot>:<internal port> ...

para evitar que se acceda a su Docker desde el exterior.

2
kimy82

Uso de /etc/docker/daemon.json con contenido

{
  "iptables": false
}

puede sonar como una solución pero solo funciona hasta el próximo reinicio . Después de eso, puede notar que ninguno de sus contenedores tiene acceso a Internet, por lo que no puede hacer ping a ningún sitio web. Puede ser un comportamiento no deseado.

Lo mismo se aplica al enlace de un contenedor a una IP específica. Es posible que no quieras hacer eso. La última opción es crear un contenedor y tenerlo detrás de UFW sin importar lo que suceda y cómo se crea este contenedor, por lo que hay una solución:

Después de crear el archivo /etc/docker/daemon.json, invoque:

sed -i -e 's/DEFAULT_FORWARD_POLICY="DROP"/DEFAULT_FORWARD_POLICY="ACCEPT"/g' /etc/default/ufw
ufw reload

así que configura la política de reenvío predeterminada en UFW para aceptar y usa:

iptables -t nat -A POSTROUTING ! -o docker0 -s 172.17.0.0/16 -j MASQUERADE

Si está a punto de usar docker-compose, la IP del comando anterior debe reemplazarse por la IP de la red docker-compose que se crea cuando se ejecuta con docker-compose up.

Describí el problema y la solución de manera más completa en este artículo

¡Espero eso ayude!

2
mkubaczyk

En mi caso, terminé modificando iptables para permitir el acceso a Docker solo desde IP específicas.

Según respuesta de ESala :

Si usa la bandera -p en los contenedores, Docker realiza cambios directamente en iptables, ignorando el ufw.

Ejemplo de registros agregados a iptables por Docker

Enrutamiento a la cadena 'DOCKER':

-A PREROUTING -m addrtype --dst-type LOCAL -j DOCKER
-A OUTPUT ! -d 127.0.0.0/8 -m addrtype --dst-type LOCAL -j DOCKER

Reenvío de paquetes de la cadena 'DOCKER' al contenedor:

-A DOCKER -i docker0 -j RETURN
-A DOCKER ! -i docker0 -p tcp -m tcp --dport 6379 -j DNAT --to-destination 172.17.0.3:6379

Puede modificar iptables para permitir el acceso a la cadena DOCKER solo desde la IP de origen especificada (por ejemplo, 1.1.1.1):

-A PREROUTING -s 1.1.1.1 -m addrtype --dst-type LOCAL -j DOCKER
-A OUTPUT -s 1.1.1.1 ! -d 127.0.0.0/8 -m addrtype --dst-type LOCAL -j DOCKER

Es posible que desee utilizar iptables-save > /tmp/iptables.conf y iptables-restore < /tmp/iptables.conf para volcar, editar y restaurar las reglas de iptables.

1
AI Mechanic
  1. Inicie sesión en su consola docker:

    Sudo docker exec -i -t docker_image_name/bin/bash

  2. Y luego dentro de su consola docker:

    Sudo apt-get update
    Sudo apt-get install ufw
    Sudo ufw allow 22
    
  3. Agregue sus reglas de ufw y habilite el ufw

    Sudo ufw enable

    • Su imagen de Docker debe comenzar con --cap-add = NET_ADMIN

Para habilitar la opción Docker "NET_ADMIN":

1.Detener el contenedor:

docker detiene su contenedor; 2. Obtener id del contenedor:

docker inspeccione su contenedor; 3.Modifique hostconfig.json (ruta de acceso predeterminada:/var/lib/docker, puede cambiar la suya)

vim /var/lib/docker/containers/containerid/hostconfig.json

4. Busque "CapAdd" y modifique nulo a ["NET_ADMIN"];

...., "VolumesFrom": nulo, "CapAdd": ["NET_ADMIN"], "CapDrop": nulo, .... 5. Reinicie la ventana acoplable en la máquina host;

reinicio de la ventana acoplable de servicio; 6.Inicie su recipiente;

docker inicia su contenedor;

0
Stefan

Use --network = Host cuando inicie el contenedor para que Docker asigne el puerto a la red aislada de Host únicamente en lugar de la red puente predeterminada. No veo formas legales de bloquear la red puenteada. Alternativamente, puede usar una red personalizada definida por el usuario con aislamiento.

0
thecoder

Usé _docker-compose_ para iniciar varios contenedores y también tuve el problema de que un puerto estaba expuesto al mundo ignorando las reglas ufw.

La solución para hacer que el puerto solo esté disponible para mis contenedores docker fue este cambio en mi archivo _docker-compose.yml_:

_ports:
- "1234:1234"
_

a esto:

_ports:
- "1234"
_

Ahora los otros contenedores acoplables todavía pueden usar el puerto, pero no puedo acceder a él desde afuera.

0
TmTron