staging.inyokaproject.org

IPP2P

Archivierte Anleitung

Dieser Artikel wurde archiviert. Das bedeutet, dass er nicht mehr auf Richtigkeit überprüft oder anderweitig gepflegt wird. Der Inhalt wurde für keine aktuell unterstützte Ubuntu-Version getestet. Wenn du Gründe für eine Wiederherstellung siehst, melde dich bitte in der Diskussion zum Artikel. Bis dahin bleibt die Seite für weitere Änderungen gesperrt.


Anmerkung: Die Entwicklung des Programms wurde 2007 eingestellt.

Artikel für fortgeschrittene Anwender

Dieser Artikel erfordert mehr Erfahrung im Umgang mit Linux und ist daher nur für fortgeschrittene Benutzer gedacht.

IPP2P 🇬🇧 ist eine iptables-Erweiterung, mit der sich Peer2Peer-Traffic identifizieren lässt. Je nachdem, ob man Peer2Peer-Aktivitäten in seinem Netz erlauben möchte, kann man diese Verbindungen dann entweder blockieren oder Traffic Shaping einsetzen und diese Pakete mit einer niedrigeren Priorität ausstatten. Letzteres ist sinnvoll, damit andere Netzwerkdienste nicht ausgebremst werden.

Achtung!

Die ipp2p-Erweiterung wurde mit Korrekturen in das Projekt "xtables-addons" aufgenommen. Ein gleichnamiges Paket existiert seit 9.10 Karmic Koala in Ubuntu, so dass eine manuelle Kompilation nicht nötig wird.

Der nachfolgende Wikitext bezieht sich auf den seit 2007 nicht mehr gewartete Original-Quellcode von der ipp2p.org-Website.

Alte Beschreibung

Leider befinden sich die nötigen Module standardmäßig nicht in Ubuntu, so dass man selber kompilieren muss. Hinzu kommt, dass der Quellcode gepatcht (angepasst) werden muss, weil er sonst mit neueren Kerneln nicht funktioniert.

Achtung!

Leider kann IPP2P nicht alle Filesharing-Protokolle blockieren, Bittorrent wird z.B. nur in der unverschlüsselten Version erkannt, wie sie von aktuellen Clients – wie dem unter Ubuntu standardmäßig verwendeten Transmission – seit einiger Zeit nicht mehr verwendet wird.

Andere Protokolle wurden vom Autor dieses Artikels nicht getestet.

Installation

Grundvoraussetzungen

Als Voraussetzung muss man folgende Pakete installieren[1]:

  • build-essential

  • linux-headers-generic (u.U. statt "generic" die passende Architektur des eigenen Kernels wählen)

  • iptables-dev

Nun lädt man den neuesten IPP2P-Quellcode von der Homepage herunter ⮷ und entpackt[4] ihn - am besten ins eigene Homeverzeichnis. Danach kann man in einem Terminal[2] gleich in das entstandene Verzeichnis ipp2p-0.8.2 wechseln. (Die Versionsnummer könnte sich vielleicht irgendwann nochmal unterscheiden.)

Quellcode patchen

Als nächstes muss man den Patch für den Quellcode herunterladen ⮷ und speichert ihn am besten direkt im ippp2p-Verzeichnis. Der Patch wird dann wie folgt angewendet:

patch -p1 < ipp2p-0.8.2-kernel-2.6.22.patch 

Makefile anpassen

Im ipp2p-Verzeichnis befindet sich eine Datei namens Makefile, in der ein paar Anpassungen vorgenommen werden müssen[3].

  1. Die Deklaration der Variable IPTABLES_SRC (Zeile 32) muss wie folgt angepasst werden: IPTABLES_SRC = /usr/

  2. Im Abschnitt libipt_ipp2p.so: muss der Befehl ld durch $(CC) ersetzt werden (Zeile 67).

  3. Am Ende, aber vor der letzten endif-Zeile, muss folgender Codeblock eingefügt werden:

install: ipt_ipp2p.ko libipt_ipp2p.so
        install -m 644 libipt_ipp2p.so /lib/iptables/
        install -m 644 ipt_ipp2p.ko /lib/modules/$(shell uname -r)/kernel/net/netfilter/
        depmod -a

Achtung!

Die Einrückungen vor den install- und depmod-Befehlen müssen zwingend Tabulatorzeichen sein. Benutzt man stattdessen Leerzeichen, kommt es zu Fehlern.

Kompilieren

Nun kompiliert man die Module[5]:

make
sudo checkinstall 

Der zweite Befehl kopiert gleich die entstandenen Dateien ipt_ipp2p.ko und libipt_ipp2p.so an die richtigen Orte im Dateisystem. Außerdem entsteht gleichzeitig ein Deb-Paket, dass man auf anderen Systemen mit derselben Kernelversion unproblematisch installieren kann[6]. Insbesondere ist das nützlich, wenn man seinen Linux-Router nicht mit einer kompletten Compiler-Umgebung ausstatten möchte und deswegen auf einem anderen Rechner kompiliert.

Hinweis:

Der checkinstall-Befehl fragt noch ein paar Informationen über das zu erstellende Paket ab. Man sollte einen kurzen, aussagekräftigen Kommentar wählen, und wenn man später erneut kompilieren muss - z.B. weil man ein Kernel-Update machen musste - sollte man die "Release" um eins erhöhen. Ansonsten kann man einfach die Vorschläge akzeptieren.

Test

Wenn alles geklappt hat und es nicht zu Fehlern gekommen ist, müsste man das Modul jetzt laden können:

sudo modprobe ipt_ipp2p 

Evtl. muss man vorher noch einmal depmod -a durchführen. Das Modul müsste jetzt in der Ausgabe des Befehls lsmod auftauchen.

Dieser Befehl sollte jetzt ebenfalls keine Fehlermeldung erzeugen, sondern einen Hilfetext zum Modul:

sudo iptables -m ipp2p --help 

Peer2Peer blocken

Jetzt lassen sich durch einen einfachen Befehl alle P2P-Verbindungen blockieren:

sudo iptables -A FORWARD -m ipp2p --ipp2p -j REJECT 

Statt alles zu blockieren, kann man dies auch nur auf einzelne Protokolle beschränken, z.B. nur das Edonkey- und Kazaa-Netz:

sudo iptables -A FORWARD -m ipp2p --edk --kazaa -j REJECT 

Welche Protokolle IPP2P erkennen kann und welche Optionen es dafür gibt, erklärt der oben erwähnte Hilfetext. --ipp2p ist jedenfalls eine Abkürzung für alle nicht-experimentellen Protokoll-Optionen zusammen.

Peer2Peer priorisieren

Wer P2P-Dienste nicht komplett blockieren möchte, sondern nur auf eine niedrigere Priorität setzen, muss ein wenig mehr Aufwand treiben. Der Grund ist der, dass die IPP2P-Module nicht etwa jedes einzelne Paket einer P2P-Verbindung finden, sondern nur solche, in denen bestimmte Schlüsselsequenzen vorkommen. (z.B. eine Download-Anforderung.) Man nutzt deswegen die Erkennung einzelner Pakete, um daraufhin die ganze Verbindung als P2P zu kennzeichnen und dementsprechend behandeln zu können. (Im folgenden wird auf den Befehl sudo verzichtet, weil davon ausgegangen wird, dass man ein komplettes iptables-Skript schreibt, welches mit Superuser-Rechten ausgeführt wird.)

# Wenn die Verbindung schon eine Markierung trägt, übertrage diese Markierung auch auf das aktuelle Paket:
iptables -t mangle -A PREROUTING -p tcp -j CONNMARK --restore-mark
# Wenn das aktuelle Paket dadurch eine Markierung != 0 hat, ist man hier fertig
iptables -t mangle -A PREROUTING -p tcp -m mark ! --mark 0 -j ACCEPT
# Ansonsten teste auf P2P und markiere das Paket im Positivfall als "1"
iptables -t mangle -A PREROUTING -p tcp -m ipp2p --ipp2p -j MARK --set-mark 1
# Wenn das Paket als "1" markiert ist, übertrage diese Markierung auf die gesamte Verbindung
iptables -t mangle -A PREROUTING -p tcp -m mark --mark 1 -j CONNMARK --save-mark

So markierte Pakete kann man dann z.B. über das CLASSIFY-Target bestimmten Traffic-Klassen zuordnen oder anderweitig behandeln:

iptables -t mangle -A POSTROUTING -o eth0 -m mark --mark 1 -j CLASSIFY --set-class 1:12
iptables -t mangle -A POSTROUTING -o eth1 -m mark --mark 1 -j CLASSIFY --set-class 2:12

Das würde aber den Rahmen dieses Artikels sprengen. Es sei auf das Linux Advanced Routing & Traffic Control HOWTO 🇬🇧 verwiesen.

Diese Revision wurde am 28. Dezember 2011 21:44 von noisefloor erstellt.
Die folgenden Schlagworte wurden dem Artikel zugewiesen: Netzwerk, System