tcpdump im Einsatz
- Urspruenglicher Autor: Ramon Kukla
- Urspruengliches Datum: 25.02.2011
Heute gibt es mal was aus meiner „Grabbelkiste“. Aufgrund meiner Taetigkeit als Administrator, der sowohl Infrastruktur sowie auch punktuell Server betreut, muss ich auch immer wieder nach Problemen im Netzwerk suchen. Neben Dingen wie etwa „get flow“ und „snoop“ fuer Juniper kommt da natuerlich auch immer wieder gerne tcpdump zum Einsatz. Die Nutzung von tcpdump macht nicht nur Eindruck bei den Frauen, sondern hilft durchaus auch Probleme im Netzwerkverkehr zu identifizieren.
Da die Auswertung der angezeigten Informationen von tcpdump in Echtzeit nur was fuer die ganze Harten ist, schreibe ich mir die Ausgabe in der Regel in ein File weg.
tcpdump -n -i eth0 -w dump.pcap
Anschliessend schaue ich das Resultat in einem Wireshark an, da man damit die eigentliche Auswertung doch etwas angenehmer gestalten kann. In diesem Beispiel wird man sich moeglicherweise wundern, dass die mitgeschnittenen Pakete nur bis zu einer bestimmen Groesse mitgeschnitten wurden. Der Standard fuer snaplen, so nennt sich der Wert, ist laut manpage fuer IPv4 68 Bytes. Da ich immer Sorge habe etwas zu verpassen rufe ich tcpdump daher immer mit -s 0
auf. Somit werden alle Pakete komplett mitgeschnitten.
In der Regel beschraenke ich meine Filter auf so einfache Dinge wie etwa host a.b.c.d
oder (not) port 22
. Es geht aber auch feiner. Das ist vor allem dann interessant, wenn man spaeter keine Auswertung via Wireshark machen kann oder moechte.
Auf unserem gemeinsamen Server hatten wir vor einigen Wochen das Problem, dass unser Webserver wegen einer ungewoehnlich hohen Anzahl an Anfragen leiden musste. Alles sah nach einem Spam-Angriff von einigen wenigen Adressen aus. Das konnten wir nicht nur nicht nur an vielen Eintraegen im Log sehen, sondern auch mit Hilfe von tcpdump darstellen.
sudo tcpdump -c 30 -ne -i eth0 dst port 80 and 'tcp[13] == 2' \ | awk '{print $10}' \ | cut -d. -f1,2,3,4 \ | sort \ | uniq -c \ | sort -n
Mit Hilfe dieses Aufrufes werden 30 Pakete gesammelt, die ausschliesslich das SYN-Flag gesetzt haben. Nach dem Einsammeln der Pakete wird die IP-Adresse mit awk und cut „extrahiert“ und anschliessend wird eine Liste (Aufsteigend) erstellt, in der die Hauefigkeit einer auftretenden IP-Adresse zu sehen ist. Doofer Satz, daher eine Beispielausgabe:
ramon@bar ~ $ sudo tcpdump -c 30 -ne -i eth0 dst port 80 and 'tcp[13] == 2' \ | awk '{print $10}' \ | cut -d. -f1,2,3,4 \ | sort \ | uniq -c \ | sort -n tcpdump: verbose output suppressed, use -v or -vv for full protocol decode listening on eth0:1, link-type EN10MB (Ethernet), capture size 96 bytes 30 packets captured 30 packets received by filter 0 packets dropped by kernel 1 114.64.146.44 1 188.40.55.145 1 218.214.140.146 1 66.244.66.217 1 66.244.72.142 1 67.145.111.246 2 66.244.72.44 2 41.210.106.254 4 66.244.66.44 4 87.150.185.168 14 45.220.250.244
Die IP-Adressen sind randomized (kann man „verzufaelligt“ sagen? ;). Die Liste kann man anschliessend prima nutzen um, nach der Bearbeitung, z.B. via iptables die „fuehrenden“ IP-Adressen zu blockieren.