18.7.07

How To: Filtar el tráfico P2P mediante un firewall Linux con iptables

Puede que no sea una cuestión que nos quite el sueño el filtrar tráfico P2P, pero cuando en una red empresarial, el personal se anima a descargarse la película del momento, el último disco de Shakira y algún que otro vídeo para añadir a la pornoteca, te dices que si, que ha llegado el momento.
Ya hemos visto en anteriores posts que filtrar las conexiones a sistemas de chat como el IRC o el MSN es realmente fácil utilizando sencillas reglas de iptables, pero con el P2P no pinta tan fácil, por la forma en que P2P funciona:

Para evitar que un equipo de la red interna pueda ser accesible desde el exterior utilizamos un firewall que nos cierre los puertos y que, al mismo tiempo, permita a los equipos de la LAN acceder libremente a Internet.
Pero el P2P es realmente puñetero ya ha sido programado para saltarse esta limitación. Al abrir un cliente P2P en la LAN se establece una conexión con el exterior que el firewall considera confiable y a partir de este momento los paquetes que vengan de vuelta están marcados como ESTABLISHED,RELATED, con lo que pasan directamente al cliente LAN, saltándose todo tipo de filtro. Otros clientes más avanzados envían los datos directamente en UDP, cuyos datagramas no almacenan tanta información como TCP y marcan los paquetes como RELATED en origen, con lo que el firewall tampoco se entera y deja pasar los datos como perico por su casa.

Se me ocurren varias soluciones:

1) Marcar los paquetes que considero P2P y eliminarlos, pero esto tendrá un coste de CPU que no se si estoy dispuesto a asumir.
2) Instalar un proxy y hacer pasar las peticiones web,ftp y correo a través del mismo pero... ¿y si alguien utiliza VoIP por ejemplo?
3) Utilizar la librería ipp2p para iptables que provee de métodos de detección de paquetes según protocolos P2P, con lo que podemos hacer filtros más exactos.

Así que, optamos por utilizar ipp2p. Los pasos para instalarlo son los siguientes:

1) Instalar los paquetes necesarios (obviamos la instalación de los compiladores):

coruscant:~# apt-get install iptables-dev kernel-headers-`uname-r`

2) Descargarse los fuentes de la versión de iptables que tenemos y descomprimirlos:

coruscant:~# iptables --version
iptables v1.3.6
coruscant:/usr/src# wget http://www.netfilter.org/projects/iptables/files/iptables-1.3.6.tar.bz2
coruscant:/usr/src# bunzip iptables-1.3.6.tar.bz2; tar xf iptables-1.3.6.tar


3) Descargarse la última versión de ipp2p de la web http://www.ipp2p.org/downloads_en.html a día de hoy y descomprimirlos:

coruscant:/usr/src# wget http://www.ipp2p.org/downloads/ipp2p-0.8.1_rc1.tar.gz ; tar zxvf ipp2p-0.8.1_rc1.tar.gz

4) Entrar en el directorio del ipp2p y editar el Makefile para que apunte a los fuentes del iptables que nos hemos descargado:

coruscant:/usr/src/ipp2p-0.8.1_rc1# vi Makefile

y cambiamos la variable a nuestro valor:

IPTABLES_SRC = /usr/src/iptables-1.3.6

5) Compilamos la librería

coruscant:/usr/src/ipp2p-0.8.1_rc1# make

6) Copiamos los módulos compilados y los cargamos

coruscant:/usr/src/ipp2p-0.8.1_rc1# cp ibipt_ipp2p.so /lib/modules/iptables
coruscant:/usr/src/ipp2p-0.8.1_rc1# cp ipt_ipp2p.ko /lib/modules/`uname -r`/kernel/net/ipv4
coruscant:/usr/src/ipp2p-0.8.1_rc1# depmod -ae
coruscant:/usr/src/ipp2p-0.8.1_rc1# modprobe ipt_ipp2p


7) Añadir a nuestro script iptables las líneas necesarias para que comience a filtrar, por ejemplo:

# Adiós edonkey, emule y demás amigos
iptables -I FORWARD -p tcp -m ipp2p --edk -j DROP
# Adiós bittorrent y amigos
iptables -I FORWARD -p tcp -m ipp2p --bit -j DROP
# Adiños kazza & CO
iptables -I FORWARD -p tcp -m ipp2p --kazaa -j DROP
...
...


Por último recomiendaría hacerse con un buen palo para cuando los usuarios se pongan tontines por haberles cortado las descargas.

1 comentario:

Carlos Peña dijo...

Hola, que tal. Estoy probando con IPcop para ver si sustituyo el router que tengo con tomato, el único problema es que no he logrado compilar el kernel, o mejor dicho, encuentro información muy confusa Crees que puedas ayduarme?. Saludos