Firewall no complicado (UFW) no bloquea nada al usar Docker

24

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 todavía puedo conectarme a bases de datos en otros puertos de esta máquina . ¿Alguna idea sobre qué estoy haciendo mal?

EDITAR : 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)
    
pregunta ESala 25.07.2015 - 10:00

7 respuestas

36

El problema era usar el indicador -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. Deja de usar el indicador -p . Utilice en su lugar los enlaces de Docker o las redes de Docker .

  2. Enlace los contenedores localmente para que no estén expuestos fuera de su máquina:

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

  3. Si insistes en utilizar el indicador -p , indica a docker que no toque tu 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 contenedores que no pueden conectarse a internet.

    
respondido por el ESala 25.07.2015 - 10:50
8

16.04 presenta nuevos desafíos. Hice todos los pasos como se muestra Ejecutando Docker detrás del firewall ufw PERO NO pude obtener docker más UFW para trabajar el 16.04. En otras palabras, sin importar lo que hice, todos los puertos de Docker se expusieron globalmente a Internet. Hasta que encontré esto: Cómo configurar Docker 1.12+ para NO interferir 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 sigue las reglas apropiadas en UFW.

Datos adicionales: Docker anula UFW!

    
respondido por el Hal Jordan 06.12.2016 - 21:50
5

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 la clave iptables configurada:

{   "iptables" : false }

EDITAR : esto podría hacer que pierda la conexión a Internet desde el interior de los contenedores

Si tienes UFW habilitado, verifica que puedas acceder a internet desde contenedores. si no, debe definir DEFAULT_FORWARD_POLICY como ACCEPT sobre /etc/default/ufw y aplicar el truco que se describe aquí: enlace

    
respondido por el orshachar 05.10.2016 - 12:11
4

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, por ejemplo, hacer ping a ningún sitio web. Puede ser un comportamiento no deseado.

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

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

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

para configurar la política de reenvío predeterminada en UFW para aceptar y usar:

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

Si va a utilizar docker-compose, el comando de IP de arriba debe reemplazarse por IP de la red docker-compose crea al ejecutarlo con docker-compose up .

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

¡Espero que ayude!

    
respondido por el mkubaczyk 08.09.2017 - 19:47
1

Una solución rápida es cuando ejecuta Docker y hace 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 afuera.

    
respondido por el kimy82 16.08.2017 - 14:01
0

Use --network = host cuando inicie el contenedor, de modo que Docker asignará el puerto a una red aislada solo de host 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.

    
respondido por el thecoder 11.03.2017 - 21:10
0
  1. Inicie sesión en la consola de su docker:

      

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

  2. Y luego dentro de su consola de docker:

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

      

    sudo ufw enable

    • Tu imagen de Docker debe iniciarse con --cap-add = NET_ADMIN

Para habilitar la opción del Docker "NET_ADMIN":

1.Stop Container:

docker detiene tu contenedor; 2. Obtener ID del contenedor:

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

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

4.Busca "CapAdd" y modifica null a ["NET_ADMIN"];

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

service docker restart; 6.Inicie su equipo;

docker start yourcontainer;

    
respondido por el Stefan 03.04.2018 - 13:03

Lea otras preguntas en las etiquetas