El filtrado de paquetes es un co­m­po­ne­n­te fu­n­da­me­n­tal dentro del concepto de seguridad de todo sistema in­fo­r­má­ti­co en red. El control y la gestión del tráfico de datos de entrada y salida (a menudo como parte del co­r­ta­fue­gos) 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 pro­po­r­cio­na­do por los módulos del paquete de software Netfilter. Sin embargo, se requiere un programa adicional para su co­n­fi­gu­ra­ción. Para el kernel de Linux 2.4 y 2.6 se utiliza el software libre iptables, de­sa­rro­lla­do también por el equipo de Netfilter.

iptables es utilizado por los ad­mi­ni­s­tra­do­res para co­n­fi­gu­rar y eliminar reglas, aunque estas se pierdan cada vez que el sistema se reinicia. He­rra­mie­n­tas como iptables-save e iptables-restore facilitan el al­ma­ce­na­mie­n­to y re­cu­pe­ra­ció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 pro­to­co­los existen va­ria­cio­nes 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 pre­se­n­ta­mos las funciones básicas y las opciones de esta apli­ca­ción de filtrado. En la última parte ex­pli­ca­re­mos la co­n­fi­gu­ra­ció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 in­s­ta­lar­la o ac­tua­li­zar­la a través del re­s­pe­c­ti­vo gestor de paquetes de tu di­s­tri­bu­ción. Para ello, basta con in­tro­du­cir el siguiente comando en tu terminal:

sudo apt-get install iptables

Existen varias in­te­r­fa­ces gráficas para iptables que facilitan el manejo y el fu­n­cio­na­mie­n­to del programa, como por ejemplo Webmin, y la gestión del programa a través de la línea de comandos es re­la­ti­va­me­n­te fácil y rápida.

iptables requiere pri­vi­le­gios avanzados del sistema y, por lo tanto, solo puede ser ejecutado como root o con los re­s­pe­c­ti­vos derechos ad­mi­ni­s­tra­ti­vos. 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 co­rre­s­po­n­de con un paquete de datos incluyen:

  • ACCEPT: el paquete será aceptado.
  • DROP: el paquete será de­s­ca­r­ta­do.
  • QUEUE: mueve el paquete a los procesos de usuario y requiere un in­te­r­me­dia­rio (queue handler) que reenvíe todos los paquetes a una apli­ca­ció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 co­n­fi­gu­ra­ción: ACCEPT).

Las cadenas estándar me­n­cio­na­das en la acción RETURN están es­pe­ci­fi­ca­das, 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 en­tre­ga­dos al sistema y la segunda procesa los paquetes de datos entrantes de­s­ti­na­dos a ser re­en­via­dos. 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 tra­du­c­ción de las di­re­c­cio­nes de red y una MANGLE para la ma­ni­pu­la­ción de paquetes. La man page ofrece una de­s­cri­p­ción detallada del fu­n­cio­na­mie­n­to del software de filtrado de paquetes, a la que puedes acceder en cualquier momento con el siguiente comando:

man iptables

Como al­te­r­na­ti­va puedes visitar netfilter.org, donde en­co­n­tra­rá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 di­fe­re­n­tes 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 pri­n­ci­pa­les opciones de co­n­fi­gu­ra­ción:

Comando iptables Ejemplo Ex­pli­ca­ció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 di­re­c­tri­ces de la cadena. En el ejemplo, el paquete es aceptado de forma au­to­má­ti­ca 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 se­le­c­cio­na­da. En el ejemplo, se agrega una regla a la cadena "test" para que descarte los paquetes pro­ve­nie­n­tes 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 se­le­c­cio­na­da.
-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 de­te­r­mi­na­da; 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 se­le­c­cio­na­da mediante la es­pe­ci­fi­ca­ción de la posición de la regla; en este ejemplo también es la posición 1.

Cómo co­n­tri­bu­ye iptables a la pro­te­c­ción del sistema con las reglas de filtrado

Ahora te mostramos las po­si­bi­li­da­des de iptables de la mano del ejemplo de co­n­fi­gu­ra­ción de un firewall ru­di­me­n­ta­rio. Dado que, de­pe­n­die­n­do de la di­s­tri­bu­ción, las tres cadenas estándar INPUT, OUTPUT y FORWARD cuentan con reglas ya definidas, el primer paso es eli­mi­nar­las:

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 ase­gu­rar­se de que los paquetes de datos van a ser blo­quea­dos en caso de que la im­ple­me­n­ta­ción de cua­l­quie­ra 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 co­n­ti­nua­ció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 co­ne­xio­nes 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 pe­r­te­ne­cen a una conexión existente (--state ES­TA­BLI­SHED) 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 di­s­po­ni­bles hasta que se apaga el equipo, la co­n­fi­gu­ra­ción se debe realizar uti­li­za­n­do iptables-save para guardar en el fichero .rules en el di­re­c­to­rio iptables. El comando destinado para ello, por ejemplo en Ubuntu, es:

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

Uti­li­za­n­do este comando:

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

podrás cargar el archivo ma­nua­l­me­n­te cada vez que inicies el sistema. De forma al­te­r­na­ti­va, puedes crear una secuencia de comandos para que la apli­ca­ción de filtrado de paquetes se ejecute au­to­má­ti­ca­me­n­te. Para obtener más in­fo­r­ma­ción acerca de los filtros de red y de iptables, te re­co­me­n­da­mos visitar el manual de iptables del servicio editorial para la do­cu­me­n­ta­ción libre de TLDP-ES/LuCAS para crear firewalls en Linux y mucho más.

Ir al menú principal