ÜbersichtHomepage des Chemnitzer Linux-Tags 2004offizielle Netzwerkbeschreibung

Filesharing vermeiden

Das Rechenzentrum der TU-Chemnitz stellte uns für den Chemnitzer Linux-Tag einen 100 MBit/s-Uplinks zum Backbone des Rechenzentrums zur Verfügung.

Das Rechenzentrum selbst war zum Zeitpunkt der Veranstaltung mit 622 MBit/s an das Internet angebunden. Also mehr als genug Bandbreite. Um dem Chaos Computer Club keine Konkurrenz darin zu machen, bei jeder Veranstaltung jeweils der größte "Filesharing-Knoten" der Welt zu sein, wollten wir uns im Vorfeld einige Gedanken machen, um Filesharing-Protokolle zu blockieren.

Da inzwischen diverse Filesharing-Netze existieren und wir keine Zeit hatten, jedes einzeln zu untersuchen haben wir die Erkennungsregeln für Peer-to-Peer-Software des IDS Snort mit dem Skript snort2iptables in iptables-Regeln umgewandelt.

Um diese Regeln verwenden zu können, mußte der Kernel gepatcht werden: Um Filesharing-Protokolle zuverlässig zu erkennen, genügt es nicht, nach Zielports zu filtern sondern der Packetinhalt muß analysiert werden, um nicht aus Versehen harmlose Verbindungen zu unprivilegierten Ports zu unterbrechen.

Dazu haben wir das Netfilter im Kernel mit Patch-O-Matic von netfilter.org auf den neusten Stand gebracht. Unter extra gibt es String-Match-Support.

Einige Regeln mußten noch angepaßt werden, weil sie mehrere String-Matches gebraucht hätten und der aktuelle netfilter-Patch das nicht möglich macht.
Herausgekommen ist folgendes Skript:

#!/bin/bash
source config.sh
# in der p2p-Chain stehen Merkmale fuer Filesharing
# in der handle_p2p steht, was mit Filesharing-Traffic passieren soll
$IPTABLES -X detect_p2p 2>/dev/null
$IPTABLES -N detect_p2p
$IPTABLES -X handle_p2p 2>/dev/null
$IPTABLES -N handle_p2p
$IPTABLES -A handle_p2p -j REJECT
$IPTABLES -A detect_p2p -p tcp --dport 8888 -m string --string "^B" -j handle_p2p # "P2P napster login" classtype:policy-violation sid:549
$IPTABLES -A detect_p2p -p tcp --dport 8888 -m string --string "^F" -j handle_p2p # "P2P napster new user login" classtype:policy-violation sid:550
$IPTABLES -A detect_p2p -p tcp --dport 8888 -m string --string "Ë" -j handle_p2p # "P2P napster download attempt" classtype:policy-violation sid:551
$IPTABLES -A detect_p2p -p tcp -m string --string "_^B" -j handle_p2p #Cannot convert: Sid 552 is too vague for a flow:from_server "P2P napster upload request" classtype:policy-violation sid:552
$IPTABLES -A detect_p2p -p tcp -m string --string "GNUTELLA CONNECT" -j handle_p2p #Cannot convert: Sid 556 has unspecified ports and a flow:to_server "P2P Outbound GNUTella client request" classtype:policy-violation sid:556
$IPTABLES -A detect_p2p -p tcp -m string --string "GNUTELLA OK" -j handle_p2p #Cannot convert: Sid 557 has unspecified ports and a flow:to_server "P2P GNUTella client request" classtype:policy-violation sid:557
$IPTABLES -A detect_p2p -p tcp --dport 6699 -m state --state ESTABLISHED -m string --string ".mp3" -j handle_p2p # "P2P Napster Client Data" nocase-ignored classtype:policy-violation sid:561
$IPTABLES -A detect_p2p -p tcp --sport 6699 -m state --state ESTABLISHED -m string --string ".mp3" # "P2P Napster Client Data" nocase-ignored classtype:policy-violation sid:561
$IPTABLES -A detect_p2p -p tcp --dport 7777 -m string --string ".mp3" -j handle_p2p #Cannot convert: Sid 562 has unspecified ports and a flow:to_server "P2P Napster Client Data" nocase-ignored classtype:policy-violation sid:562
$IPTABLES -A detect_p2p -p tcp --sport 7777 -m string --string ".mp3" -j handle_p2p #Cannot convert: Sid 562 has unspecified ports and a flow:to_server "P2P Napster Client Data" nocase-ignored classtype:policy-violation sid:562
$IPTABLES -A detect_p2p -p tcp --dport 6666 -m state --state ESTABLISHED -m string --string ".mp3" -j handle_p2p # "P2P Napster Client Data" nocase-ignored classtype:policy-violation sid:563
$IPTABLES -A detect_p2p -p tcp --sport 6666 -m state --state ESTABLISHED -m string --string ".mp3" -j handle_p2p # "P2P Napster Client Data" nocase-ignored classtype:policy-violation sid:563
$IPTABLES -A detect_p2p -p tcp --dport 5555 -m state --state ESTABLISHED -m string --string ".mp3" -j handle_p2p # "P2P Napster Client Data" nocase-ignored classtype:policy-violation sid:564
$IPTABLES -A detect_p2p -p tcp --sport 5555 -m state --state ESTABLISHED -m string --string ".mp3" -j handle_p2p # "P2P Napster Client Data" nocase-ignored classtype:policy-violation sid:564
$IPTABLES -A detect_p2p -p tcp --dport 8875 -m state --state ESTABLISHED -m string --string "anon@napster.com" -j handle_p2p # "P2P Napster Server Login" classtype:policy-violation sid:565
$IPTABLES -A detect_p2p -p tcp --sport 8875 -m state --state ESTABLISHED -m string --string "anon@napster.com" -j handle_p2p # "P2P Napster Server Login" classtype:policy-violation sid:565
$IPTABLES -A detect_p2p -p tcp --dport 1214 -m string --string "GET " -j handle_p2p # "P2P Fastrack (kazaa/morpheus) GET request" url,www.musiccity.com/technology.htm url,www.kazaa.com classtype:policy-violation sid:1383
$IPTABLES -A detect_p2p -p tcp -m string --string "UserAgent: KazaaClient" -j handle_p2p # "P2P Fastrack (kazaa/morpheus) traffic" url,www.kazaa.com classtype:policy-violation sid:1699
$IPTABLES -A detect_p2p -p tcp -m string --string "info_hash=" -j handle_p2p # "P2P BitTorrent announce request" classtype:policy-violation sid:2180
$IPTABLES -A detect_p2p -p tcp --dport 6881:6889 -m string --string "^SBitTorrent protocol" -j handle_p2p # "P2P BitTorrent transfer" classtype:policy-violation sid:2181 

Die entstandene Tabelle

detect_p2p
muß lediglich an passender Stelle aus der
FORWARD-Chain
aufgerufen werden.

Bereits am Freitag Abend des Tagungswochenendes stellte sich heraus, daß das String-Matching nicht zuverlässig funktionierte. Nutzer klagten immer wieder über zusammenbrechende TCP-Verbindungen, was sich mit SSH zuverlässig reproduzieren ließ, obwohl die obigen Regeln nicht darauf matchen sollten.

Ohne das String-Matching trat dies Problem nicht auf, weshalb wir uns kurzerhand entschieden, lediglich die typischen Filesharing-Ports (TCP 4662 etc.) zu sperren und mit Hilfe der NetFlow-Graphen das Filesharing-Datenaufkommen im Auge zu behalten.

© Sebastian Kratzert, Manuel Möller 2004