E.3 Uso de iptables

E.3.1 Mostrar la lista de reglas de una cadena

root# iptables --list  
Chain INPUT (policy ACCEPT)  
target     prot opt source               destination  
 
Chain FORWARD (policy ACCEPT)  
target     prot opt source               destination  
 
Chain OUTPUT (policy ACCEPT)  
target     prot opt source               destination  
 
root# iptables --verbose --list INPUT  
Chain INPUT (policy ACCEPT 115 packets, 15731 bytes)  
pkts bytes target     prot opt in     out     source               destination

E.3.2 Crear una nueva cadena

Aparte de las tres cadenas que existen por defecto (INPUT, OUTPUT y FORWARD), el usuario puede crear cadenas nuevas:

root# iptables --new new_chain

Así, cuando un paquete “acierta” con una regla de una cadena, la acción puede ser que pase a ser procesado por la nueva cadena. Esto se hace para reducir el número de reglas por cadena y que así sean más fáciles de manejar.

Si ninguna de las reglas de la nueva cadena procesa el paquete, el proceso de chequeo continúa por la siguiente regla que referenciaba a la nueva cadena.

E.3.3 Resetear las estadísticas de una cadena

Pone a cero los contadores de la cadena:

root# iptables --zero chain_name

E.3.4 Cambiar el comportamiento por defecto de una cadena

Por defecto las cadenas INPUT, OUTPUT y FORWARD están en modo ACCEPT, significando que dejan pasar los paquetes. Esto puede modificarse cambiando lo que define como “policy” de la cadena. Un ejemplo que evita que podamos transmitir ningún paquete:

root# iptables --policy OUTPUT DROP

Los posibles modos de una regla o de una cadena son:

ACCEPT:
Aceptar el paquete.
DROP:
Destruir el paquete.
REJECT:
Destruir el paquete pero enviando un paquete ICMP de puerto inalcanzable.
QUEUE:
Pasar al paquete al espacio de usuario. Se utiliza para procesar los paquetes que llegan por un determinado proceso, independientemente de que vayan o no dirigidos a él.
RETURN:
Retornar (sin chequear más reglas) a la canena que nos dió el control.

E.3.5 Vaciar una cadena

Para eliminar las reglas de una cadena, escribir:

root# iptables --flush chain_name

E.3.6 Borrar una cadena vacía

Podemos borrar una cadena vacía con:

root# iptables --delete-chain chain_name

E.3.7 Añadir una nueva regla a una cadena

En el siguiente ejemplo se filtra todo aquel paquete que vaya dirigido a la dirección IP 27.0.0.1:

root# ping -c 1 127.0.0.1  
PING 127.0.0.1 (127.0.0.1): 56 data bytes  
64 bytes from 127.0.0.1: icmp_seq=0 ttl=64 time=0.2 ms  
 
--- 127.0.0.1 ping statistics ---  
1 packets transmitted, 1 packets received, 0% packet loss  
round-trip min/avg/max = 0.2/0.2/0.2 ms  
 
root# iptables --append INPUT --source 127.0.0.1 --protocol icmp --jump DROP  
# ping -c 1 127.0.0.1  
PING 127.0.0.1 (127.0.0.1): 56 data bytes  
 
--- 127.0.0.1 ping statistics ---  
1 packets transmitted, 0 packets received, 100% packet loss  
 
root# iptables --verbose --list INPUT  
Chain INPUT (policy ACCEPT 169 packets, 21274 bytes)  
pkts bytes target     prot opt in     out     source                destination  
1    84    DROP       icmp --  any    any     localhost.localdomain anywhere

E.3.8 Borrar una regla de una cadena

Borraremos la regla que acabamos de crear con:

root# iptables --delete INPUT 1

O también con:

root# iptables --delete INPUT --source 127.0.0.1 --protocol icmp --jump DROP

Nótese que los argumentos son idénticos a los que utilizamos para crear la regla.

E.3.9 Añadiendo reglas más complejas

Algunos de los parámetros con los que podemos jugar son (véase [12] y [1] para más información):

Las direcciones IP de origen y destino:
Por ejemplo, podemos especificar sólo los paquetes que van dirigidos a la red local puedan salir del host:
root# iptables --append OUTPUT --destination ! 192.168.213.0/24 --jump DROP

El protocolo utilizado:
Ejemplo, sólo el tráfico Web de entrada está permitido:
# Nótese el flag --syn que ‘‘matches’’ sólo los paquetes TCP  
# de establecimiento de conexión  
root# iptables --append INPUT --protocol tcp --syn --dport ! http --jump REJECT

El puerto utilizado:
Sólo aquellos paquetes que vayan al puerto 22 (SSH) serán aceptados:
root# iptables --append INPUT --protocol tcp --syn --dport ! 22 --jump ACCEPT

El interface de red usado:
Esto es útil cuando estamos creando un router o un NAT. Ejemplo, aceptar todo lo que venga de eth0:
root# iptables --append INPUT --in-interface eth0 --jump ACCEPT

E.3.10 Salvando y restaurando las cadenas

Existen dos comandos para hacer esto: iptables-save y iptables-restore. Ambas leen y escriben la entrada y salida estándares. Ejemplos:

root# iptables-save > iptables.txt  
 
root# iptables-restore < iptables.txt

Taller E.1:
Configure iptables para aceptar sólo el tráfico Web.