
Configuré un VPS nuevo en DO y ahora estoy intentando proteger mi servidor usando el firewall UFW. Pero estoy un poco confundido.
Entonces, mi objetivo es permitir los únicos puertos relacionados con SSH, HTTP/HTTPS. El resto debería estar cerrado. Lo que hice para conseguirlo:
# ufw allow ssh
# ufw allow http
# ufw allow https
# ufw enable
$ 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
443/tcp ALLOW IN Anywhere
22/tcp (v6) ALLOW IN Anywhere (v6)
80/tcp (v6) ALLOW IN Anywhere (v6)
443/tcp (v6) ALLOW IN Anywhere (v6)
Como puede ver, todo está bien aquí: se deniega todo el tráfico entrante excepto 22, 80, 443 puertos como se esperaba.
Por cierto, uso Docker para mi aplicación PHP Laravel. Para iniciar contenedores utilizo el comando: "docker-compose up -d".
$ docker-compose ps
Name Command State Ports
------------------------------------------------------------------------------------
app docker-php-entrypoint php-fpm Up 9000/tcp
database docker-entrypoint.sh mysqld Up 0.0.0.0:3307->3306/tcp, 33060/tcp
web nginx -g daemon off; Up 0.0.0.0:81->80/tcp
Hay un par de puertos disponibles en la máquina host: 3307, 81.
Para asegurarme de que el firewall funcione correctamente utilizo nmap:
$ nmap -Pn [server ip]
Starting Nmap 7.70 ( https://nmap.org ) at 2018-09-13 12:17 EEST
Nmap scan report for [server host] ([server ip])
Host is up (0.054s latency).
Not shown: 995 filtered ports
PORT STATE SERVICE
22/tcp open ssh
25/tcp closed smtp
80/tcp open http
81/tcp open hosts2-ns
443/tcp closed https
Nmap done: 1 IP address (1 host up) scanned in 5.59 seconds
Aquí no puedo entender dos cosas:
25/tcp closed smtp
¿Por qué está esto aquí?
81/tcp open hosts2-ns
¿Por qué se abre este puerto?
Probablemente necesito ingresar al contenedor web y especificar explícitamente la dirección IP 127.0.0.1 en la sección del servidor nginx. Hasta donde yo sé, mysql de forma predeterminada se abre solo para localhost (my.conf), por lo que no vemos el puerto mysql en la lista a continuación. Pero de todos modos, ¿por qué UFW no bloquea los puertos expuestos de Docker?
Gracias de antemano a todos los que puedan explicarme de qué se trata.
Respuesta1
Probablemente ufw
muestra solo la configuración de ufw y NO se muestran las reglas insertadas directamente en la configuración de su firewall (con iptables
u otra herramienta como Docker) sin pasar por ufw.
25/tcp closed smtp
¿Por qué está esto aquí?
Una razón frecuente es que muchos ISP (consumidores) y organizaciones bloquean el tráfico SMTP saliente.
81/tcp open hosts2-ns
¿Por qué se abre este puerto?
No solo está abierto el puerto 81, nmap dejó de escanear en el puerto 1024, sino que espero que cuando verifiques más a fondo el puerto 3307 también esté abierto.
La ventana acoplable lo abre ya que su ventana acoplable recibe instrucciones de publicar los puertos 81 y 3307 y asignarlos a sus instancias de la ventana acoplable...
$ docker-compose ps
Name Command State Ports
------------------------------------------------------------------------------------
app docker-php-entrypoint php-fpm Up 9000/tcp
database docker-entrypoint.sh mysqld Up 0.0.0.0:3307->3306/tcp, 33060/tcp
web nginx -g daemon off; Up 0.0.0.0:81->80/tcp
inspeccionar elconfiguración real del firewall activosin la interfaz ufw fácil de usar con, por ejemplo iptables-save
, o con iptables -L -v -n -t nat
(la mayoría de las cosas interesantes de Docker ocurren en las secciones NAT y enrutamiento) y tal veziptables -L -v -n
Las entradas relevantes serían algo como:
# Generated by iptables-save v1.6.0 on Thu Sep 13 13:50:12 2018
*nat
:PREROUTING ACCEPT [21796:1434198]
:INPUT ACCEPT [9101:666864]
:OUTPUT ACCEPT [20943:1960461]
:POSTROUTING ACCEPT [118496:7063513]
:DOCKER - [0:0]
-A PREROUTING -m addrtype --dst-type LOCAL -j DOCKER
-A OUTPUT ! -d 127.0.0.0/8 -m addrtype --dst-type LOCAL -j DOCKER
-A DOCKER -i docker0 -j RETURN
-A DOCKER ! -i docker0 -p tcp -m tcp --dport 3307 -j DNAT --to-destination 172.17.0.3:33060
-A DOCKER ! -i docker0 -p tcp -m tcp --dport 81 -j DNAT --to-destination 172.17.0.8:80
Lo que probablemente deba hacer, si no desea publicar los puertos 81 y 3307 en todo Internet, es cambiar la forma en que los publica en la ventana acoplable. https://docs.docker.com/config/containers/container-networking/