tcpdump
ist ein Befehlszeilendienstprogramm, mit dem Sie den Netzwerkverkehr zu und von Ihrem System erfassen und untersuchen können. Es ist das von Netzwerkadministratoren am häufigsten verwendete Tool zur Behebung von Netzwerkproblemen und Sicherheitstests.
Trotz seines Namens mit tcpdump
, können Sie auch Nicht-TCP-Datenverkehr wie UDP, ARP oder ICMP erfassen. Die erfassten Pakete können in eine Datei oder Standardausgabe geschrieben werden. Eines der mächtigsten Features von tcpdump
Befehl ist seine Fähigkeit, Filter zu verwenden und nur die Daten zu erfassen, die Sie analysieren möchten.
In diesem Artikel behandeln wir die Grundlagen zur Verwendung von tcpdump
Befehl unter Linux.
Installation von tcpdump
#
tcpdump
wird standardmäßig auf den meisten Linux-Distributionen und macOS installiert. Um zu prüfen, ob die tcpdump
Befehl ist auf Ihrem Systemtyp verfügbar:
tcpdump --version
Die Ausgabe sollte in etwa so aussehen:
tcpdump version 4.9.2
libpcap version 1.8.1
OpenSSL 1.1.1b 26 Feb 2019
Wenn tcpdump
auf Ihrem System nicht vorhanden ist, gibt der obige Befehl „tcpdump:command not found“ aus. Sie können einfach tcpdump
installieren Verwenden Sie den Paketmanager Ihrer Distribution.
Installation von tcpdump
auf Ubuntu und Debian #
sudo apt update && sudo apt install tcpdump
Installation von tcpdump
auf CentOS und Fedora #
sudo yum install tcpdump
Installation von tcpdump
auf Arch Linux #
sudo pacman -S tcpdump
Erfassen von Paketen mit tcpdump
#
Die allgemeine Syntax für tcpdump
Befehl lautet wie folgt:
tcpdump [options] [expression]
- Der Befehl
options
ermöglichen es Ihnen, das Verhalten des Befehls zu steuern. - Der Filter
expression
definiert, welche Pakete erfasst werden.
Nur root oder Benutzer mit sudo
Privilegien können tcpdump
ausführen . Wenn Sie versuchen, den Befehl als nicht privilegierter Benutzer auszuführen, erhalten Sie eine Fehlermeldung:„Sie haben keine Berechtigung zum Aufnehmen auf diesem Gerät“.
Der einfachste Anwendungsfall ist der Aufruf von tcpdump
ohne Optionen und Filter:
sudo tcpdump
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on ens3, link-type EN10MB (Ethernet), capture size 262144 bytes
15:47:24.248737 IP linuxize-host.ssh > desktop-machine.39196: Flags [P.], seq 201747193:201747301, ack 1226568763, win 402, options [nop,nop,TS val 1051794587 ecr 2679218230], length 108
15:47:24.248785 IP linuxize-host.ssh > desktop-machine.39196: Flags [P.], seq 108:144, ack 1, win 402, options [nop,nop,TS val 1051794587 ecr 2679218230], length 36
15:47:24.248828 IP linuxize-host.ssh > desktop-machine.39196: Flags [P.], seq 144:252, ack 1, win 402, options [nop,nop,TS val 1051794587 ecr 2679218230], length 108
... Long output suppressed
23116 packets captured
23300 packets received by filter
184 packets dropped by kernel
tcpdump
wird weiterhin Pakete erfassen und auf die Standardausgabe schreiben, bis es ein Interrupt-Signal empfängt. Verwenden Sie Ctrl+C
Tastenkombination, um ein Unterbrechungssignal zu senden und den Befehl zu stoppen.
Für eine ausführlichere Ausgabe übergeben Sie -v
Option oder -vv
für eine noch ausführlichere Ausgabe:
sudo tcpdump -vv
Sie können die Anzahl der zu erfassenden Pakete mit -c
angeben Möglichkeit. Um beispielsweise nur zehn Pakete zu erfassen, würden Sie Folgendes eingeben:
sudo tcpdump -c 10
Nach dem Erfassen der Pakete, tcpdump
wird aufhören.
Wenn keine Schnittstelle angegeben ist, tcpdump
verwendet die erste Schnittstelle, die es findet, und gibt alle Pakete aus, die diese Schnittstelle passieren.
Verwenden Sie das -D
Option zum Drucken einer Liste aller verfügbaren Netzwerkschnittstellen, von denen tcpdump Pakete sammeln kann:
sudo tcpdump -D
Für jede Schnittstelle gibt der Befehl den Schnittstellennamen, eine kurze Beschreibung und einen zugehörigen Index (Nummer) aus:
1.ens3 [Up, Running]
2.any (Pseudo-device that captures on all interfaces) [Up, Running]
3.lo [Up, Running, Loopback]
Die obige Ausgabe zeigt, dass ens3
ist die erste Schnittstelle, die von tcpdump
gefunden wird und verwendet, wenn dem Befehl keine Schnittstelle bereitgestellt wird. Die zweite Schnittstelle any
ist ein spezielles Gerät, mit dem Sie alle aktiven Schnittstellen erfassen können.
Um die Schnittstelle anzugeben, auf der Sie Datenverkehr erfassen möchten, rufen Sie den Befehl mit -i
auf Option, gefolgt vom Schnittstellennamen oder dem zugehörigen Index. Um beispielsweise alle Pakete von allen Schnittstellen zu erfassen, würden Sie any
angeben Schnittstelle:
sudo tcpdump -i any
Standardmäßig tcpdump
führt eine umgekehrte DNS-Auflösung für IP-Adressen durch und übersetzt Portnummern in Namen. Verwenden Sie das -n
Option zum Deaktivieren der Übersetzung:
sudo tcpdump -n
Das Überspringen der DNS-Suche vermeidet das Generieren von DNS-Datenverkehr und macht die Ausgabe besser lesbar. Es wird empfohlen, diese Option immer dann zu verwenden, wenn Sie tcpdump
aufrufen .
Anstatt die Ausgabe auf dem Bildschirm anzuzeigen, können Sie sie mit den Umleitungsoperatoren >
in eine Datei umleiten und >>
:
sudo tcpdump -n -i any > file.out
Sie können die Daten auch während des Speicherns in einer Datei mit dem tee
ansehen Befehl:
sudo tcpdump -n -l | tee file.out
Das -l
Option im obigen Befehl sagt tcpdump
um die Ausgangsleitung gepuffert zu machen. Wenn diese Option nicht verwendet wird, wird die Ausgabe nicht auf den Bildschirm geschrieben, wenn eine neue Zeile generiert wird.
Verstehen des tcpdump
Ausgabe #
tcpdump
gibt Informationen für jedes erfasste Paket in einer neuen Zeile aus. Jede Zeile enthält je nach Protokoll einen Zeitstempel und Informationen zu diesem Paket.
Das typische Format einer TCP-Protokollzeile ist wie folgt:
[Timestamp] [Protocol] [Src IP].[Src Port] > [Dst IP].[Dst Port]: [Flags], [Seq], [Ack], [Win Size], [Options], [Data Length]
Gehen wir Feld für Feld vor und erklären die folgende Zeile:
15:47:24.248737 IP 192.168.1.185.22 > 192.168.1.150.37445: Flags [P.], seq 201747193:201747301, ack 1226568763, win 402, options [nop,nop,TS val 1051794587 ecr 2679218230], length 108
-
15:47:24.248737
- Der Zeitstempel des erfassten Pakets ist Ortszeit und verwendet das folgende Format:hours:minutes:seconds.frac
, wobeifrac
ist Sekundenbruchteile seit Mitternacht. -
IP
- Das Paketprotokoll. IP bedeutet in diesem Fall das Internetprotokoll Version 4 (IPv4). -
192.168.1.185.22
- Die Quell-IP-Adresse und der Port, getrennt durch einen Punkt (.
). -
192.168.1.150.37445
- Die Ziel-IP-Adresse und der Port, getrennt durch einen Punkt (.
). -
Flags [P.]
- Feld TCP-Flags. In diesem Beispiel[P.]
bedeutet Push-Acknowledgement-Paket, das verwendet wird, um das vorherige Paket zu bestätigen und Daten zu senden. Andere typische Flag-Feldwerte sind wie folgt:- [.] - ACK (Bestätigung)
- [S] - SYN (Verbindung starten)
- [P] - PSH (Push-Daten)
- [F] - FIN (Verbindung beenden)
- [R] - RST (Verbindung zurücksetzen)
- [S.] - SYN-ACK (SynAcK-Paket)
-
seq 201747193:201747301
- Die Sequenznummer steht imfirst:last
Notation. Es zeigt die Anzahl der im Paket enthaltenen Daten. Mit Ausnahme des ersten Pakets im Datenstrom, wo diese Zahlen absolut sind, werden alle nachfolgenden Pakete als relative Byte-Positionen verwendet. In diesem Beispiel lautet die Nummer201747193:201747301
, was bedeutet, dass dieses Paket die Bytes 201747193 bis 201747301 des Datenstroms enthält. Verwenden Sie das-S
Option zum Drucken absoluter Sequenznummern. -
ack 1226568763
Die Bestätigungsnummer ist die Sequenznummer der nächsten Daten, die von der anderen Seite dieser Verbindung erwartet werden. -
win 402
- Die Fensternummer ist die Anzahl der verfügbaren Bytes im Empfangspuffer. -
options [nop,nop,TS val 1051794587 ecr 2679218230]
- TCP-Optionen.nop
, oder „no operation“ ist ein Padding, das verwendet wird, um den TCP-Header zu einem Vielfachen von 4 Bytes zu machen.TS val
ist ein TCP-Zeitstempel undecr
steht für eine Echo-Antwort. Weitere Informationen zu TCP-Optionen finden Sie in der IANA-Dokumentation. -
length 108
- Die Länge der Nutzdaten
tcpdump
Filter #
Wenn tcpdump
ohne Filter aufgerufen wird, erfasst es den gesamten Datenverkehr und erzeugt eine riesige Menge an Ausgabe, die es sehr schwierig macht, die interessierenden Pakete zu finden und zu analysieren.
Filter sind eine der mächtigsten Funktionen von tcpdump
Befehl. Sie, da sie Ihnen erlauben, nur die Pakete zu erfassen, die dem Ausdruck entsprechen. Wenn Sie beispielsweise Probleme mit einem Webserver beheben, können Sie Filter verwenden, um nur den HTTP-Datenverkehr zu erhalten.
tcpdump
verwendet die Berkeley Packet Filter (BPF)-Syntax, um die erfassten Pakete unter Verwendung verschiedener Verarbeitungsparameter wie Protokolle, Quell- und Ziel-IP-Adressen und Ports usw. zu filtern.
In diesem Artikel werfen wir einen Blick auf einige der gängigsten Filter. Eine Liste aller verfügbaren Filter finden Sie auf der pcap-filtermanpage.
Filterung nach Protokoll #
Um die Erfassung auf ein bestimmtes Protokoll zu beschränken, geben Sie das Protokoll als Filter an. Um beispielsweise nur den UDP-Datenverkehr zu erfassen, würden Sie Folgendes ausführen:
sudo tcpdump -n udp
Eine andere Möglichkeit, das Protokoll zu definieren, ist die Verwendung von proto
Qualifizierer, gefolgt von der Protokollnummer. Der folgende Befehl filtert das Protokoll Nummer 17 und erzeugt das gleiche Ergebnis wie das obige:
sudo tcpdump -n proto 17
Weitere Informationen zu den Nummern finden Sie in der Nummernliste des IP-Protokolls.
Filterung nach Hostnummer
Um nur Pakete zu erfassen, die sich auf einen bestimmten Host beziehen, verwenden Sie den host
Qualifizierer:
sudo tcpdump -n host 192.168.1.185
Der Host kann entweder eine IP-Adresse oder ein Name sein.
Sie können die Ausgabe auch mithilfe von net
auf einen bestimmten IP-Bereich filtern Qualifikation. Zum Beispiel, um nur Pakete auszugeben, die sich auf 10.10.0.0/16
beziehen Sie würden verwenden:
sudo tcpdump -n net 10.10
Filterung nach Portnummer
Um die Erfassung nur auf Pakete von oder zu einem bestimmten Port zu beschränken, verwenden Sie den port
Qualifikation. Der folgende Befehl erfasst Pakete, die sich auf den SSH-Dienst (Port 22) beziehen, indem er diesen Befehl verwendet:
sudo tcpdump -n port 23
Der portrange
Mit dem Qualifizierer können Sie Datenverkehr in einer Reihe von Ports erfassen:
sudo tcpdump -n portrange 110-150
Filtern nach Quelle und Ziel #
Sie können Pakete auch anhand des Quell- oder Zielports oder -hosts filtern, indem Sie are src
verwenden , dst
, src and dst
, und src or dst
Qualifizierer.
Der folgende Befehl erfasst eingehende Pakete von einem Host mit der IP 192.168.1.185:
sudo tcpdump -n src host 192.168.1.185
Um den Verkehr zu finden, der von einer beliebigen Quelle zu Port 80 kommt, würden Sie Folgendes verwenden:
sudo tcpdump -n dst port 80
Komplexe Filter #
Filter können mit and
kombiniert werden (&&
), or
(||
) und not
(!
) Operatoren.
Um beispielsweise den gesamten HTTP-Datenverkehr von einer Quell-IP-Adresse 192.168.1.185 zu erfassen, würden Sie diesen Befehl verwenden:
sudo tcpdump -n src 192.168.1.185 and tcp port 80
Sie können auch Klammern verwenden, um komplexere Filter zu gruppieren und zu erstellen:
sudo tcpdump -n 'host 192.168.1.185 and (tcp port 80 or tcp port 443)'
Um Parsing-Fehler bei der Verwendung von Sonderzeichen zu vermeiden, schließen Sie die Filter in einfache Anführungszeichen ein.
Hier ist ein weiterer Beispielbefehl zum Erfassen des gesamten Datenverkehrs außer SSH von einer Quell-IP-Adresse 192.168.1.185:
sudo tcpdump -n src 192.168.1.185 and not dst port 22
Paketinspektion #
Standardmäßig tcpdump
, erfasst nur die Paketheader. Manchmal müssen Sie jedoch den Inhalt der Pakete überprüfen.
tcpdump
ermöglicht es Ihnen, den Inhalt der Pakete in ASCII und HEX auszudrucken.
Das -A
Option teilt tcpdump
mit um jedes Paket in ASCII und -x
zu drucken in HEX:
sudo tcpdump -n -A
Um den Inhalt des Pakets sowohl in HEX als auch in ASCII anzuzeigen, verwenden Sie -X
Möglichkeit:
sudo tcpdump -n -X
Lesen und Schreiben von Captures in eine Datei #
Eine weitere nützliche Funktion von tcpdump
ist, die Pakete in eine Datei zu schreiben. Dies ist praktisch, wenn Sie eine große Anzahl von Paketen erfassen oder Pakete für eine spätere Analyse erfassen.
Um mit dem Schreiben in eine Datei zu beginnen, verwenden Sie -w
Option gefolgt von der Ausgabe-Capture-Datei:
sudo tcpdump -n -w data.pcap
Dieser obige Befehl speichert die Erfassung in einer Datei mit dem Namen data.pcap
. Sie können die Datei nach Belieben benennen, aber es ist eine übliche Konvention, .pcap
zu verwenden Erweiterung (Paketerfassung).
Wenn das -w
Option verwendet wird, wird die Ausgabe nicht auf dem Bildschirm angezeigt. tcpdump
schreibt Rohpakete und erstellt eine Binärdatei, die nicht mit einem normalen Texteditor gelesen werden kann.
Um den Inhalt der Datei zu untersuchen, rufen Sie tcpdump
auf mit dem -r
Möglichkeit:
sudo tcpdump -r data.pcap
Wenn Sie tcpdump
ausführen möchten Fügen Sie im Hintergrund das kaufmännische Und-Symbol hinzu (&
) am Ende des Befehls.
Die Capture-Datei kann auch mit anderen Packet-Analyzer-Tools wie Wireshark untersucht werden.
Wenn Sie Pakete über einen längeren Zeitraum erfassen, können Sie die Dateirotation aktivieren. tcpdump
ermöglicht es Ihnen, neue Dateien zu erstellen und die Dump-Datei in einem bestimmten Zeitintervall oder einer festen Größe zu rotieren. Der folgende Befehl erstellt bis zu zehn 200-MB-Dateien mit dem Namen file.pcap0
, file.pcap1
, und so weiter:bevor ältere Dateien überschrieben werden.
sudo tcpdump -n -W 10 -C 200 -w /tmp/file.pcap
Sobald zehn Dateien generiert sind, werden die älteren Dateien überschrieben.
Bitte beachten Sie, dass Sie nur tcpdump
ausführen sollten nur während der Fehlerbehebung.
Wenn Sie tcpdump
starten möchten Zu einem bestimmten Zeitpunkt können Sie einen Cronjob verwenden. tcpdump
hat keine Möglichkeit, nach einer bestimmten Zeit zu beenden. Sie können das timeout
verwenden Befehl zum Stoppen von tcpdump
nach einiger Zeit. Um beispielsweise nach 5 Minuten zu beenden, würden Sie Folgendes verwenden:
sudo timeout 300 tcpdump -n -w data.pcap
Schlussfolgerung #
tcpdump
ist ein Befehlszeilentool zum Analysieren und Beheben von Netzwerkproblemen.
Dieser Artikel hat Sie in die Grundlagen von tcpdump
eingeführt Verwendung und Syntax. Eine ausführlichere Dokumentation finden Sie auf der tcpdump-Website.
Wenn Sie Fragen oder Feedback haben, können Sie gerne einen Kommentar hinterlassen.