IPP2P: Filesharing Firewall
Gelegentlich muss Filesharing aus dem eigenen Netz unterbunden werden, das ist jedoch nicht so einfach, wie sich das anhört. Viele Netzwerkprotokolle wie BitTorrent und eDonkey sind nicht einfach zu filtern, da sie sich nicht auf bestimmte Ports beschränken. Es ist dann vonnöten, intelligent Pakete nach P2P-Inhalten abzusuchen und intelligent zu filtern.
IPP2P
Hier kommt IPP2P ins Spiel. Das ist ein Modul für iptables, das selbständig Muster erkennt, anhand dem sich ganz einfach Filesharing-Regeln erzeugen lassen. Diese werden dann, wie gewohnt, in netfilter gefiltert und weiter behandelt. Einmal installiert ist es damit ganz einfach möglich, verdächtige Pakete zu blockieren:
iptables -i eth0 -A FORWARD -m ipp2p --ipp2p -j LOG --log-level=6 --log-prefix "ipp2p: " iptables -i eth0 -A FORWARD -m ipp2p --ipp2p -j DROP iptables -i eth0 -A FORWARD -p udp -m ipp2p --bit -j DROP iptables -i eth0 -A FORWARD -p tcp -m ipp2p --edk -j DROP
Das tut zum Beispiel genau dies und blockiert die Protokolle eDonkey und BitTorrent, die vom Interface eth0 her geroutet werden sollen. Jedes gematchte Paket wird im Übrigen protokolliert, sodass auch festgestellt werden kann, wer unerlaubterweise diesen Traffic erzeugt:
Aug 7 15:21:58 pinky kernel: [38956.872072] ipp2p: IN=eth0 OUT=eth2 SRC=192.168.2.10 DST=<extip> LEN=120 TOS=0x00 PREC=0x00 TTL=63 ID=33001 DF PROTO=TCP SPT=35964 DPT=10485 WINDOW=92 RES=0x00 ACK PSH URGP=0 Aug 7 15:22:00 pinky kernel: [38958.919184] ipp2p: IN=eth0 OUT=eth2 SRC=192.168.2.10 DST=</extip><extip> LEN=120 TOS=0x00 PREC=0x00 TTL=63 ID=4609 DF PROTO=TCP SPT=39685 DPT=23659 WINDOW=92 RES=0x00 ACK PSH URGP=0 </extip>
Soweit der einfache Teil. Komplizierter ist es, IPP2P zu installieren.
Installation
IPP2P ist eine Erweiterung für Netfilter, die nicht standardmäßig im Paket integriert ist. Das heißt, es muss selbständig installiert werden. Durch ABI-Änderungen ist das zuletzt 2006 aktualisierte IPP2P nicht mit neueren Versionen von iptables und dem Kernel kompatibel. Änderungen in iptables 1.4.3 und Kernel 2.6.22 (und folgende) machen es unmöglich, sowohl die Bibliothek, als auch das Modul ohne Änderungen zu betreiben. Wer versucht, IPP2P auf neueren Kernel-Versionen zu kompilieren erhält:
pinky:~/ipp2p-0.8.2$ make Makefile:36: You need to install iptables sources and maybe set IPTABLES_SRC make -C /lib/modules/2.6.26-2-686/build SUBDIRS=/root/ipp2p-0.8.2 modules make[1]: Entering directory `/usr/src/linux-headers-2.6.26-2-686' CC [M] /root/ipp2p-0.8.2/ipt_ipp2p.o /root/ipp2p-0.8.2/ipt_ipp2p.c: In function 'match': /root/ipp2p-0.8.2/ipt_ipp2p.c:751: error: 'const struct sk_buff' has no member named 'nh' /root/ipp2p-0.8.2/ipt_ipp2p.c: At top level: /root/ipp2p-0.8.2/ipt_ipp2p.c:871: warning: initialization from incompatible pointer type /root/ipp2p-0.8.2/ipt_ipp2p.c:874: warning: initialization from incompatible pointer type /root/ipp2p-0.8.2/ipt_ipp2p.c: In function 'init': /root/ipp2p-0.8.2/ipt_ipp2p.c:883: error: implicit declaration of function 'ipt_register_match' /root/ipp2p-0.8.2/ipt_ipp2p.c: In function 'fini': /root/ipp2p-0.8.2/ipt_ipp2p.c:888: error: implicit declaration of function 'ipt_unregister_match' make[2]: *** [/root/ipp2p-0.8.2/ipt_ipp2p.o] Error 1
Problem daran sind größere Umbauarbeiten an der Kernel-ABI. Zum Glück sind die Änderungen nicht all zu umfangreich, sodass es möglich ist, IPP2P zu modifizieren, damit es auf modernen Kernels lauffähig bleibt. Ich habe daher einen Patch erstellt (siehe unten), mit dem IPP2P auch heute noch eingesetzt werden kann. Ganz einfach ist die Installation trotzdem nicht. Benötigt werden Kernel-Quellen oder Header des eingesetzten Kernels und die Header des iptables-Paketes. Damit kann sowohl das iptables-Modul, als auch die Entsprechung für den Kernel übersetzt werden. Je nach eingesetzter Distribution muss das Makefile unter Umständen angepasst werden, um xtables.h bzw. iptables.h zu lokalisieren. Der Patch modifiziert das bereits dahingehend, dass dieses zumindest für Debian-Distributionen problemlos aufgefunden wird.
Folgende Anleitung gilt für Debian Lenny. Man beachte, dass dies aufgrund eines Bugs in Debian Lenny, das iptables Paket aus Debian sid voraussetzt.
apt-get install linux-headers-2.6-686 wget http://ftp.de.debian.org/debian/pool/main/i/iptables/iptables-dev_1.4.4-2_i386.deb wget http://ftp.de.debian.org/debian/pool/main/i/iptables/iptables_1.4.4-2_i386.deb dpkg -i iptables_1.4.4-2_i386.deb iptables-dev_1.4.4-2_i386.deb tar zxfv ipp2p-0.8.2+2.6.22.tar.gz cd ipp2p-0.8.2-patch make cp ipt_ipp2p.ko /lib/modules/`uname -r`/kernel/net/ipv4/ cp libipt_ipp2p.so /lib/xtables/ depmod -a modprobe ipt_ipp2p
Das sollte in dmesg anzeigen:
[42653.727837] IPP2P v0.8.2+2.6.22-patch loading
Von da an, ist IPP2P einsatzbereit.
Download
ipp2p-0.8.2+2.6.22.tar.gz (18.4 KiB, 393 Downloads)
Download
ipp2p-0.8.2+2.6.22.patch (19.4 KiB, 353 Downloads)
Loading...
hallo
bekomme beim laden des moduls folgenden fehler:
FATAL: Error inserting ipt_ipp2p (/lib/modules/2.6.32-trunk-amd64/kernel/net/ipv4/ipt_ipp2p.ko): Invalid module format
was ist da los?
greetz
Sven Niemann, B.Sc. - 1. Juni 2010 um 08:14
Problem behoben mit Kernel 2.6.26-2-amd64
nun folgendes problem
iptables -A FORWARD -m ipp2p –edk –bit -j DROP
gibt aus
iptables: Protocol wrong type for socket.
Sven Niemann, B.Sc. - 1. Juni 2010 um 09:07
Du hast vermutlich das Modul mit einem iptables Header gebaut, der nicht zu deinem Kernel und installierter Version passt. Der Text ist nicht ganz frisch, eventuell solltest du mir nur in Teilen folgen und insbesondere nicht Pakete aus Debian Sid installieren, die ich referenziere, schon gar nicht in Ubuntu.
Arno - 1. Juni 2010 um 22:21
Verwende doch einfach xtables-addons, da ist es drin, _und_ es compiliert fuer neuere Versionen.
hideaki - 7. Juni 2010 um 10:21