Zwei Paketmitschnitte vergleichen
Manchmal fertige ich an mehreren Stellen gleichzeitig im Netz Paketmitschnitte an, um die Ursache von Paketverlusten einzugrenzen. Dann habe ich PCAP-Dateien mit mehr oder weniger denselben Datagrammen, die ich miteinander vergleichen will.
Bisher habe ich noch kein geeignetes Programm dafür gefunden, weshalb ich in solchen Fällen in mehreren Schritten vorgehe.
Beim Vergleich zweier Paketmitschnitte werde ich mit den folgenden Problemen konfrontiert:
- Habe ich die Paketmitschnitte nicht zur gleichen Zeit angefertigt, dann enthalten sie nicht die gleichen Verbindungen und ich kann sie überhaupt nicht vergleichen.
- Gibt es NAT, dann stimmen die Adressen nicht überein und ich kann sie nur mühsam Zeile für Zeile vergleichen.
- Die Zeitstempel der gleichen Datagramme sind zwischen den Mitschnitten unterschiedlich. Einmal wegen der Laufzeit und einmal wegen Unterschieden der Systemzeit bei der Messung.
- Die TTL der gleichen Datagramme sind in den Mitschnitten unterschiedlich weil die Datagramme verschieden viele Hops passiert haben.
- Die Reihenfolge der Datagramme kann sich unterscheiden, da Datagramme, die an beiden Endpunkten gleichzeitig gesendet wurden, am näher gelegenen Mitschnitt zuerst auftauchen und am weiter entfernten später.
- Einige Datagramme fehlen komplett in dem einen oder anderen Mitschnitt.
Problem 1. reduziere ich, indem ich die Mitschnitte zeitgleich anfertige. Anschließend suche ich mir eine oder mehrere vollständige Verbindungen heraus, die in allen Mitschnitten enthalten sind, und speichere genau diese Verbindungen in anderen PCAP-Dateien für die weitere Untersuchung.
Bei Problem 2, NAT zwischen den Mitschnitten
kann ich die Textausgabe
mit sed
oder einer Skriptsprache nachbearbeiten
und so die Adressen angleichen.
Um Problem 3. und 4. zu eliminieren, entferne ich die Zeitstempel und TTL der Datagramme aus der Ausgabe.
Problem 5. eliminiere ich,
indem ich jeweils nur die Datagramme
einer Richtung aus den beiden Mitschnitten
miteinander vergleiche.
Dazu lasse ich den Mitschnitt von tshark
ausgeben
und trenne die beiden Richtungen mit grep
.
Tshark ist in diesem Fall besser geeignet als tcpdump,
weil es die wesentlichen Daten zu den einzelnen Datagrammen
in einer Zeile sehr prägnant darstellt
und seine Ausgabe gut weiter verarbeitet werden kann.
Problem 6. ist schließlich das, was ich betrachten will.
Hierzu vergleiche ich die aufbereiteten Daten einfach mit diff -u
und sehe sofort,
welche Datagramme fehlen
oder ob ein Datagramm ein anderes überholt hat.
Skript
Das folgende Skript, welches die Probleme 3, 4 und 5 angeht bekommt als Aufrufparameter den Namen einer PCAP-Datei und die IP-Adresse eines der beiden Kommunikationspartner übergeben.
Es hinterlässt zwei Dateien mit den Endungen
-to.txt und -from.txt,
die die Ausgabe von tshark
getrennt nach der Richtung der Datagramme
und ohne Zeitstempel enhält.
#!/bin/bash
#
# vim: set sw=2 ts=2 tw=78 ai et si:
#
function split_pcap() {
local pcapname=$1
local address=$2
local cleanname=${pcapname%.pcap}
local to="${cleanname}-to.txt"
local from="${cleanname}-from.txt"
tshark -r $pcapname \
| grep "→ $address" \
| awk '{$1="";$2="";print}' \
| sed 's/(request in [0-9]*)//' \
> $to
tshark -r $pcapname \
| grep -v "→ $address" \
| awk '{$1="";$2="";print}' \
| sed 's/(request in [0-9]*)//' \
> $from
} # split_pcap()
function main() {
local pcapname=$1
local address=$2
split_pcap $pcapname $address
} # main()
main "$@"
Das Programm teilt die Datenströme
indem es einmal mit grep
und einmal mit grep -v
nach Zeilen mit der Adresse nach dem Pfeil →,
das heißt als Zieladresse,
sucht.
Es ist daher wichtig,
dass die angegebene PCAP-Datei
ausschließlich Datagramme der betrachteten Verbindungen enthält
damit die Ausgabe nicht vom Wesentlichen ablenkt.
Ich rufe das Skript für alle PCAP-Dateien auf und vergleiche anschließend paarweise die Dateien mit der Endung '-from.txt' für die eine Richtung und '-to.txt' für die andere Richtung.
Posted 2020-05-21