tcpdump ist ein Befehlszeilendienstprogramm, mit dem wir den Netzwerkverkehr erfassen und analysieren können, der unser System durchläuft. Abhängig von den Filteroptionen können wir dieses Tool verwenden, um effektiv bei der Behebung von Netzwerkproblemen zu helfen. Es ist ein sehr häufig verwendetes Tool von Sysadmin-Ingenieuren für diese Funktionen.
In diesem Tutorial werden wir einige Verwendungsmöglichkeiten von tcpdump analysieren , aber nicht alles. Dies liegt daran, dass dieser Befehl einfach viel zu viele Filteroptionen umfasst und es nicht möglich ist, alle abzudecken. Wir werden hier nur einige der häufig verwendeten Optionen betrachten. Den Rest finden Sie auf der Manpage.
Tcpdump-Befehl installieren
Sie können überprüfen, ob Ihr System über den tcpdump
verfügt Befehl, indem Sie
tcpdump --version
Wenn die Ausgabe anzeigt, dass es nicht installiert ist, können Sie es direkt über den Paketmanager Ihres Systems abrufen.
HINWEIS :Da wir Pakete erfassen werden, benötigen wir erhöhte Berechtigungen. (sudo ist nötig). Wir werden allen tcpdump
voranstellen Befehle mit sudo
als Ergebnis.
Schnittstellen für die Paketerfassung auflisten
Bevor wir aktiv Pakete erfassen, schauen wir uns die verfügbaren Schnittstellen für tcpdump
an .
Wir können Schnittstellen mit dem -D auflisten (Anzeige)-Option.
sudo tcpdump -D
Sie erhalten eine Liste aller verfügbaren Schnittstellen auf Ihrer Maschine. Dies hängt von System zu System ab, daher hat meines einige andere Schnittstellen wie Docker , da der Docker-Dienst ausgeführt wird, abgesehen von typischen Netzwerkschnittstellen.
Die spezielle Schnittstelle beliebig ermöglicht das Erfassen in beliebigen aktive Schnittstelle.
Jetzt, da wir die verfügbaren Schnittstellen auf unserem Rechner kennen, können wir mit dem Erfassen von Paketen beginnen!
Pakete mit tcpdump erfassen
Erfassen Sie alle Pakete in beliebigen Schnittstelle, indem Sie diesen Befehl ausführen:
sudo tcpdump -i any
Dadurch wird die Schnittstelle als beliebig angegeben , die zuvor erwähnte spezielle Schnittstelle.
tcpdump fährt fort, Pakete zu erfassen, bis es eine Unterbrechung empfängt Signal. Sie können die Aufnahme unterbrechen, indem Sie Ctrl+C
drücken .
Die Ausgabe listet alle Paketerfassungen auf, bis das Interrupt-Signal empfangen wurde, um tcpdump
zu beenden .
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode listening on any, link-type LINUX_SLL (Linux cooked), capture size 262144 bytes 10:49:32.841984 IP 111.11.111.11.vultr.com.ssh > 123.45.678.90.48006: Flags [P.], seq 4132693749:4132693857, ack 3344962610, win 1002, options [nop,nop,TS val 135269404 ecr 1623818400], length 108 10:49:32.842057 IP 111.11.111.11.vultr.com.ssh > 123.45.678.90.48006: Flags [P.], seq 108:144, ack 1, win 1002, options [nop,nop,TS val 135269404 ecr 1623818400], length 36 10:49:32.842101 IP 111.11.111.11.vultr.com.ssh > 123.45.678.90.48006: Flags [P.], seq 144:260, ack 1, win 1002, options [nop,nop,TS val 135269404 ecr 1623818400], length 116 10:49:32.842135 IP 111.11.111.11.vultr.com.ssh > 123.45.678.90.48006: Flags [P.], seq 260:296, ack 1, win 1002, options [nop,nop,TS val 135269404 ecr 1623818400], length 36 ... ... ^C 264 packets captured 361 packets received by filter 91 packets dropped by kernel
Wie Sie sehen können, tcpdump
hatte 264 Pakete erfasst. Zum Beispiel, da ich mit ssh
mit diesem Server verbunden bin , tcpdump alle diese Pakete erfasst.
Anzahl der Paketerfassungen begrenzen
Um die Anzahl der erfassten Pakete zu begrenzen und tcpdump
zu stoppen verwenden Sie den -c
(Capture-Limit) Option:
sudo tcpdump -i any -c 2
Dies führt dazu, dass der Befehl tcpdump die Erfassung nach 2 Paketen automatisch beendet. In diesem Fall müssen wir nicht unbedingt das Interrupt-Signal verwenden, um es manuell zu beenden.
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode listening on any, link-type LINUX_SLL (Linux cooked), capture size 262144 bytes 10:57:31.284198 IP 111.11.111.11.vultr.com.ssh > 123.45.678.90.48006: Flags [P.], seq 4132754245:4132754353, ack 3344963698, win 1002, options [nop,nop,TS val 135747845 ecr 1624296856], length 108 10:57:31.284275 IP 111.11.111.11.vultr.com.ssh > 123.45.678.90.48006: Flags [P.], seq 108:144, ack 1, win 1002, options [nop,nop,TS val 135747845 ecr 1624296856], length 36 2 packets captured 16 packets received by filter 8 packets dropped by kernel
Diese Option kann bei der Überwachung von Netzwerkverbindungen für die Fehlersuche bei Netzwerkproblemen sehr nützlich sein.
Namens- und Portauflösung deaktivieren
Standardmäßig tcpdump Der Befehl löst IP-Adressen und Ports in Namen auf (z. B. vultr.com.ssh , die die Namensauflösung aus den IP-Adressen und Ports durchführt).
Bei der Behebung von Netzwerkproblemen ist es oft einfacher, die IP-Adressen und Portnummern zu verwenden; Wir können die Namensauflösung deaktivieren, indem wir die Option -n
verwenden und Portauflösung mit -nn
.
sudo tcpdump -i any -c 2 -nn
Der obige Befehl erfasst 2 Pakete auf jeder Schnittstelle, während die Portauflösung deaktiviert wird.
Die Ausgabe stoppt also jetzt jede Namensauflösung und gibt einfach die IP-Adressen und Portnummern zurück.
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode listening on any, link-type LINUX_SLL (Linux cooked), capture size 262144 bytes 11:00:36.459922 IP 111.11.111.11.22 > 123.45.678.90.48006: Flags [P.], seq 4132755513:4132755621, ack 3344963838, win 1002, options [nop,nop,TS val 135933020 ecr 1624482048], length 108 11:00:36.459982 IP 111.11.111.11.22 > 123.45.678.90.48006: Flags [P.], seq 108:144, ack 1, win 1002, options [nop,nop,TS val 135933020 ecr 1624482048], length 36 2 packets captured 8 packets received by filter 0 packets dropped by kernel
Lassen Sie uns hier eine Zeile der Ausgabe untersuchen.
11:00:36.459922 IP 111.11.111.11.22 > 123.45.678.90.48006: Flags [P.], seq 4132755513:4132755621, ack 3344963838, win 1002, options [nop,nop,TS val 135933020 ecr 1624482048], length 108
Dies ist ein typisches TCP Paketerfassung. Auf andere Protokollpakete und -formate kann in der Handbuchseite des Befehls tcpdump verwiesen werden.
Das erste Feld, 11:00:36.459922 , stellt den Zeitstempel des empfangenen Pakets gemäß der lokalen Uhr dar.
Als nächstes IP
stellt das Netzwerkschichtprotokoll dar – in diesem Fall IPv4
. Für IPv6
Pakete, der Wert ist IP6
.
Das nächste Feld, 111.11.111.11.22 , ist die Quell-IP-Adresse und der Port. Darauf folgen die Ziel-IP-Adresse und der Port, dargestellt durch 123.45.678.90.48006 .
Nachdem wir nun wissen, wie das grundlegende Ausgabeformat ist, wollen wir einige Filteroptionen für tcpdump
analysieren
Pakete filtern
Einer von tcpdump Die leistungsstärkste Funktion des Befehls ist seine Fähigkeit zum Filtern die erfassten Pakete mit einer Vielzahl von Parametern, wie z. B. Quell- und Ziel-IP-Adressen, Ports, Protokolle usw. Schauen wir uns einige der häufigsten an.
Nach Protokoll filtern
Um Pakete basierend auf dem Protokoll zu filtern, müssen wir das Protokoll im Befehl angeben.
Um ICMP zu erfassen Pakete, können wir basierend auf ICMP filtern Protokoll.
sudo tcpdump -i any -c 5 icmp
Seit dem ping
Befehl verwendet ICMP Pakete, können wir eingehende Pakete durch ping
analysieren von einem anderen Computer.
Lassen Sie uns unseren aktuellen Rechner pingen und die eingehenden Ping-Pakete erfassen.
Öffnen Sie eine Terminalsitzung auf einem anderen Computer und geben Sie
einping IP_ADDRESS_MACHINE_1
Jetzt in unserem tcpdump
Terminalsitzung können wir jetzt sehen, dass diese ICMP-Ping-Antwortpakete erfasst werden.
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode listening on any, link-type LINUX_SLL (Linux cooked), capture size 262144 bytes 11:18:47.947475 IP 123.45.678.90 > 111.11.111.11.vultr.com: ICMP echo request, id 6068, seq 1, length 64 11:18:47.947554 IP 111.11.111.11.vultr.com > 123.45.678.90: ICMP echo reply, id 6068, seq 1, length 64 11:18:48.947669 IP 123.45.678.90 > 111.11.111.11.vultr.com: ICMP echo request, id 6068, seq 2, length 64 11:18:48.947752 IP 111.11.111.11.vultr.com > 123.45.678.90: ICMP echo reply, id 6068, seq 2, length 64 11:18:49.947853 IP 123.45.678.90 > 111.11.111.11.vultr.com: ICMP echo request, id 6068, seq 3, length 64 5 packets captured 6 packets received by filter 0 packets dropped by kernel
Hier ist 123.45.678.90 die IP-Adresse der Maschine (Maschine 2), die einen Ping an unseren tcpdump
sendet System und 111.11.111.11 ist die IP-Adresse der Paketfiltermaschine (Maschine 1).
Da ich ssh
verwendet habe Um die Ping-Anfragen zu senden, gibt es eine Domänenauflösung (aber keine Namensauflösung) zu vultr.com
.
Nach Host filtern
Um die Erfassung nur auf Pakete zu beschränken, die sich auf einen bestimmten Host beziehen, können wir den host
verwenden filtern
sudo tcpdump -i any -c5 -nn host 192.168.1.2
In diesem Beispiel tcpdump erfasst und zeigt nur Pakete zu und von Host 192.168.1.2
an .
Nach Port filtern
Um Pakete basierend auf dem gewünschten Dienst oder Port zu filtern, verwenden Sie den port
Filter. Erfassen Sie beispielsweise Pakete, die sich auf eine SSH-Sitzung beziehen, indem Sie diesen Befehl verwenden (Port 22 filtern):
sudo tcpdump -i any -c5 -nn port 22
Filter basierend auf Quell-IP/Hostname
Sie können Pakete auch basierend auf der Quell- oder Ziel-IP-Adresse oder dem Hostnamen filtern. Zum Beispiel, um Pakete von Host 192.168.1.2
zu erfassen
sudo tcpdump -i any -c 5 -nn src 192.168.1.2
Wir können dst
verwenden um auch nach Ziel-IP/Hostname zu filtern.
sudo tcpdump -i any -c 5 -nn src 172.168.1.2
Paketerfassungen speichern
Wir können die Ergebnisse der Paketerfassung in einer Datei zur späteren Analyse speichern.
Um Pakete in einer Datei zu speichern, anstatt sie auf dem Bildschirm anzuzeigen, verwenden Sie die Option -w
:
sudo tcpdump -i any -c 5 -nn -w sample.pcap port 22
Dieser Befehl speichert die Ausgabe in einer Datei namens sample.pcap
. Die .pcap
die Erweiterung steht für „Packet Capture“ und ist die Konvention für dieses Dateiformat.
Schlussfolgerung
In diesem Tutorial haben wir gelernt, wie wir die Paketerfassung und -filterung basierend auf verschiedenen Optionen mit tcpdump
durchführen können Befehl.