Iptables tcp flags filtering

Cuando se establece una comunicación cliente-servidor, el inicio de  ese proceso se conoce como three-way-handshake, o lo que es lo mismo, modo “3 apretones de manos”.

Esto quiere decir, por la propia descripción,  que el proceso del inicio de  la comunicación es:

Cliente: Manda un paquete tcp con el flag de syn contra la máquina que quiere conectar, en este caso el servidor que sirve la aplicación

Servidor: Recibe ese paquete syn y se lo hace saber al cliente mandándole a su vez otro paquete tcp con los flags de SYN+ACK

Cliente: El cliente ha de hacer saber al servidor de alguna manera, que el servidor se ha enterado de que el cliente quiere establecer comunicación  (o lo que es lo mismo, el cliente tiene que decir al servidor que ha recibido ese paquete tcp con los flags SYN y ACK), por lo que el cliente manda un paquete tcp con el flag ACK al servidor.

Como una imagen vale más que mil palabras:

3way-handshake

Una vez el cliente manda el ACK al servidor, el cliente comenzará a transmitir datos.

Existen distintos tipos de ataques a máquinas, por ejemplo, inundación SYN, un cliente manda un paquete SYN para iniciar una comunicación pero no espera a que el servidor le devuelva un SYN+ACK, sino que le vuelve a mandar paquetes SYN, hasta que degrada el servicio del servidor, o split handshake (saludo dividido) http://watchguardsecuritycenter.com/2011/04/15/what-is-the-tcp-split-handshake-attack-and-does-it-affect-me/, donde un cliente manda un SYN a un servidor y el cliente recibe un ACK de dos máquinas, una que no es el servidor, pero el cliente mandará peticiones al servidor.

Es por eso, que como iptables actúa a nivel de kernel, y es capaz de ver el campo flag de los paquetes tcp/ip, podemos forzar que a  nuestro servidor reciba flags sólo en un determinado orden, para evitar ese tipo de ataques (bien es cierto que para evitar flood SYN, también se puede configurar a nivel de pila tcp/ip del sistema).

Es posible a través de iptables filtrar aquellos flags tcp que no cumplen con este procedimiento de inicio de comunicación o que sean sospechosos de un posible ataque:

Así, podrían marcarse como BADFLAGS, las siguientes flags de paquetes tcp recibidos:

// TCP_FLAGS — check tcp flags
iptables -N TCP_FLAGS
iptables -A TCP_FLAGS -p tcp –tcp-flags ACK,FIN FIN -j BADFLAGS
iptables -A TCP_FLAGS -p tcp –tcp-flags ACK,PSH PSH -j BADFLAGS
iptables -A TCP_FLAGS -p tcp –tcp-flags ACK,URG URG -j BADFLAGS
iptables -A TCP_FLAGS -p tcp –tcp-flags FIN,RST FIN,RST -j BADFLAGS
iptables -A TCP_FLAGS -p tcp –tcp-flags SYN,FIN SYN,FIN -j BADFLAGS
iptables -A TCP_FLAGS -p tcp –tcp-flags SYN,RST SYN,RST -j BADFLAGS
iptables -A TCP_FLAGS -p tcp –tcp-flags ALL ALL -j BADFLAGS
iptables -A TCP_FLAGS -p tcp –tcp-flags ALL NONE -j BADFLAGS
iptables -A TCP_FLAGS -p tcp –tcp-flags ALL FIN,PSH,URG -j BADFLAGS
iptables -A TCP_FLAGS -p tcp –tcp-flags ALL SYN,FIN,PSH,URG -j BADFLAGS
iptables -A TCP_FLAGS -p tcp –tcp-flags ALL SYN,RST,ACK,FIN,URG -j BADFLAGS
#—- Descarta el primer paquete de una conversación si no tiene glag SYN
iptables -A TCPFLAGS -p tcp ! –syn -m state –state NEW -j BADFLAGS
#—- Ayuda a prevenir TCP spoofing
iptables -A TCPFLAGS -p tcp –tcp-flags SYN,ACK SYN,ACK -m state –state NEW -j REJECT –reject-with tcp-reset
#—- FIN, PSH o URG deberían siempre venir acompañados por ACK
iptables -A TCPFLAGS -p tcp –tcp-flags ACK,FIN FIN -j BADFLAGS
iptables -A TCPFLAGS -p tcp –tcp-flags ACK,PSH PSH -j BADFLAGS
iptables -A TCPFLAGS -p tcp –tcp-flags ACK,URG URG -j BADFLAGS
#—- FIN, SYN y RST son exclusivos mútuamente
iptables -A TCPFLAGS -p tcp –tcp-flags FIN,RST FIN,RST -j BADFLAGS
iptables -A TCPFLAGS -p tcp –tcp-flags SYN,FIN SYN,FIN -j BADFLAGS
iptables -A TCPFLAGS -p tcp –tcp-flags SYN,RST SYN,RST -j BADFLAGS
#—- Paquetes sin flags no son válidos
$IPTABLES -A TCPFLAGS -p tcp –tcp-flags ALL NONE -j BADFLAGS

En donde definimos la cadena BADFLAGS como:

iptables -N BADFLAGS
iptables -A BADFLAGS -j LOG –log-prefix “IPT BADFLAGS: ” =logopt
iptables -A BADFLAGS -j DROP

O también poner una regla que descarte todos los paquetes que sean nuevos que no vengan con el flag de SYN:
iptables -A INPUT -p tcp ! –syn -m state –state NEW -j DROP

En general, se pueden definir conjuntos o paquetes de reglas que se carguen en un script para proteger nuestros servicios con iptables.

He utilizado como referencias para esta protección de iptables, los siguientes blogs:
http://www.kriptopolis.org/iptables-1
http://pikt.org/pikt/samples/iptables_tcp_flags_programs.cfg.html
Iré publicando más paquetes de reglas a lo largo del tiempo.

Puede encontrarse más información de iptables en el siguiente enlace: http://www.netfilter.org/documentation/index.html

Anuncios

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s