Uncomplicated Firewall para protejer nuestro server

Linux trae una gran herramienta para prevenir accesos no deseados: iptables. El problema con iptables es que no es tan sencilla de configurar (alguna vez me dejé sin acceso a mi propio server, jeje).

Por suerte existe uncomplicated firewall, o simplemente UFW, para que asegurar nuestro servidor sea realmente sencillo. Vamos al paso a paso:

Instalación

UFW está en los repos de casi todas las distros, como siempre en este blog voy con la instalación para Ubuntu, adecuen para su server.

Por lo general ya viene instalado en Ubuntu, pueden chequear haciendo ufw status y deberían obtener algo asi:

# ufw status
Status: inactive

En caso de no estar instalado, simplemente se instala con apt:

apt install ufw

Concluido este paso, vamos a configurarlo.

Configuración

Lo que usualmente queremos para un server es que pueda acceder a cualquier lugar de la red, pero que nadie pueda acceder a él, excepto por los puertos que nosotros digamos. Por esto, el primer paso es setear los default para incoming y outgoing:

ufw default deny incoming
ufw default allow outgoing

A nuestro server nos conectamos por SSH, por lo que deberíamos habilitar el puerto 22 (Atentos a este punto si cambiaron el puerto!) y también el puerto 80 y 443 (http y https, respectivamente). UFW tiene alias para estas 3 configuraciones:

ufw allow ssh
ufw allow http
ufw allow https

Y listo, podemos ejecutar ufw show added que nos debería devolver algo asi:

# ufw show added
Added user rules (see 'ufw status' for running firewall):
ufw allow 22
ufw allow 80
ufw allow 443

Una vez estamos seguros, simplemente ejecutamos ufw enable y nuestro server pasa a estar activado, lo cual vamos a validar con un ufw status verbose:

# ufw status verbose
Status: active
Logging: on (low)
Default: deny (incoming), allow (outgoing), disabled (routed)
New profiles: skip

To                         Action      From
--                         ------      ----
22                         ALLOW IN    Anywhere                  
80                         ALLOW IN    Anywhere                  
443                        ALLOW IN    Anywhere                  
22 (v6)                    ALLOW IN    Anywhere (v6)             
80 (v6)                    ALLOW IN    Anywhere (v6)             
443 (v6)                   ALLOW IN    Anywhere (v6)             

Configuración avanzada

A veces necesitamos que solo alguna IP se pueda conectar (ejemplo un server de DB solo recibiendo conexiones del server web), para esto deberíamos hacer algo asi:

ufw allow from 15.15.15.51

O si queremos que esa IP solo se conecte a un puerto especifico: 

ufw allow from 15.15.15.51 to any port 22

Para denegar acceso a una IP:

ufw deny from 15.15.15.51

Eliminar Reglas

Eliminar reglas es muy sencillo, debemos primero ejecutar ufw status numbered que nos devuelve algo asi:

# ufw status numbered
Status: active

     To                         Action      From
     --                         ------      ----
[ 1] 22                         ALLOW IN    Anywhere                  
[ 2] 80                         ALLOW IN    Anywhere                  
[ 3] 443                        ALLOW IN    Anywhere                  
[ 4] 22 (v6)                    ALLOW IN    Anywhere (v6)             
[ 5] 80 (v6)                    ALLOW IN    Anywhere (v6)             
[ 6] 443 (v6)                   ALLOW IN    Anywhere (v6)

Y luego eliminar la regla con el numero asignado. Ejemplo si no vamos a aceptar más conexiones en el puerto 80 hacemos ufw delete 2