Restringir l’ús del P2P amb iptables

Darrerament he hagut de buscar com restringir l’accés a les xarxes de ·P2P· des d’una xarxa local que surt a internet a través d’un router basat en Linux i IPtables.

Inicialment vaig provar el bloqueig dels ports que empren normalment les aplicacions P2P. Després de fer un seguiment mitjançant ntop, vaig veure clàrament que no era una opció vàlida, ja que sovint els clients P2P permeten canviar el nombre de port a emprar i són rangs de ports massa amplis.

Vaig tantejar muntar el router de forma restrictiva i no permisiva, bloquejant tots els ports alts (per sobre el 1024) i fent regles que permetessin l’ús de certs ports que emprem per a algunes aplicacions, però era una feinada important.

Finalment cercant, vaig trobar un mòdul per a les iptables, anomenat iptables-p2p, que és capaç d’identificar si una connexió és P2P examinant la capa d’aplicació del protocol. La instal·lació, sobre un Fedora Core 1, va ser força senzilla:

  1. Descarregar iptables-p2p
  2. Descarregar el codi font de iptables
  3. Descomprimir els dos paquets
  4. Copiar el contingut del directori include dels codis font de iptables a /usr/include
  5. Compilar iptables-p2p (make)
  6. Copiar el mòdul resultant iptables/libipt_p2p.so al directori dels mòduls de les iptables a /usr/lib/iptables
  7. Copiar el mòdul resultant kernel/ipt_p2p.o al directori dels mòduls de netfilter del kernel a /lib/modules/#versió_kernel#/kernel/net/ipv4/netfilter
  8. Carregar el mòdul del kernel (modprobe ipt_p2p.o)
  9. Executar: iptables -A FORWARD -m p2p --p2p all -j LOG --log-prefix="P2P:"

Un cop fet això i comprovat que es registraven totes les connexions P2P a l’arxiu de logs de sistema, vaig afegir les següents línies de codi a l’arxiu de regles de les iptables:

## Filtrat P2P
insmod ipt_p2p
iptables -A FORWARD -m p2p --p2p all -j LOG --log-prefix="P2P:"
iptables -A FORWARD -m p2p --p2p all -j DROP
## Final filtrat P2P

Des d’aquell moment la càrrega de xarxa va caure de manera espectacularment

Network Load