TCPDump, IPTables, udp-Paket-Flooding unterbinden

schnoog

New Member
Hallo zusammen,

ich betreibe u.a. einige ET-Gameserver (Enemy Territory, Quake 3 - Engine).

Nun wird in letzter Zeit ein Exploit ausgenutzt, der massiv Traffic erzeugt.

Wird der Befehl "getstatus" an einen Q3-Gameserver geschickt, so antwortet dieser mit der Ausgabe der kompletten Serverübersicht.
Wenn man dieses Befehl nun aber einige hundert mal pro Sekunde sendet...naja, daher der Titel udp-Paket-Flooding.

Aufgefallen ist es mir, da ein leerer ET Server plötzlich 4,5 MBit/s outgoing Traffic (bei 130kBit/s ingoing) erzeugte.
Als 12 Mann auf dem Server waren, schnellte er auf 36 MBit/s hoch.

Als nächstes habe ich dann mit TCPDump Pakete mitgeschnitten (-c 1000 -A | grep -B1 getstatus) und herausgefunden, dass 430 von 1000
"getstatus" Abfragen von 7 verschiedenen IPs darstellten, die immer brav vom Gameserver beantwortet wurden.
Wie sich herausstellte, waren die IPs aber gespooft, ein Hoster erklärte mir, dass der betreffende Server schon einige Tage nicht mehr am Netz hängen würde.

Daraufhin hab ich
a) einen Patch für ET 2.60B eingespielt (der die Beantwortung auf 1 mal pro IP alle 4 Sekunden limitiert)
und
b) Die 7 IPs in IPTables mit "Drops" versehen.

Womit man meinen möchte das Problem sei damit gelöst.
Dem ist leider nicht ganz so:

Für andere Versionen als 2.60B von ET gibt es leider keinen Patch. Werfe ich einen solchen Server an, so ist innerhalb von Minuten wieder massig Netzwerkverkehr vorhanden.

Jetzt suche ich eine Möglichkeit, auf vermehrte getstatus Abfragen einer "IP" mit einem Eintrag in IPTables zu reagieren.

Hier mal, was ein Ausschnitt dessen, was tcpdump (mit grep -B1 getstatus) auswirft:
08:54:46.555274 IP 91.215.158.93.domain > etw-funzone.de.27960: 65535 zoneRef NoChange*|$ [615q][|domain]
E..+....z..I[..]...R.5m8..A......getstatus....
08:54:46.557479 IP 91.215.158.93.domain > etw-funzone.de.27966: 65535 zoneRef NoChange*|$ [26469q][|domain]
E..*....y..J[..]...R.5m>...'....getstatus.....
08:54:46.557490 IP 91.215.158.93.domain > etw-funzone.de.27966: 65535 zoneRef NoChange*|$ [26469q][|domain]
E..*....y..I[..]...R.5m>...'....getstatus.....

Leider fehlt mir die zündende Idee, wie ich regelbasiert (wenn von einer IP mehr als X getstatus-Pakete innerhalb von Y Sekunden ankommen) den Eintrag der IP in iptables
bewerkstelligen könnte.

Vielleicht hat je jemand von Euch eine solche.

Vielen Dank
Schnoog
 
Hab nun eine Möglichkeit gefunden ;)

Hab mir kurzerhand ein Script gebastelt, dass TCPDump für eine konfigurierbare Dauer laufen lässt.
Ein einstellbares Limit [(x)in Requests per Second] sorgt dafür, dass Requester die mehr als x * Dauer in S Anfragen machen, automatisch in IPTables eine Drop Rule verpasst kriegen.

Das Skript ist hier zu haben

Gruss
Schnoog
 
Back
Top