El objetivo de esta entrada es recopilar funciones así como definiciones básicas sobre IPTables, más concretamente de la tabla filter. Si hay algo mal explicado, confuso, que está mal, o que no está, os animo a que me aviséis para poder mejorarlo. Por otra parte, esta entrada no busca ser algo ultra profesional, ni tener mil ejemplos (solo los justos para su entendimiento), ni definiciones complicadas y detalladas.

INDICE
1.-Definición IPTables
2.-Estructura de las reglas
3.-Algunas notas teóricas sobre cómo funciona IPTables
4.-Tabla FILTER
    4.1.-El parámetro Match (-m)
    4.2.-El protocolo TCP
    4.3.-Ejemplos
5.-Comandos
6.-Parámetros

1.-Definición IPTables

IPTables, framework localizado en el núcleo de Linux, permite el tratamiento de paquetes de red. De esta forma, podemos administrar todos los paquetes que pasan por nuestra máquina, y realizar con ellos lo que creamos conveniente, funcionando así como cortafuegos.

2.-Estructura de las reglas

  • FILTER: Filtrado de paquetes
    • INPUT
    • OUTPUT
    • FORWARD
  • NAT
  • MANGLE

3.-Algunas notas teóricas sobre cómo funciona IPTables

  1. IPTables usa por defecto la regla FILTER (filtrado). Si queremos indicarle que use otra, se lo indicaremos con -t mangle/nat.
  2. Las reglas se añaden en una lista y se miran de arriba a abajo. Cuando un paquete coincide con una regla, se realiza lo que pone en dicha regla. ¿Qué quiere decir esto? Imaginemos que tenemos dos reglas en el siguiente orden: “NO acepto paquetes de la IP X.X.X.X” y “Acepto paquetes de la IP X.X.X.X que vayan por este puerto”. De esta manera, cuando se reciba cualquier paquete, se desechará ya que coincide con la primera regla, independientemente de todo lo demás. Sin embargo, si hubiesemos puesto las reglas en el orden inverso, aceptariamos solamente paquetes de esa IP que vaya por ese puerto, y el resto se desechan. Por esto, es muy importante el orden en el que se escriben las reglas.

4.-Tabla FILTER

Esta tabla nos permite filtrar paquetes, y tratarlos.
Dentro de esta tabla, tenemos 3 cadenas:

  • INPUT: Afecta a los paquetes que van dirigidos hacia el propio equipo.
  • OUTPUT: Afeta a los paquetes que van dirigidos desde el propio equipo. Generados localmente que salen al exterior.
  • FORWARD: Los paquetes que usan nuestro equipo para ir a otros. No van destinados a nuestro equipo, lo usa para reenviar paquetes a un objetivo concreto.

4.1.-El parámetro Match (-m)

El parámetro match nos permite seleccionar unos paquetes determinados, dependiendo de lo que queramos seleccionar concretamente. Nos proporciona más flexibilidad a la hora de filtrar.

4.1.1.-Match time
Nos permite seleccionar paquetes teniendo en cuenta el tiempo. Esto nos permite filtrar paquetes dependiendo de la hora y día del dispositivo en donde se estén añadiendo las reglas de IPTables.
El siguiente ejemplo bloquea todo el tráfico de lunes a viernes por la noche.
iptables -A OUTPUT -s 0/0 -m time –timestart 00:00 –timestop 08:00 –weekdays Mon,Tue,Wed,Thu,Fri -j DROP

4.1.2.-Match state
Nos permite seleccionar paquetes dependiendo del estado de estos. Hay 4 tipos:

  • INVALID: el paquete no ha podido ser identificado por alguna razón. Se conoce como inválido, por tanto no habría problemas en dropearlo.
  • ESTABILSHED: el paquete está asociado a una conexión en la que se envían paquetes en ambos sentidos y que está corriendo.
  • NEW: el paquete que inicia una nueva conexión o que está asociado con una conexión que no envía paquetes en ambas direcciones.
  • RELATED: el paquete empieza una nueva conexión, pero está asociado a una conexión ya existente, como una trasnferencia de datos FTP o un error ICMP. Nos permite trackear la transferencia.

Ejemplo:
iptables -A INPUT -m state –state INVALID -j DROP

4.1.3.-Match mac
Nos permite seleccionar paquetes en función de la dirección MAC. Podriamos filtrar los paquetes que vengan de una MAC determinada de la siguiente manera:
iptables -A INPUT -m mac –mac-source XX:XX:XX:XX:XX:XX -j DROP

4.1.3.-Match multiport (opción de -p tcp)
Nos permite seleccionar varios puertos, ya sean de destino u origen. Se usa –dports y –sports.
iptables -A INPUT -p tcp –match multiport —dports 80,443,100:1500 -j ACCEPT

4.2.-El protocolo TCP

Para hacer referencia a este protocolo, tendremos que especificarlo mediante -p tcp.
–dport: puerto de destino. Se pueden poner en rangos o uno a uno. Ejemplo:
iptables -A INPUT -p tcp –dport 2000:2500 -j DROP
iptables -A INPUT -p tcp –dport 80 -j DROP

–sport: puerto de origen. Lo mismo que dport.

Nota: Para poner múltiples puertos, hay que hacerlo con match multiport (ver 4.1.4)

–tcp-flags: nos permite indicar los FLAGS que queremos que estén activos. La primera cadena es la de los flags que queremos examinar, y la segunda, es la de los flags que queremos que estén activos.

Ejemplo: queremos que esté activo el flag SYN y no-activo el de PSH:
iptables -A OUTPUT -p tcp –tcp-flags SYN,PSH SYN -j DROP
Queremos que esté activo el de SYN y el de PSH:
iptables -A OUTPUT -p tcp –tcp-flags ALL SYN,PSH -j DROP

4.3.-Ejemplos

4.3.1.-Filtrar los paquetes que provengan de una dirección MAC determinada
iptables -A INPUT -m mac –mac-source XX:XX:XX:XX:XX:XX -j DROP

4.3.2.-Permitir que sólamente una determinada MAC pueda comunicarse
iptables -A INPUT -m mac –mac-source XX:XX:XX:XX:XX:XX -j ACCEPT
iptables -A INPUT -j DROP

o

iptables -P INPUT DROP # Establecemos una politica de dropeo en los inputs
iptables -A INPUT -m mac –mac-source XX:XX:XX:XX:XX:XX -j ACCEPT

4.3.3.-Eliminar reglas determinadas
iptables -L -n –line-numbers # Listamos las reglas (numerándolas)
iptables -D INPUT 2 # Seleccionamos la que queramos eliminar y su tabla (la 2 de la INPUT).

4.3.4.-Bloquear puertos concretos
iptables -A OUTPUT -p tcp –dport 80 -j DROP

4.3.5.-Filtrar paquetes de una red entera
iptables -A INPUT -s 192.168.2.0/24 -j DROP

4.3.6.-Prohibir el tráfico a una web
iptables -A OUTPUT -d IP.IP.IP.IP -j DROP
o
iptables -A OUTPUT -s IP.IP.IP.IP -j DROP

4.3.7.-Prohibir el tráfico a una web en un determinado rango de horas y determinados dias.
iptables -A OUTPUT -d IP.IP.IP.IP -m time –timestart 11:00 –timestop 12:00 –weekdays Mon,Tue,Wed,Thu,Fri -j DROP

4.3.8.-Listar las cadenas de una tabla (-t filter/nat/mangle) (sin opciones)
iptables -L

4.3.9.-Listar las cadenas de una tabla con opciones: para que salgan las reglas numeradas y para que salgan las estadísticas de transferencia de datos
iptables -nvx –line-numbers -L

4.3.10.-Resetear el contador a cero (de los paquetes y bytes)
iptables -Z

5.-Comandos

-A (–append): agrega una nueva regla al final de la cadena seleccionada.
Recordar que hay tres tablas (filter, nat y mangle) y en cada una, hay cadenas. Las reglas, van encadenadas en cada cadena.
-I (–insert): inserta encima del número de la regla de la cadena, una nueva regla (ver ejemplo más abajo).
-D (–delete): elimina una regla de la cadena seleccionada
-L (–list): lista todas las reglas
-F (–flush): borra o limpia las reglas
-Z (–zero) contadores de bytes de todas las cadenas a cero)
-N (–new-chain): crea una nueva cadena
-X (–delete-chain): elimina la cadena especificada
-P (–policy): configura una política a la cadena y target dado
-h (–help): da una descripción de la sintaxis del comando

Ejemplo de -I
Como dije anteriormente, hay tablas (filter, nat, mangle), y en cada tabla hay cadenas (input, output, …), y cada cadena tiene reglas que vamos insertando, y cada regla tiene un número, ya que el orden es altamente importante. Si ponemos primero una regla que dice “dropear todos los paquetes del input” y luego decimos “aceptar los paquetes que pasan por una IP”, siempre se va a ejecutar lo primero y no habrá transmisión. Es por esto que el orden es importante.
Con -A (–append) las reglas las vamos poniendo una detrás de otra. Con -I (–insert) podemos especificar la posición de la regla en la cadena de la siguiente forma. Ejemplo: imaginemos que al principio tenemos 3 reglas
A)
B)
C)

Si hacemos un: -I OUTPUT 2 -j DROP esta regla se situará encima de la segunda.

A)
-I OUTPUT…
B)
C)

6.-Parámetros

-p (–protocol): protocolo del paquete a chequear (tcp, udp, icmp, all). El argumento ! es la selección inversa
-s (–source): dirección de origen específica o un rango usando la máscara o prefijo. Argumento !
-d (–destination): dirección destino
-j (–jump) especifica el target de la regla. Qué hacer con el paquete que coincida con la regla (aceptar, rechazar) (ACCEPT, DROP (tirar), REJECT (inalcanzable, paquete ICMP de error))
-i (–in-interface): nombre de la interfaz por donde el paquete fue recibido (solo para cadenas INPUT, FORWARD y PREROUTING). Argumento !.
-O (–out-interface): nombre de la interfaz por donde el paquete se envía o sale (solo para cadenas OUTPUT, FORWARD, y POSTROUTING). Argumento !.
-f (–fragment): la regla se refiere al segundo y siguientes fragmentos o paquetes fragmentados.
-t (–table): especifica la tabla a usar.
-m (–match)