Intro

Confiar en que Linux mantiene los puertos accesibles solamente a quien tiene la llave correspondiente es una suposición que se me va desmontando con el tiempo. Hasta ahora para mi todo era el puerto 22 o el 80, quizás el 443. A estos puertos o tenías el acceso abierto (para acceder al servidor web mediante http o https) o tenías la llave para entrar (mediante contraseña o foreign key en el caso de ssh). Sin embargo, ya he recibido dos avisos de problemas de DDoS (denegación de servicio) que pueden tener a tu máquina como origen, de manera que pueden estar atacando por DDoS a un servidor externo empleando tu máquina como arma y todo ello mientras tu vives en la más absoluta tranquilidad.

El caso es que se hacía necesario el empleo de alguna forma de volver las cosas a su sitio y que los malos no tuvieran acceso a nuestras cosas para atacar a nadie. Al final no me queda más remedio que ponerme con los firewalls. Con lo que yo les he dado de lado!!!

Lo más sencillo (al menos eso creo) es emplear iptables, de modo que nos pondremos a configurar este servicio en máquinas CentOS y debian

 

iptables

No, lo siento, no voy a hacer un tutorial sobre iptables. No tengo yo el día para eso. Lo que si que haré será poner una serie de enlaces donde viene muy explicado y bueno, Google para todo lo demás.

El caso es que parece que iptables está instalado por defecto en toda distribución de Linux que se precie, aunque por lo que he podido ver, cada distro tiene sus peculiaridades a la hora de guardar los archivos de configuración y esas cosas.

 

Comandos básicos:

  • Vaciar la tabla de reglas:
    # iptables -F
  • Ver la tabla de reglas:
    # iptables --list
  • Guardar la tabla de reglas a un archivo:
    # iptables-save > /directorio/nombre_de_archivo
  • Cargar la tabla de reglas desde un archivo:
    # iptables-restore < /directorio/nombre_de_archivo

 

Alguna ayuda

Bueno, algo de ayuda no viene mal de cuando en cuando.

CentOS 7

No viene iptables instalado por defecto, así que habría que instalarlo con:

# yum install iptables-services

Si al tratar de cargar las reglas con iptables-restore nos sale un error como:

iptables-restore: line 1 failed

El motivo es que no hemos comenzado el archivo con la línea

*filter

y lo hemos acabado con la línea

COMMIT

 

 

Filtrando el puerto 111

Como el último aviso que recibimos se refería al puerto 111, lo tomaremos como ejemplo. En este puerto escucha rpcbind, que tiene mucho que ver con NFS, que es lo que empleamos los usuarios de Linux para compartir un directorio en un servidor remoto. Personalmente me gusta mucho este sistema, porque permite montar los directorios del servidor de backup en la máquina local y hacer las copias de seguridad directamente en aquel.

Puesto que los malos emplean este puerto para hacer ataques de DDoS (hay por ahí una explicación de lo más completa sobre como se amplifican los paquetes enviados a la máquina que sirve de arma y esas cosas), se trata de filtrar este puerto para que no esté accesible desde fuera de nuestra red interna o de los servidores remotos que nosotros queremos dejar pasar.

Se pueden incluir reglas en caliente en un iptables en marcha, pero lo más adecuado es guardarlas en un archivo de texto, que se edita más fácilmente, y luego cargarlas.

Para guardar las reglas empleamos el comando iptables-save > /directorio/archivo-de-reglas (Saving Iptables Firewall Rules Permanently). Dependiendo de la distribución deberemos usar un archivo de reglas u otro.

  • Debian/Ubuntu:
    /etc/iptables/rules.v4
  • RedHat/CentOS:
    /etc/sysconfig/iptables

Las reglas que emplearemos en este caso son las siguientes:
# iptables -A INPUT -i eth0 -p tcp -s 172.16.0.0/16 --dport 111 -m state --state NEW,ESTABLISHED -j ACCEPT
# iptables -A INPUT -i eth0 -p udp -s 172.16.0.0/16 --dport 111 -m state --state NEW,ESTABLISHED -j ACCEPT
# iptables -I INPUT -p udp --dport 111 -j DROP
# iptables -I INPUT -p tcp --dport 111 -j DROP

 

Hay que tener especial cuidado en el orden de las reglas y poner las que permiten el acceso ANTES que las que lo impiden.

Ejecutando al inicio

Una vez configuradas las reglas y a salvo en un archivo, es iprescindible que se carguen al inicio del sistema. En este caso el comportamiento de Debian y de CentOS difiere. Veamos ambos casos.

CentOS

En CentOS iptables es un servicio en toda regla, y como tal se puede gestionar mediante systemctl.

Para activarlo (hacer que se cargue al inicio):

# systemctl enable iptables

Para arrancarlo (si no se ha cargado al inicio):

# systemctl start iptables

Archivo de configuración:

/etc/sysconfig/iptables

 

Debian

En Debian iptables no es un servicio, así que para arrancarlo tendremos que usar el comando iptables-restore al inicio del sistema. Podemos conseguir la ejecución de este comando al inicio del sistema de dos modos:

Crontab

Incluiremos la siguiente línea en el crontab de root:
@reboot /home/crones/carga_iptables.sh

/etc/rc.local

Incluiremos la siguiente línea en el archivo /etc/rc.local:

sh /home/crones/carga_iptables.sh

 

En el archivo carga_iptables.sh pondremos lo siguiente:

#!/bin/sh

/sbin/iptables-restore < /etc/iptables/rules.v4

 

Enlaces

Página de iptables en el wiki de debian en castellano