tcpdump ist ein erstaunliches Befehlszeilen-Tool für Netzwerk-Sniffing. Es ist ein Industriestandard für das Erfassen und Analysieren von TCP/IP-Paketen.

Das Tool tcpdump kann bei der Lösung von Netzwerkproblemen eine große Hilfe sein. Die Pakete können in einer Datei gespeichert und später analysiert werden. Es ist eine gute Idee, dieses Tool gelegentlich auszuführen, um Ihr Netzwerk zu überwachen.

Wie sieht die tcpdump-Ausgabe aus?

mittcpdump können Sie die Header der TCP/IP-Pakete untersuchen. Es gibt für jedes Paket eine Zeile aus und der Befehl läuft so lange, bis Sie Strg C drücken, um ihn zu beenden.

Schauen wir uns eine Zeile aus einer Beispielausgabe an:

20:58:26.765637 IP 10.0.0.50.80 > 10.0.0.1.53181: Flags [F.], seq 1, ack 2, win 453, options [nop,nop,TS val 3822939 ecr 249100129], length 0

Jede Zeile enthält

  • Unix-Zeitstempel (20:58:26.765637)
  • protokoll (IP)
  • den Quell-Hostnamen oder die IP und die Portnummer (10.0.0.50.80)
  • den Ziel-Hostnamen oder die IP und die Portnummer (10.0.0.1.53181)
  • TCP-Flags (Flaggen [F.]). Flags zeigen den Status der Verbindung an. Dieses Feld kann mehr als einen Wert enthalten, wie in diesem Beispiel [F.] für FIN-ACK. Dieses Feld kann die folgenden Werte haben:
    • S – SYN. Der erste Schritt beim Aufbau der Verbindung.
    • F – FIN. Beendigung der Verbindung.
    • . – ACK. Erfolgreich empfangenes Acknowledgment-Paket.
    • P – PUSH. Weist den Empfänger an, Pakete zu verarbeiten, anstatt sie zu puffern.
    • R – RST. Kommunikation gestoppt.
  • Sequenznummer der Daten im Paket.(seq 1)
  • Quittungsnummer(ack 2)
  • Fenstergröße(win 453). Die Anzahl der im Empfangspuffer verfügbaren Bytes. Es folgen die TCP-Optionen.
  • Länge der Datennutzlast.(Länge 0)

Installation

Auf Debian-basierten Distributionen kann tcpdump mit dem APT-Befehl installiert werden:

# apt install tcpdump -y

Auf RPM-basierten Distributionen kann tcpdump mit YUM installiert werden:

# yum install tcpdump -y

Oder mit DNF bei RHEL 8

# dnf install tcpdump -y

tcpdump Befehlsoptionen

Sie müssen root sein, um tcpdump auszuführen. Der Befehl enthält viele Optionen und Filter. Wenn Sie tcpdump ohne Optionen ausführen, werden alle Pakete aufgezeichnet, die über die Standardschnittstelle laufen.

So sehen Sie die Liste der Netzwerkschnittstellen, die auf dem System verfügbar sind und über die tcpdump Pakete aufzeichnen kann.

# tcpdump -D

Oder

# Tcpdump --list-interfaces
1.eth0
2.nflog (Linux Netfilter Log (NFLOG) Schnittstelle)
3.nfqueue (Linux-Netzfilter-Warteschlange (NFQUEUE) Schnittstelle)
4.eth1
5.any (Pseudo-Gerät, das auf allen Schnittstellen aufzeichnet)
6.lo [Loopback]

Dies ist besonders nützlich auf Systemen, die nicht über einen Befehl zum Auflisten von Schnittstellen verfügen.

Um Pakete zu erfassen, die über eine bestimmte Schnittstelle laufen, verwenden Sie das Flag -i zusammen mit dem Namen der Schnittstelle. Ohne die Option -i erfasst tcpdump dieerste Netzwerkschnittstelle, auf die es trifft.

# tcpdump -i eth1
tcpdump: ausführliche Ausgabe unterdrückt, verwenden Sie -v oder -vv für eine vollständige Protokolldekodierung
lauscht auf eth1, Link-Typ EN10MB (Ethernet), Capture-Größe 262144 Bytes
01:06:09.278817 IP vagrant-ubuntu-trusty-64 > 10.0.0.51: ICMP-Echo-Anfrage, id 4761, seq 1, Länge 64
01:06:09.279374 IP 10.0.0.51 > vagrant-ubuntu-trusty-64: ICMP echo reply, id 4761, seq 1, length 64
01:06:10.281142 IP vagrant-ubuntu-trusty-64 > 10.0.0.51: ICMP echo request, id 4761, seq 2, length 64

Das Flag -v erhöht die Informationen, die Sie über die Pakete sehen, -vv gibt Ihnen noch mehr Details.

Standardmäßig löst tcpdump IP-Adressen in Hostnamen auf und verwendet außerdem Dienstnamen anstelle von Portnummern. Wenn DNS gestört ist oder Sie nicht möchten, dass tcpdump Namenssuchen durchführt, verwenden Sie die Option -n.

# tcpdump -n
lauscht auf eth0, Link-Typ EN10MB (Ethernet), Capture-Größe 262144 Bytes
04:19:07.675216 IP 10.0.2.15.22 > 10.0.2.2.50422: Flags [P.], seq 2186733178:2186733278, ack 204106815, win 37232, length 100
04:19:07.675497 IP 10.0.2.2.50422 > 10.0.2.15.22: Flags [.], ack 100, win 65535, length 0
04:19:07.675747 IP 10.0.2.15.22 > 10.0.2.2.50422: Flags [P.], seq 100:136, ack 1, win 37232, length 36
04:19:07.675902 IP 10.0.2.2.50422 > 10.0.2.15.22: Flags [.], ack 136, win 65535, length 0
04:19:07.676142 IP 10.0.2.15.22 > 10.0.2.2.50422: Flags [P.], seq 136:236, ack 1, win 37232, Länge 100

Um nur eine bestimmte Anzahl von Zeilen zu erfassen, beispielsweise 5, verwenden Sie die Option -c:

#tcpdump -c 5
04:19:07.675216 IP 10.0.2.15.22 > 10.0.2.2.50422: Flags [P.], seq 2186733178:2186733278, ack 204106815, win 37232, length 100
04:19:07.675497 IP 10.0.2.2.50422 > 10.0.2.15.22: Flags [.], ack 100, win 65535, length 0
04:19:07.675747 IP 10.0.2.15.22 > 10.0.2.2.50422: Flags [P.], seq 100:136, ack 1, win 37232, length 36
04:19:07.675902 IP 10.0.2.2.50422 > 10.0.2.15.22: Flags [.], ack 136, win 65535, length 0
04:19:07.676142 IP 10.0.2.15.22 > 10.0.2.2.50422: Flags [P.], seq 136:236, ack 1, win 37232, Länge 100
5 aufgezeichnete Pakete

Die Standardausgabe von tcpdump verwendet Unix-Zeitstempel. Um Pakete mit einem für Menschen lesbaren Zeitstempel zu erfassen:

# tcpdump -tttt
2020-07-06 04:30:12.203638 IP 10.0.2.15.22 > 10.0.2.2.50422: Flags [P.], seq 2186734102:2186734138, ack 204107103, win 37232, Länge 36
2020-07-06 04:30:12.203910 IP 10.0.2.2.50422 > 10.0.2.15.22: Flags [.], ack 36, win 65535, length 0
2020-07-06 04:30:12.204292 IP 10.0.2.15.22 > 10.0.2.2.50422: Flags [P.], seq 36:72, ack 1, win 37232, length 36
2020-07-06 04:30:12.204524 IP 10.0.2.2.50422 > 10.0.2.15.22: Flags [.], ack 72, win 65535, length 0
2020-07-06 04:30:12.204658 IP 10.0.2.15.22 > 10.0.2.2.50422: Flags [P.], seq 72:108, ack 1, win 37232, length 36

tcpdump-Filterausdrücke

Die Filterausdrücke legen fest, welche Paketköpfe angezeigt werden sollen. Wenn keine Filter angewendet werden, werden alle Paketköpfe angezeigt. Häufig verwendete Filter sind Port, Host, src, dst, tcp, udp, icmp.

port-Filter

Verwenden Sie den Portfilter, um Pakete anzuzeigen, die an einem bestimmten Port ankommen:

# Tcpdump -i eth1 -c 5 port 80
23:54:24.978612 IP 10.0.0.1.53971 > 10.0.0.50.80: Flags [SEW], seq 53967733, win 65535, options [mss 1460,nop,wscale 5,nop,nop,TS val 256360128 ecr 0,sackOK,eol], length 0
23:54:24.978650 IP 10.0.0.50.80 > 10.0.0.1.53971: Flags [S.E], seq 996967790, ack 53967734, win 28960, options [mss 1460,sackOK,TS val 5625522 ecr 256360128,nop,wscale 6], length 0
23:54:24.978699 IP 10.0.0.1.53972 > 10.0.0.50.80: Flags [SEW], seq 226341105, win 65535, options [mss 1460,nop,wscale 5,nop,nop,TS val 256360128 ecr 0,sackOK,eol], length 0
23:54:24.978711 IP 10.0.0.50.80 > 10.0.0.1.53972: Flags [S.E], seq 1363851389, ack 226341106, win 28960, options [mss 1460,sackOK,TS val 5625522 ecr 256360128,nop,wscale 6], length 0

host-Filter

Um alle Pakete zu erfassen, die an dem Host mit der IP-Adresse 10.0.2.15 ankommen oder ihn verlassen:

# tcpdump host 10.0.2.15
03:48:06.087509 IP 10.0.2.15.22 > 10.0.2.2.50225: Flags [P.], seq 3862934963:3862934999, ack 65355639, win 37232, length 36
03:48:06.087806 IP 10.0.2.2.50225 > 10.0.2.15.22: Flags [.], ack 36, win 65535, length 0
03:48:06.088087 IP 10.0.2.15.22 > 10.0.2.2.50225: Flags [P.], seq 36:72, ack 1, win 37232, length 36
03:48:06.088274 IP 10.0.2.2.50225 > 10.0.2.15.22: Flags [.], ack 72, win 65535, Länge 0
03:48:06.088440 IP 10.0.2.15.22 > 10.0.2.2.50225: Flags [P.], seq 72:108, ack 1, win 37232, length 36

Um Pakete eines bestimmten Protokolltyps, z.B. icmp, auf der Schnittstelle eth1 zu erfassen:

# tcpdump -i eth1 icmp
04:03:47.408545 IP vagrant-ubuntu-trusty-64 > 10.0.0.51: ICMP echo request, id 2812, seq 75, length 64
04:03:47.408999 IP 10.0.0.51 > vagrant-ubuntu-trusty-64: ICMP echo reply, id 2812, seq 75, length 64
04:03:48.408697 IP vagrant-ubuntu-trusty-64 > 10.0.0.51: ICMP echo request, id 2812, seq 76, length 64
04:03:48.409208 IP 10.0.0.51 > vagrant-ubuntu-trusty-64: ICMP echo reply, id 2812, seq 76, length 64
04:03:49.411287 IP vagrant-ubuntu-trusty-64 > 10.0.0.51: ICMP echo request, id 2812, seq 77, length 64

Kombinieren von Filterausdrücken

Sie können diese Filterausdrücke mit den Operatoren AND, OR und NOT kombinieren. So können Sie Befehle schreiben, die Pakete genauer isolieren können:

Pakete, die von einer bestimmten IP-Adresse stammen und für einen bestimmten Port bestimmt sind:

# tcpdump -n -i eth1 src 10.0.0.1 und dst port 80
00:18:17.155066 IP 10.0.0.1.54222 > 10.0.0.50.80: Flags [F.], seq 500773341, ack 2116767648, win 4117, options [nop,nop,TS val 257786173 ecr 5979014], length 0
00:18:17.155104 IP 10.0.0.1.54225 > 10.0.0.50.80: Flags [S], seq 904045691, win 65535, options [mss 1460,nop,wscale 5,nop,nop,TS val 257786173 ecr 0,sackOK,eol], length 0
00:18:17.157337 IP 10.0.0.1.54221 > 10.0.0.50.80: Flags [P.], seq 4282813257:4282813756, ack 1348066220, win 4111, options [nop,nop,TS val 257786174 ecr 5979015], length 499: HTTP: GET / HTTP/1.1
00:18:17.157366 IP 10.0.0.1.54225 > 10.0.0.50.80: Flags [.], ack 1306947508, win 4117, options [nop,nop,TS val 257786174 ecr 5983566], length 0

Um alle Pakete außer ICMP zu erfassen, verwenden Sie den Operator NOT:

# tcpdump -i eth1 not icmp

Speichern von Paket-Headern in einer Datei

Da die Ausgabe von tcpdump recht schnell über den Bildschirm scrollen kann, können Sie die Paketköpfe mit dem Flag -w in einer Datei speichern. Die Dateien zum Speichern der Ausgabe verwenden das pcap-Format und haben die Erweiterung .pcap.

PCAP steht für Packet Capture. Der folgende Befehl speichert 10 Zeilen der Ausgabe auf der Schnittstelle eth1 in icmp.pcap.

# tcpdump -i eth1 -c 10 -w icmp.pcap
tcpdump: lauscht auf eth1, Link-Typ EN10MB (Ethernet), Capture-Größe 262144 Bytes
10 aufgezeichnete Pakete
10 vom Filter empfangene Pakete
0 vom Kernel verworfene Pakete

Sie können diese Datei mit dem Flag -r lesen:

tcpdump -r icmp.pcap
lesen aus der Datei icmp.pcap, Link-Typ EN10MB (Ethernet)
05:33:20.852732 IP vagrant-ubuntu-trusty-64 > 10.0.0.51: ICMP echo request, id 3261, seq 33, length 64
05:33:20.853245 IP 10.0.0.51 > vagrant-ubuntu-trusty-64: ICMP echo reply, id 3261, seq 33, length 64
05:33:21.852586 IP vagrant-ubuntu-trusty-64 > 10.0.0.51: ICMP echo request, id 3261, seq 34, length 64
05:33:21.853104 IP 10.0.0.51 > vagrant-ubuntu-trusty-64: ICMP echo reply, id 3261, seq 34, length 64
05:33:22.852615 IP vagrant-ubuntu-trusty-64 > 10.0.0.51: ICMP echo request, id 3261, seq 35, length 64

Paketdetails anzeigen

Bis jetzt haben wir nur die Kopfzeilen der Pakete gesehen. Um den Inhalt der Pakete zu sehen, verwenden Sie die Option -A. Damit wird der Inhalt des Pakets in ASCII ausgedruckt, was bei der Fehlersuche im Netzwerk hilfreich sein kann. Sie können auch die Option -X verwenden, um die Ausgabe im Hex-Format anzuzeigen. Dies ist möglicherweise nicht sehr hilfreich, wenn die Verbindung verschlüsselt ist.

# tcpdump -c10 -i eth1 -n -A port 80
23:35:53.109306 IP 10.0.0.1.53916 > 10.0.0.50.80: Flags [P.], seq 2366590408:2366590907, ack 175457677, win 4111, options [nop,nop,TS val 255253117 ecr 5344866], length 499: HTTP: GET / HTTP/1.1
E..'..@.@.%.
...
..2...P..M.
uE............
.6.}.Q.bGET / HTTP/1.1
Rechner: 10.0.0.50
Verbindung: keep-alive
Cache-Kontrolle: max-age=0
Upgrade-Insecure-Requests: 1
Benutzer-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, wie Gecko) Chrome/83.0.4103.116 Safari/537.36
Akzeptiert: text/html,application/xhtml xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Accept-Encoding: gzip, deflate
Accept-Language: en-US,en;q=0.9
If-Modified-Since: Tue, 04 Mar 2014 11:46:45 GMT

Fazit

tcpdump ist einfach einzurichten, und sobald Sie die Ausgabe, die verschiedenen Flags und Filter verstehen, können Sie es zur Lösung von Netzwerkproblemen und zur Sicherung Ihres Netzwerks einsetzen.