Filtro de camino inverso con rp_filter

Para evitar ataques del tipo DoS Linux dispone de varias opciones, rp_filter es capaz de descartar posibles paquetes maliciosos antes de que puedan afectar al sistema.

La principal función de un router es enviar paquetes de un lugar a otro. Los servidores de Linux pueden ser usados como router en una red soportando gran cantidad de tráfico sin sufrir ninguna incidencia, pero debido a la gran cantidad de tráfico malicioso que circula por internet es necesario tomar medidas para limitar este tipo de tráfico.

Está gran cantidad de trafico malicioso podría afectar al servidor generando un ataque de denegación de servicio DoS y comprometer la seguridad del servidor.

Cuando una máquina Linux tiene el filtrado de ruta inverso habilitado recibe un paquete, la máquina primero verificará si la fuente del paquete recibido es accesible a través de la interfaz por la que vino, realizando alguna de las siguientes acciones:

  • Si el destino que manda el paquete es accesible por el interfaz que ha llegado, entonces el servidor acepta el paquete.
  • Si el destino que manda el paquete no es accesible por el interfaz que ha llegado el paquete es rechazado.

En las últimas las últimas versiones de RedHat existe una opción más, si el destino que manda el paquete es accesible por cualquier interfaz del servidor, se acepta el paquete.

Podemos comprobar el estado de esta opción por una parte comprobando su valor en /proc/sys/net/ipv4/conf/default/rp_filter  y por otra con el siguiente comando: 

# sysctl -ar '\.rp_filter'

Los valores posibles son:

  • 0 – No realiza la validación del origen y cualquier paquete es enviado al destino.
  • 1 – Sigue la norma RFC3704 en Strict mode. Se realiza la validación del origen por la misma interfaz de llegada. En caso de fallo el paquete se rechaza.
  • 2 – Sigue la norma RFC3704 en Loose mode. Se realiza la validación del origen por cualquier interfaz de llegada. En caso de fallo el paquete se rechaza.

Para establecer el valor de forma permanente modificaríamos los valores del fichero /etc/sysctl.conf, en algunos casos este fichero no existe pero se puede crear un archivo de configuración dentro de la carpeta /etc/sysctl.d

Puede ser que nos interese tener un log de los paquetes rechazados para ello podemos habilitar la opción o variable log_martians (net.ipv4.conf.all.log_martians) en el fichero /etc/sysctl.conf . Cuando se habilita esta opción se creará un log de los paquetes rechazados en el fichero /var/log/messages