iptables: cómo configurar las tablas de filtrado del núcleo de Linux

El filtrado de paquetes es un componente fundamental dentro del concepto de seguridad de todo sistema informático en red. El control y la gestión del tráfico de datos de entrada y salida (a menudo como parte del cortafuegos) se aseguran de que solo se reciban y envíen paquetes que estén libres de malware y spam. Por defecto, el núcleo de Linux incluye un filtro de paquetes de este tipo, que es proporcionado por los módulos del paquete de software Netfilter. Sin embargo, se requiere un programa adicional para su configuración. Para el kernel de Linux 2.4 y 2.6 se utiliza el software libre iptables, desarrollado también por el equipo de Netfilter.

iptables es utilizado por los administradores para configurar y eliminar reglas, aunque estas se pierdan cada vez que el sistema se reinicia. Herramientas como iptables-save e iptables-restore facilitan el almacenamiento y recuperación de las reglas aplicadas, mientras que el init-script (un script de inicio) se encarga de hacerlo durante el proceso de arranque. iptables está limitado al protocolo IPv4 y para los demás protocolos existen variaciones como ip6tables para PIv6 o ebtables para los paquetes de Ethernet, que también están incluidos en el módulo del núcleo.

En el siguiente tutorial de iptables presentamos las funciones básicas y las opciones de esta aplicación de filtrado. En la última parte explicaremos la configuración de las tablas de filtrado con varios ejemplos.

Así funciona iptables

Por lo general, iptables viene instalado por defecto en Linux. Si este no es el caso, o si quieres comprobar si tienes la última versión del software, puedes instalarla o actualizarla a través del respectivo gestor de paquetes de tu distribución. Para ello, basta con introducir el siguiente comando en tu terminal:

sudo apt-get install iptables

Existen varias interfaces gráficas para iptables que facilitan el manejo y el funcionamiento del programa, como por ejemplo Webmin, y la gestión del programa a través de la línea de comandos es relativamente fácil y rápida.

iptables requiere privilegios avanzados del sistema y, por lo tanto, solo puede ser ejecutado como root o con los respectivos derechos administrativos. Las tablas (tables) creadas en el kernel y cargadas por el programa contienen cadenas (chains) de reglas (rules), que definen cómo deben ser tratados los paquetes de datos entrantes y salientes. Los paquetes enviados pasan por una cadena de regla en regla, donde cada regla provoca una acción (jump target) o genera un cambio (goto chain) a otra cadena.

Las acciones que se producen cuando una regla se corresponde con un paquete de datos incluyen:

  • ACCEPT: el paquete será aceptado.
  • DROP: el paquete será descartado.
  • QUEUE: mueve el paquete a los procesos de usuario y requiere un intermediario (queue handler) que reenvíe todos los paquetes a una aplicación.
  • RETURN: el paquete se envía de nuevo a la cadena anterior en caso de que esta haya sido definida por el usuario. Las cadenas estándar se guían por la directriz (policy) de la cadena (por defecto y sin necesidad de configuración: ACCEPT).

Las cadenas estándar mencionadas en la acción RETURN están especificadas, por defecto, en las tablas de filtrado de iptables. Estas cadenas son: INPUT, FORWARD y OUTPUT. La primera se encarga de paquetes que deben ser entregados al sistema y la segunda procesa los paquetes de datos entrantes destinados a ser reenviados. La cadena OUTPUT es la cadena de salida que controla el tráfico generado a partir del propio equipo. Además de la tabla de filtros existe una tabla NAT para la traducción de las direcciones de red y una MANGLE para la manipulación de paquetes. La man page ofrece una descripción detallada del funcionamiento del software de filtrado de paquetes, a la que puedes acceder en cualquier momento con el siguiente comando:

man iptables

Como alternativa puedes visitar netfilter.org, donde encontrarás numerosos manuales de iptables en varios idiomas.

Crea y gestiona tus propias reglas de filtrado

En este punto de nuestro tutorial de iptables nos ocupamos de la tabla de filtros y de su lógica de reglas. La siguiente tabla reúne diferentes comandos para crear y gestionar cadenas. Para regular el tráfico puedes crear tu propia cadena o utilizar las tres cadenas estándar (INPUT, OUTPUT y FORWARD). Estas son las principales opciones de configuración:

Comando iptables Ejemplo Explicación
-N "Nombre de la cadena" sudo iptables -N test Crea una nueva cadena con el nombre "test".
-X "Nombre de la cadena" sudo iptables -X test Elimina la cadena vacía con el nombre "test"; no funciona con las cadenas INPUT, OUTPUT y FORWARD.
-L "Nombre de la cadena" sudo iptables -L test Muestra la lista de las reglas de la cadena con nombre "test".
-F "Nombre de la cadena" sudo iptables -F test Elimina todas las reglas de la cadena con nombre "test".
-P "Nombre de la cadena" "Acción" sudo iptables -P INPUT ACCEPT Establece las directrices de la cadena. En el ejemplo, el paquete es aceptado de forma automática cuando no se aplican las reglas de filtrado de la cadena INPUT.
-A "Nombre de la cadena" "Regla" sudo iptables -A test -s 127.0.0.1 -j DROP Añade una nueva regla a la cadena seleccionada. En el ejemplo, se agrega una regla a la cadena "test" para que descarte los paquetes provenientes de la dirección IP 127.0.0.1.
-D "Nombre de la cadena" "Regla" sudo iptables -D test -s 127.0.0.1 -j DROP Elimina la regla de la cadena seleccionada.
-I "Nombre de la cadena" "Position" "Regla" sudo iptables -I test 1 -s 127.0.0.1 -j DROP Añade une nueva regla a la cadena en la posición determinada; en el ejemplo es la posición 1.
-D "Nombre de la cadena" "Posición" sudo iptables -D test 1 Elimina la regla de la cadena seleccionada mediante la especificación de la posición de la regla; en este ejemplo también es la posición 1.

Cómo contribuye iptables a la protección del sistema con las reglas de filtrado

Ahora te mostramos las posibilidades de iptables de la mano del ejemplo de configuración de un firewall rudimentario. Dado que, dependiendo de la distribución, las tres cadenas estándar INPUT, OUTPUT y FORWARD cuentan con reglas ya definidas, el primer paso es eliminarlas:

sudo iptables -F

El segundo paso consiste en añadir la regla para descartar (DROP) a cada una de las tres cadenas, con el fin de asegurarse de que los paquetes de datos van a ser bloqueados en caso de que la implementación de cualquiera de las reglas de filtrado no arroje un resultado positivo:

sudo iptables -P INPUT DROP
sudo iptables -P OUTPUT DROP
sudo iptables -P FORWARD DROP

A continuación, expande las cadenas INPUT y OUTPUT con la regla (-A) para habilitar el sistema (ACCEPT), es decir, el localhost (lo), para el tráfico entrante (-i) y saliente (-o):

sudo iptables -A INPUT -i lo -j ACCEPT
sudo iptables -A OUTPUT -o lo -j ACCEPT

Habilita las conexiones HTTP y HTTPS salientes (puerto 80 y puerto 443) para los puertos de acceso 1024 a 65535:

sudo iptables -A OUTPUT -o eth0 -p tcp --dport 80 --sport 1024:65535 -j ACCEPT
sudo iptables -A OUTPUT -o eth0 -p tcp --dport 443 --sport 1024:65535 -j ACCEPT

El último paso consiste en permitir la entrada y salida de todos los paquetes de datos que pertenecen a una conexión existente (--state ESTABLISHED) o que se refieren a una conexión ya existente (--state RELATED):

sudo iptables -A INPUT -i eth0 -m state -state RELATED,ESTABLISHED -j ACCEPT
sudo iptables -A OUTPUT -o eth0 -m state -state RELATED,ESTABLISHED -j ACCEPT

Debido a que las reglas creadas con iptables son volátiles y solo están disponibles hasta que se apaga el equipo, la configuración se debe realizar utilizando iptables-save para guardar en el fichero .rules en el directorio iptables. El comando destinado para ello, por ejemplo en Ubuntu, es:

sudo iptables-save > /etc/iptables/iptables.rules

Utilizando este comando:

sudo iptables-restore < /etc/iptables/iptables.rules

podrás cargar el archivo manualmente cada vez que inicies el sistema. De forma alternativa, puedes crear una secuencia de comandos para que la aplicación de filtrado de paquetes se ejecute automáticamente.

Para obtener más información acerca de los filtros de red y de iptables, te recomendamos visitar el manual de iptables del servicio editorial para la documentación libre de TLDP-ES/LuCAS para crear firewalls en Linux y mucho más.