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.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_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.
CONFIG_IP_NF_CONNTRACK: Para usar NAT y Masquerading.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.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.
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 |
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.
$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. |
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. |
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. |
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 msEjemplo 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 DROPentonces 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 ---
|
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
$iptables -D nombre_lista número_reglaEn 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 accionEjemplo:
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 1Si por el contrario desconocemos el número de la regla estonces ejecutamos:$iptables -D INPUT -s 150.128.40.100 -p icmp -j DROP
$iptables [-N | --new-chain ] nombre_chainSi 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_chainUna vez vacía, la chain se elimina a través de la orden:
$iptables [-X | --delete-chain ] nombre_chainPara 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 DROPSe deniega la entrada de todos lo paquetes ICMP:
$ iptables -P OUTPUT DROP
$ iptables -P FORWARD DROP$ 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.
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 |
Chain own_test
Rule1: -s 192.168.1.1 -j DROP |
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.