freenas-logoIntro

Todo comenzó con la necesidad de filtrar el puerto 111 en nuestros servidores.

En el caso de servidores Linux empleamos la opción de iptables. Sin embargo, los servidores basados en FreeBSD, como los FreeNAS, que son los que sirven los volúmenes NFS no tienen iptables. Como podríamos filtrar el puerto 111 para evitar que sirva para lanzar ataques de DDoS?

Entonces hicimos lo que todo administrador de sistemas debe de hacer: Googleamos y… voilá!, encontramos la opción de packet filtering (pf para los amigos) en un artículo (sigue el link si te interesa acceder a la fuente). Personalmente ya conocía packet filtering, pero eso de dejar los servidores sin acceso a internet por una configuración defectuosa no me apetecía demasiado.

Para los curiosos, dejo un enlace a la documentación de packet filtering web de OpenBSD en la sección de enlaces.

 

91a8c384094a60cFiltrando el puerto 111 en FreeNAS

Generar el archivo de configuración

Generar el archivo de configuración no es complicado. Lo complicado es hacer que éste se mantenga en FreeNAS tras un reboot. Podríamos guardarlo en uno de los volúmenes montados, pero en ese caso podría perderse al sustituir el volumen donde se encuentra. Decidimos guardarlo en el directorio /root. Sin embargo, todos sabemos que FreeNAS monta el sistema de archivos raiz (/) como readonly. Por eso, lo primero que hemos de hacer es montarlo para escritura. Para ello empleamos la instrucción:

# mount -uw /

Entonces con nano creamos el archivo pf.conf. En principio no nos interesa hacer un filtrado de todo el tráfico de red en FreeNAS, sencillamente queremos evitar que los malos puedan acceder al puerto 111 y emplearlo para lanzar ataques de DDoS. El archivo pf.conf sería el siguiente:

Una vez finalizado, volvemos a poner el sistema de archivos como solo lectura:

# mount -ur /

 

Evitar ataques bruteforce en el puerto ssh

En el artículo que tenemos en la sección enlaces dan una explicación más detallada. Aquí nos limitaremos a indicar la línea que hemos introducido en pf.conf para evitar los ataques por fuerza bruta al puerto ssh. La línea es:

# Avoid ssh bruteforce attacks
pass quick proto tcp from any to any port ssh flags S/SA keep state (max-src-conn 15, max-src-conn-rate 5/3, overload <bruteforce> flush global)

En esencia, añadimos a la tabla <bruteforce>, definida previamente en el archivo de configuración (overload <bruteforce>) la ip de cualquier equipo que acceda al puerto ssh con más de 15 conexiones simultáneas (max-src-conn 15) o trate de acceder al puerto más de 5 veces en 3 (max-src-conn-rate 5/3) segundos. Por último, desconecta (flush) al host que alcance los límites. El valor global indica que se tienen en cuenta conexiones referidas también a otras reglas.

 

Arrancar pf al inicio

En un sistema FreeBSD se activaría al inicio con las siguientes líneas en el archivo /etc/rc.conf:

pf_enable="YES"
pf_rules="/root/pf.conf"

Sin embargo, por lo que hemos dicho antes, el sistema restaura el archivo /etc/rc.conf en cada inicio. Para que se mantengan, hemos de recurrir a los ‘Tunables’ de FreeNAS. Añadiremos los siguientes:

Captura de pantalla 2016-02-29 a las 12.28.23

Tuneable para activar pf al inicio

 

Captura de pantalla 2016-02-29 a las 12.33.06

Tuneable para cargar el archivo de configuración de pf

 

Reiniciamos para comprobar que todo está correcto.

 

Visualizar contenido de la tabla bruteforce

Una vez tenemos el pf funcionando queremos comprobar que todo está correcto. La curiosidad nos corroe y queremos ver quien ha caido en nuestra trampa. Para listar el contenido de la tabla bruteforce deberemos emplear el siguiente comando:

# pfctl -t bruteforce -T show

 

Enlaces

OpenBSD. PF: Packet Filtering

Evitar ataques bruteforce