[[Vorlage(archiviert,"Die Entwicklung des Programms wurde 2007 eingestellt.")]] [[Vorlage(Fortgeschritten)]] {{{#!vorlage Wissen [:Pakete_installieren: Installation von Programmen] [:Terminal: Ein Terminal öffnen] [:Editor: Einen Editor öffnen] [:Packprogramme: Archive entpacken] [:Programme_kompilieren: Pakete aus dem Quellcode erstellen] [:Paketinstallation_DEB: Ein einzelnes Paket installieren] [:Kernelmodule: Umgang mit Kernelmodulen (Treibern)] [:iptables: iptables - die Linux-Firewall] }}} [[Inhaltsverzeichnis(2)]] [http://ipp2p.org/ IPP2P] {en} 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. {{{#!vorlage Warnung Die ipp2p-Erweiterung wurde mit Korrekturen in das Projekt "xtables-addons" aufgenommen. Ein gleichnamiges Paket existiert seit [:Karmic: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. {{{#!vorlage Warnung 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 [http://ipp2p.org/downloads_en.html herunter] {dl} 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 [http://sources.gentoo.org/viewcvs.py/*checkout*/gentoo-x86/net-firewall/ipp2p/files/ipp2p-0.8.2-kernel-2.6.22.patch herunterladen] {dl} und speichert ihn am besten direkt im ippp2p-Verzeichnis. Der Patch wird dann wie folgt angewendet: {{{#!vorlage Befehl 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/`` 1. Im Abschnitt ``libipt_ipp2p.so:`` muss der Befehl ``ld`` durch ``$(CC)`` ersetzt werden (Zeile 67). 1. 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 }}} {{{#!vorlage Warnung 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]: {{{#!vorlage Befehl 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. {{{#!vorlage 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: {{{#!vorlage Befehl 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: {{{#!vorlage Befehl sudo iptables -m ipp2p --help }}} = Peer2Peer blocken = Jetzt lassen sich durch einen einfachen Befehl alle P2P-Verbindungen blockieren: {{{#!vorlage Befehl 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: {{{#!vorlage Befehl 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 [http://lartc.org Linux Advanced Routing & Traffic Control HOWTO] {en} verwiesen. = Links = * [http://ipp2p.org/ IPP2P-Homepage] {en} * [http://sources.gentoo.org/viewcvs.py/*checkout*/gentoo-x86/net-firewall/ipp2p/files/ipp2p-0.8.2-kernel-2.6.22.patch Patch für neuere Kernels - Quelle: Gentoo-Projekt] {dl} * [http://lartc.org Linux Advanced Routing & Traffic Control HOWTO] {en} * [http://netfilter.org/documentation/index.html netfilter/iptables Dokumentation] {de} {en} {fr} {es} {fr} {it} {nl} {pl} * [http://forums.fedoraforum.org/showthread.php?t=180325 Lösung für Problem mit neueren Kernels (Fedoraforum)] {en} # tag: Netzwerk, System