¿Cómo proteger correctamente el VPS mediante el firewall UFW?

¿Cómo proteger correctamente el VPS mediante el firewall UFW?

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 iptablesu 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/

información relacionada