Anterior                                                                      Índice

8. IPTABLES: Herramienta para el filtrado de paquetes

Se trata de la herramienta de última generación sobre filtros de paquetes en Linux, flexible y potente.  Para su uso es necesario disponer de un kernel 2.3.15 o superior.

En Linux, el filtrado de paquetes está construido en el kernel y para poder utilizarlo se ha de compilar el núcleo configurando las siguientes opciones:

CONFIG_PACKET: Permite aplicaciones y programas que necesitan trabajar directamente en ciertas máquinas de red. Un ejemplo sería tcpdump o snort.

CONFIG_NETFILTER: Para usar el computador como un firewall o pasarela a Internet. Totalmente necesario para el objetivo de este apartado.

CONFIG_IP_NF_IPTABLES: Para realizar cualquier clase de filtrado, masquerading o NAT. Es necesario para poder utilizar IPTables.

Por otra parte, hay que añadir los drivers aporpiados para las interfaces trabajen adecuadamente, es decir, Ethernet, PP y SLIP. En el caso de que se quieran emplear las opciones más avanzadas de IPTables, es necesario una configuración apropiada en el kernel. Seguidamente se muestran las opciones disponibles en el kernel 2.4.9 para este propósito:
CONFIG_IP_NF_CONNTRACK: Para usar NAT y Masquerading.

CONFIG_IP_NF_MATCH_LIMIT: Añade la posibilidad de controlar cuantos paquetes por minuto se supone que son afectados con una cierta regla.

CONFIG_IP_NF_MATCH_MAC:  Permite examinar paquetes basados en direcciones MAC. Todos los adaptadores Ethernet tienen su propia dirección MAC.

CONFIG_IP_NF_MATCH_MARK: Para filtrar paquetes basándose en el target MARK.

CONFIG_IP_NF_MATCH_MULTIPORT: Para filtrar paquetes con un amplio rango de puertos destino y puertos fuente.

CONFIG_IP_NF_MATCH_TOS: Para filtrar paquetes basándose en el campo TOS (Type Of Service).

CONFIG_IP_NF_MATCH_TCPMSS: Para filtrar paquetes TCP SYN basándose en el campo MSS.

CONFIG_IP_NF_MATCH_STATE: Contará como ESTABLECIDO cuando se haya dado el tráfico en las dos direcciones en una conexión TCP, por ejemplo.

CONFIG_IP_NF_MATCH_UNCLEAN: Para filtrar paquetes TCP, UDP o ICMP que parezcan extraños o incorrectos.

CONFIG_IP_NF_MATCH_OWNER: Para permitir que únicamente el usuario root pueda tener acceso a Internet.

CONFIG_IP_NF_FILTER: Añade la tabla básica de filtrado en la que se encuentran las chains INPUT; OUTPUT Y FORWARD.

CONFIG_IP_NF_TARGET_REJECT: Para permitir enviar un mensaje de error ICMP para los paquetes que son rechazados.

CONFIG_IP_NF_TARGET_MIRROR: Para devolver los paquetes de entrada rechazados al emisor de los mismos.

CONFIG_IP_NF_NAT: Para permitir la traducción de direcciones de red (NAT).

CONFIG_IP_NF_TARGET_MASQUERADE: Para añadir la target masquerade.

CONFIG_IP_NF_COMPAT_IPCHAINS:Para añadir la compatibilidad con IPChains.

CONFIG_IP_NF_COMPAT_IPFWADM: Para añadir la compatibilidad con IPWadm.

Con la herramienta IPTables se puede insertar y borrar reglas desde la tabla de filtrado de paquetes del kernel. Como se trata de información dinámica, es recomendable crear un script que se ejecute cada vez que se arranque el sistema, que defina las reglas establecidas.

Existen tres listas de reglas de filtrado (firewall chains o chains) predefinidas:

    - Chain de entrada (INPUT)
    - Chain de salida (OUTPUT)
    - Chain de reenvío (FORWARD)

Dichas listas de reglas se interpretan del modo siguiente:
 

Llega un paquete
"Ruteo" o "Enrutamiento": el kernel mira el destino de dicho paquete
Destino = el propio equipo Destino = otro interfaz de red
El paquete pasa 
a la chain INPUT
No se tiene activado el reenvío  Se tiene activado 
el reenvío
El paquete se acepta El paquete no se acepta El paquete no se acepta El paquete pasa 
a la chain FORWARD
El proceso esperando el paquete lo recibe. El paquete
no se acepta
El paquete 
se acepta

Un programa decide enviar paquetes

Los paquetes pasan
a la chain OUTPUT
Los paquetes se aceptan RED
Los paquetes no
se aceptan
Tabla 8.1: Interpretación de las chains.

Las listas de reglas se basan en la cabecera de los paquetes para determinar la acción a llevar a cabo (lo que en ipchains se denomina "objetivo" o target). Si una regla no se puede aplicar a un determinado paquete, entonces se examina la siguiente regla y así sucesivamente hasta encontrar una regla que se le pueda aplicar y que determine si se acepta o se rechaza dicho paquete.

Si en una lista no existe ninguna regla que se pueda aplicar al paquete en cuestión, entonces el kernel examina la política de seguridad para averiguar que acción se toma en ese caso (acción por defecto). Normalmente, en un sistema con una buena política de seguridad,  se ignora el paquete (DROP) en lugar de aceptarlo (ACCEPT).
Cabe señalar que únicamente las chains predefinidas (INPUT, OUTPUT,  FORWARD) disponen de política (ACCEPT o DROP). Si un paquete no cumple ninguna de las reglas de una chain definida, entonces regresa a la chain anterior.
 

Especificación de una regla

Para añadir una regla a una lista de reglas existente se emplea el siguiente comando:
$iptables -A nombre_chain   [ -s | --source | --src | -s ! ] direccion
[ -d | --destination |--dst ] direccion
[ -i | --in-interface ] interfaz_entrada
[ -o | --out-interface ] interfaz_salida
[ -p | -p ! ] protocolo
-j [ accept | drop ]


El interrogante tras un parámetro se refiere a todos los casos excepto el indicado en la especificación de la regla.
Las direcciones de origen o de destino se pueden especificar de diferentes maneras:

    - nombre completo:
                'moon.act.uji.es'
    - dirección IP específica:
                '150.128.82.211'
    - direcciones IP desde 150.128.82.0 a 150.128.82.255:
                '150.128.82.0/24'
    - cualquier dirección:
                '0/0'

La especificación del protocolo puede realizarse mediante:
    - un número : valor número del protocolo para IP
    - un nombre : TCP, UDP, ICMP.
 

Comando y ejemplo Significado
-A, --append
$iptables -A INPUT ...
Añade una regla al final de la chain indicada.
-D, --delete
$iptables -D INPUT ...
Borra una regla de la chain indicada.
-R, --replace
$iptables -R INPUT 1 ...
Reemplaza una regla de una chain determinada, cuyo número se indica, por la que se especifica seguidamente.
-I, --insert
$iptables -I INPUT 1 ...
Añade una regla a una chain determinada con el  número indicado.
-F, --flush
$iptables -F INPUT
Vacia la chain indicada o bien todas las chains si no se especifica ninguna.
-L, --list
$iptables -L INPUT 
Lista las entradas de una chain determinada o bien todas las chains en ausencia de la especificación de una chain determinada.
-N, --new-chain
$iptables -N nueva
Indica al kernel la creación de una nueva chain con el nombre especificado.
-Z, --zero
$iptables -Z INPUT 
Identifica todos los contadores de una determinada chain o de todas si no se especifica ninguna.
-X, --delete-chain
$iptables -X nueva
Borra la chain indicada, que no debe tener ninguna regla.
-P, --policy
$iptables -P INPUT DROP
Indica al kernel que establezca una política por defecto en una chain determinada.
-E, --rename-chain
$iptables -E nueva kiss
Canvia el nombre a una chain creada por el propio usuario.
Tabla 8.2: Comandos básicos para el manejo de chains.

En una regla también se puede especificar una interfaz, es decir, el dispositivo físico por el que entran o salen los paquetes. Para las listas de reglas predefinidas se pueden especificar lógicamente:

    - para la chain INPUT: interfaz de entrada
    - para la chain OUTPUT: interfaz de salida
    - para la chain FORWARD: interfaz de entrada e interfaz de salida

Para indicar todos los interfaces que empiecen por una cadena se emplea: "-i cadena+". Por otra parte, para indicar todos los interfaces excepto el especificado se utiliza: "-i ! interfaz". El uso del interrogante para indicar todos las posibilidades de un parámetro excepto el indicado se puede dar en todas las opciones de especificado de una regla.
 

Comando y ejemplo Significado
-p, --protocol
$iptables -A OUTPUT -p ICMP ...
Indica un protocolo determinado para los paquetes que se desean filtrar. Ejemplos: TCP, UDP e ICMP.
-s, --src --source
$iptables -A OUTPUT -s 150.128.40.100 ...
Indica un filtrado basado en la direccion fuente de los paquetes (dirección IP).
-d, --dst --destination
$iptables -A OUTPUT -d 150.128.40.100 ...
Indica un filtrado basado en la direccion destino de los paquetes (dirección IP).
-in, --in-interface
$iptables -A INPUT -i eht0
El filtrado se basa en la interfaz de donde proviene el paquete.
-out, --out-interface
$iptables -A FORWARD -o eht0
El filtrado se basa en la interfaz a donde se dirigen los paquetes.
Tabla 8.3: Parámetros para especificar las reglas de filtrado.


Comando y ejemplos Significado
-sport, --source-prot
$iptables -A INPUT -p TCP --sport 22
$iptables -A INPUT -p UDP --sport 53
Indica el puerto fuente.
-sport, --source-prot
$iptables -A INPUT -p TCP --sport 22
$iptables -A INPUT -p UDP --sport 53
Indica el puerto destino.
Tabla 8.4: Parámetros adicionales para el protocolo TCP y UDP.

Ejemplo:

Si se hace un ping a anubis.uji.es se está enviando tantos paquetes ICMP del tipo 8 (petición de eco) como se indique con el parámetro "-c" y se recibirán los paquetes ICMP del tipo 0 (respuesta del eco) como se observa en la figura 8.2..
 
$ping -c 5 anubis.uji.es
PING anubis.uji.es (150.128.40.100): 56 data bytes
 64 bytes from 150.128.40.100: icmp_seq=0 ttl=253 time=1.1 ms
 64 bytes from 150.128.40.100: icmp_seq=1 ttl=253 time=1.0 ms
 64 bytes from 150.128.40.100: icmp_seq=2 ttl=253 time=1.4 ms
 64 bytes from 150.128.40.100: icmp_seq=3 ttl=253 time=1.0 ms
 64 bytes from 150.128.40.100: icmp_seq=4 ttl=253 time=1.0 ms

 --- anubis.uji.es ping statistics ---
 5 packets transmitted, 5 packets received, 0% packet loss
 round-trip min/avg/max = 1.0/1.1/1.4 ms

Ejemplo 8.1.1
Si se añade la siguiente regla a la chain INPUT:
$iptables -A INPUT -s 150.128.40.100 -p icmp -j DROP
entonces los paquetes que provienen de anubis serán ignorados. El efecto se puede ver en la figura 8.3 al repetir de nuevo la misma operación.
$ping -c 5 anubis.uji.es
PING anubis.uji.es (150.128.40.100): 56 data bytes

 --- anubis.uji.es ping statistics ---
 5 packets transmitted, 0 packets received, 100% packet loss

Ejemplo 8.1.2

En ocasiones los paquetes se fragmentan a la hora de ser enviados de forma que las cabeceras que consultan las reglas de filtrado únicamente aparecen en el primer paquete. Por ello, existe un parámetro que permite especificar reglas para el segundo y siguientes fragmentos:

                    -f | --fragment

Ejemplo:

Si se quieren ignorar todos los fragmentos que se envien a anubis se emplearía la orden:
$ipchains -A output -f -d anubis.uji.es -j DROP

Eliminar una regla de una lista

Para añadir una regla a una chain existente, conociendo el número de dicha regla, se emplea el siguiente comando:
$iptables -D nombre_lista número_regla
En el caso en que se desconozca el número de la regla, basta con sustituir -A por -D en la orden de especificación de la regla a borrar:
$iptables -D nombre_lista -s direccion -p protocolo -j accion
Ejemplo:
Supongamos que se desea eliminar la regla anteriormente definida. Si se trata de la única regla que hemos definido en la chain INPUT, bastará con la orden:
$iptables -D INPUT 1
Si por el contrario desconocemos el número de la regla estonces ejecutamos:
$iptables -D INPUT -s 150.128.40.100 -p icmp -j DROP

Manejo de nuevas listas de reglas

A parte de las chains predefinidas, el usuario puede crear sus propias listas de reglas con la orden:
$iptables [-N | --new-chain ] nombre_chain
Si en un momento dado, el usuario decide borrar una lista de reglas que haya creado anteriormente, en primer lugar ha de vaciar la lista con el siguiente comando:
$iptables [-F | --flush ] nombre_chain
Una vez vacía, la chain se elimina a través de la orden:
$iptables [-X | --delete-chain ] nombre_chain
Para ver el contenido de una lista de reglas existe el siguiente comando:
$iptables-L nombre_chain


Ejemplo:

Se establecen polícas por defecto de denegar:
$ iptables -P INPUT DROP
$ iptables -P OUTPUT DROP
$ iptables -P FORWARD DROP
Se deniega la entrada de todos lo paquetes ICMP:
$ iptables -A INPUT -p ICMP -j DROP

$ iptables -L
Chain input (policy DROP):
Chain forward (policy DROP):
Chain output (policy DROP):
target     prot opt     source           destination       ports
DROP       icmp ------  anywhere         anywhere          any ->   any


Hay que tener en cuenta que el usuario nunca podrá borrar ninguna de las chains predefinidas (INPUT, OUTPUT, FORWARD), aunque por le contrario si será posible vaciarlas.

Especificaciones de destino

A parte de las acciones pre-compiladas (DROP y ACCEPT) a llevar a cabo en una regla, el usuario puede definir chains que se especifiquen como acción. Las chains definidas por el usuario pueden a su vez "saltar" a otras chains definidas por él mismo (la regla de una chain tiene como acción otra chain).

Ejemplo:

Supongamos que la chain INPUT está formada por las reglas especificadas en la tabla xx y el usuario ha definido una nueva lista de reglas llamada own_test como se puede ver en la tabla xx:

Chain INPUT

Rule1: -p TCP -j own_test
Rule2: -p UDP -j DROP
Tabla 8.4.

Chain own_test

Rule1: -s 192.168.1.1 -j DROP
Tabla 8.5.
 
Analicemos el caso en el que llega un paquete TCP de la dirección IP 192.168.1.1. El paquete pasa a la chain INPUT y se examina la primera regla; como la cumple se lleva a cabo la acción especificada, que es 'saltar' a la chain own_test. El paquete cumple la única regla de dicha lista, por lo que se produce la acción indicada, es decir, se ignora. Ya no sería necesario seguir comprobando las reglas de la chain INPUT.

Anterior                                                                      Índice