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?
EDITAR : estas bases de datos están en contenedores Docker. ¿Podría esto estar relacionado? ¿está anulando mi configuración ufw?
EDIT2 : salida desudo 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)
ufw status
8083
y8086
. Agregué elufw status verbose
resultado en la pregunta. Gracias.Respuestas:
El problema era usar la
-p
bandera en los contenedores.Resulta que Docker realiza cambios directamente en su
iptables
, que no se muestran conufw status
.Las posibles soluciones son:
Deja de usar la
-p
bandera. Utilice la conexión de docker o las redes de docker en su lugar.Ate los contenedores localmente para que no queden expuestos fuera de su máquina:
docker run -p 127.0.0.1:8080:8080 ...
Si insiste en usar la
-p
bandera, dígale a Docker que no toque laiptables
suya deshabilitándolas/etc/docker/daemon.json
y reiniciando:{ "iptables" : false }
Recomiendo la opción 1 o 2. Tenga en cuenta que la opción 3 tiene efectos secundarios , como que los contenedores no puedan conectarse a Internet.
fuente
-p
lo máximo posible. Por ejemplo, en el caso de un proxy inverso, no asigno ningún puerto para los contenedores de trabajo, y luego pongo nginx en su propio contenedor con-p 80:80
y--link
a los demás. De esta forma no puede haber ningún conflicto de puertos y el único punto de acceso es a través de nginx./etc/default/docker
es un archivo de configuración utilizado por la configuración inicial. Si ha pasado del sistema de arranque al sistema, este archivo no se utilizará.16.04 presenta nuevos desafíos. Hice todos los pasos como se muestra Ejecutando Docker detrás del firewall ufw PERO NO pude hacer que Docker más UFW funcionara en 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:Entonces emití
sudo service docker stop
entoncessudo service docker start
FINALMENTE ventana acoplable está simplemente siguiendo las reglas apropiadas en UFW.Datos adicionales: ¡ Docker anula UFW!
fuente
Si está utilizando el sistema init de systemd (Ubuntu 15.10 y posterior) edite el
/etc/docker/daemon.json
(puede que necesite crearlo si no existe), asegúrese de que tenga laiptables
clave configurada:EDITAR : 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
comoACCEPT
activado/etc/default/ufw
y aplicar el truco descrito aquí: https://stackoverflow.com/a/17498195/507564fuente
Una solución rápida es cuando se ejecuta Docker y se realiza la asignación de puertos. Siempre puedes hacer
para evitar que se acceda a su Docker desde el exterior.
fuente
Uso de
/etc/docker/daemon.json
con contenidoPuede 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 pase y cómo se crea este contenedor, por lo que hay una solución:
Después de crear el
/etc/docker/daemon.json
archivo, invoque:así que configura la política de reenvío predeterminada en UFW para aceptar y usa:
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 al ejecutarlo
docker-compose up
.Describí el problema y la solución de manera más completa en este artículo
¡Espero eso ayude!
fuente
En mi caso, terminé modificando iptables para permitir el acceso a Docker solo desde IP específicas.
Según la respuesta de ESala :
Ejemplo de registros agregados a iptables por Docker
Enrutamiento a la cadena 'DOCKER':
Reenvío de paquetes de la cadena 'DOCKER' al contenedor:
Puede modificar iptables para permitir el acceso a la cadena DOCKER solo desde la IP de origen especificada (por ejemplo
1.1.1.1
):Es posible que desee usar
iptables-save > /tmp/iptables.conf
yiptables-restore < /tmp/iptables.conf
volcar, editar y restaurar las reglas de iptables.fuente
Use --network = host cuando inicie el contenedor para que Docker asigne el puerto a la red aislada de solo 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.
fuente
Inicie sesión en su consola docker:
Y luego dentro de su consola docker:
Agregue sus reglas de ufw y habilite el ufw
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.Modify hostconfig.json (ruta de acceso predeterminada: / var / lib / docker, puede cambiar la suya)
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;
fuente
Solía
docker-compose
iniciar varios contenedores y también tenía 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
docker-compose.yml
archivo:a esto:
Ahora los otros contenedores acoplables todavía pueden usar el puerto, pero no puedo acceder a él desde afuera.
fuente