GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Linux tcpdump Command Tutorial für Anfänger (8 Beispiele)

Jedes Mal, wenn Sie eine Webseite auf Ihrem Computer öffnen, werden Datenpakete an Ihre Netzwerkschnittstelle gesendet und empfangen. Manchmal ist die Analyse dieser Pakete aus vielen Gründen wichtig. Glücklicherweise bietet Linux ein Befehlszeilenprogramm, das Informationen zu diesen Datenpaketen in der Ausgabe ausgibt.

In diesem Artikel besprechen wir die Grundlagen des betreffenden Tools - tcpdump . Aber bevor wir das tun, ist es erwähnenswert, dass alle Beispiele hier auf einem Ubuntu 18.04 LTS-Rechner und auf Debian 10 getestet wurden, aber es wird auch auf anderen Linux-Distributionen wie CentOS, Fedora, Gentoo und Arch Linux funktionieren.

Linux tcpdump-Befehl

Mit dem Befehl tcpdump in Linux können Sie Datenverkehr in einem Netzwerk ausgeben. Es folgt kurz die Syntax:

tcpdump [OPTIONS]

Hier ist die detaillierte Syntax:

tcpdump [ -AbdDefhHIJKlLnNOpqStuUvxX# ] [ -B buffer_size ]
               [ -c count ]
               [ -C file_size ] [ -G rotate_seconds ] [ -F file ]
               [ -i interface ] [ -j tstamp_type ] [ -m module ] [ -M secret ]
               [ --number ] [ -Q in|out|inout ]
               [ -r file ] [ -V file ] [ -s snaplen ] [ -T type ] [ -w file ]
               [ -W filecount ]
               [ -E [email protected] algo:secret,...  ]
               [ -y datalinktype ] [ -z postrotate-command ] [ -Z user ]
               [ --time-stamp-precision=tstamp_precision ]
               [ --immediate-mode ] [ --version ]
               [ expression ]

Und so erklärt es die Manpage des Tools:

Tcpdump prints out a description of the contents of packets on a network interface that match the 
boolean expression; the description is preceded by a time stamp, printed, by default, as hours,
minutes, seconds, and fractions of a second  since  midnight.  

It can  also  be  run with the -w flag, which causes it to save the packet data to a file for
later analysis, and/or with the -r flag, which causes it to read from a saved packet file rather
than to read packets from a network interface.  It can also be run with the -V  flag,  which causes
it to read a list of saved packet files.

In all cases, only packets that match expression will be processed by tcpdump.

Im Folgenden finden Sie einige Beispiele im Q&A-Stil, die Ihnen eine bessere Vorstellung davon vermitteln sollen, wie der Befehl tcpdump funktioniert.

Q1. Wie benutzt man tcpdump?

Bevor Sie tcpdump zum Sniffen von Datenpaketen verwenden, sollten Sie idealerweise wissen, auf welcher Netzwerkschnittstelle das Tool arbeiten soll. Verwenden Sie für eine Liste der auf dem System verfügbaren Netzwerkschnittstellen die Befehlszeilenoption -D mit tcpdump.

tcpdump -D

So erklärt die Manpage diese Option:

Print the list of the network interfaces available on the system and on which tcpdump can capture 
packets. For each network interface, a number and an interface name, possibly followed by a text
description of the interface, is printed. The interface name or the number can be supplied to the
-i flag to specify an interface on which to capture.

This can be useful on systems that don't have a command to list them (e.g., Windows systems, or
UNIX systems lacking  ifconfig -a); the number can be useful on Windows 2000 and later systems,
where the interface name is a somewhat complex string.

The  -D  flag  will not be supported if tcpdump was built with an older version of libpcap that
lacks the pcap_findalldevs() function.

In meinem Fall wurde beispielsweise die folgende Ausgabe erzeugt:

1.wlx18a6f713679b [Up, Running]
2.any (Pseudo-device that captures on all interfaces) [Up, Running]
3.lo [Up, Running, Loopback]
4.enp3s0 [Up]
5.nflog (Linux netfilter log (NFLOG) interface)
6.nfqueue (Linux netfilter queue (NFQUEUE) interface)
7.usbmon1 (USB bus number 1)
8.usbmon2 (USB bus number 2)
9.usbmon3 (USB bus number 3)
10.usbmon4 (USB bus number 4)

Nachdem Sie nun eine Liste von Schnittstellen haben, können Sie eine auswählen und ihren Namen als Eingabe an die Befehlszeilenoption -i von tcpdump übergeben. Zum Beispiel:

tcpdump -i wlx18a6f713679b

Das Folgende ist ein Teil der Ausgabe, die in meinem Fall von diesem Befehl erzeugt wird:

tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on wlx18a6f713679b, link-type EN10MB (Ethernet), capture size 262144 bytes
11:53:11.408964 IP 192.168.2.132.52898 > 239.255.255.250.3702: UDP, length 656
11:53:11.409492 IP himanshu.57383 > one.one.one.one.domain: 8572+ [1au] PTR? 250.255.255.239.in-addr.arpa. (57)
11:53:11.409588 IP 192.168.2.140.49690 > 239.255.255.250.1900: UDP, length 174
11:53:11.409954 IP 192.168.2.147.mdns > 224.0.0.251.mdns: 1 [2q] PTR (QU)? _%9E5E7C8F47989526C9BCD95D24084F6F0B27C5ED._sub._googlecast._tcp.local. PTR (QU)? _googlecast._tcp.local. (94)
11:53:11.499220 IP one.one.one.one.domain > himanshu.57383: 8572 NXDomain 0/1/1 (114)
11:53:11.499950 IP himanshu.34201 > one.one.one.one.domain: 12068+ [1au] PTR? 132.2.168.192.in-addr.arpa. (55)
11:53:11.591291 IP one.one.one.one.domain > himanshu.34201: 12068 NXDomain* 0/1/2 (278)
11:53:11.592195 IP himanshu.55501 > one.one.one.one.domain: 31630+ [1au] PTR? 1.1.1.1.in-addr.arpa. (49)
11:53:11.842603 IP himanshu.57253 > one.one.one.one.domain: 16905+ [1au] PTR? 140.2.168.192.in-addr.arpa. (55)
11:53:11.951226 IP himanshu.52662 > one.one.one.one.domain: 52377+ [1au] PTR? 251.0.0.224.in-addr.arpa. (53)
11:53:12.428931 IP 192.168.2.140.49690 > 239.255.255.250.1900: UDP, length 174
11:53:12.437905 IP 192.168.2.147.mdns > 224.0.0.251.mdns: 2 [2q] PTR (QM)? _%9E5E7C8F47989526C9BCD95D24084F6F0B27C5ED._sub._googlecast._tcp.local. PTR (QM)? _googlecast._tcp.local. (94)
11:53:12.438730 IP6 fe80::eccc:59f2:fc78:9e07.52899 > ff02::c.3702: UDP, length 656
11:53:12.439017 IP himanshu.33194 > one.one.one.one.domain: 15679+ [1au] PTR? c.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.2.0.f.f.ip6.arpa. (101)
11:53:12.572386 IP one.one.one.one.domain > himanshu.33194: 15679 NXDomain 0/1/1 (165)
11:53:12.642129 IP 192.168.2.11.mdns > 224.0.0.251.mdns: 0*- [0q] 1/0/3 PTR Google-Home-Mini-e3a3ae72a03e3d1c60d24653d4666ca6._googlecast._tcp.local. (356)
...
...

Q2. Wie lässt sich tcpdump beenden, nachdem eine festgelegte Anzahl von Paketen empfangen wurde?

Dies kann mit der Befehlszeilenoption -c erreicht werden. Wenn Sie beispielsweise möchten, dass tcpdump nur Informationen zu 10 Paketen anzeigt, können Sie dies folgendermaßen tun:

tcpdump -c 10

In meinem Fall habe ich beispielsweise den folgenden Befehl ausgeführt:

tcpdump -c 10 -i wlx18a6f713679b

Es folgt die erzeugte Ausgabe:

Sie können also sehen, dass 10 Pakete erfasst wurden.

Q3. Wie bringt man tcpdump dazu, den Link-Level-Header in der Ausgabe anzuzeigen?

Dies kann mit der Befehlszeilenoption -e erfolgen. Zum Beispiel:

tcpdump -e -i wlx18a6f713679b

Und hier ist die erzeugte Ausgabe:

listening on wlx18a6f713679b, link-type EN10MB (Ethernet), capture size 262144 bytes
12:14:07.951396 3c:a8:2a:a7:7b:c1 (oui Unknown) > Broadcast, ethertype IPv4 (0x0800), length 197: 192.168.2.55.17500 > 255.255.255.255.17500: UDP, length 155
12:14:07.952111 3c:a8:2a:a7:7b:c1 (oui Unknown) > Broadcast, ethertype IPv4 (0x0800), length 197: 192.168.2.55.17500 > 192.168.2.255.17500: UDP, length 155
...
...

Sie können also sehen, dass in der Ausgabe Header auf Link-Ebene erzeugt wurden.

Q4. Wie lässt sich tcpdump dazu bringen, fremde IP-Adressen numerisch anzuzeigen?

Dies kann mit der Befehlszeilenoption -f erreicht werden.

tcpdump -f -i [INTERFACE]

Dass tcpdump „fremde“ IPv4-Adressen numerisch statt symbolisch anzeigt, hat in bestimmten Situationen seine Vorteile. Ein solches Beispiel wird in der Manpage des Tools erwähnt:

this option is intended to get around serious brain damage in Sun's NIS server — usually it hangs 
forever translating non-local internet numbers

Q5. Wie bringt man tcpdump dazu, Paketnummern in der Ausgabe zu erzeugen?

Um tcpdump Paketnummern in der Ausgabe erzeugen zu lassen, verwenden Sie --number Befehlszeilenoption.

Zum Beispiel habe ich den folgenden Befehl ausgeführt:

tcpdump --number -i wlx18a6f713679b

Und hier ist ein Teil der produzierten Ausgabe:

listening on wlx18a6f713679b, link-type EN10MB (Ethernet), capture size 262144 bytes
    1  12:38:35.522944 ARP, Request who-has 192.168.2.196 tell _gateway, length 46
    2  12:38:35.523265 IP6 fe80::8ab4:a6ff:fe9d:a6bb > ff02::16: HBH ICMP6, multicast listener report v2, 1 group record(s), length 28
    3  12:38:35.523578 IP6 fe80::8ab4:a6ff:fe9d:a6bb > ip6-allrouters: ICMP6, router solicitation, length 16
    4  12:38:35.523861 ARP, Request who-has 192.168.2.15 tell 192.168.2.170, length 28
...
...
...

So können Sie sehen, dass jede Zeile jetzt mit einer Zahl beginnt.

Q6. Wie bringt man tcpdump dazu, kürzere Ausgaben zu drucken?

Dies kann mit der Befehlszeilenoption -q erfolgen. So erklärt es die Manpage des Tools:

Quick (quiet?) output.  Print less protocol information so output lines are shorter.

Nachfolgend ein Beispiel für diese Option:

Sie können also sehen, dass diesmal weniger Informationen in der Ausgabe erzeugt wurden.

Q7. Wie lässt man Zeitstempelinformationen aus der Ausgabe von tcpdump weg?

Verwenden Sie dazu die Befehlszeilenoption -t. Hier ist ein Beispielbefehl:

tcpdump -t -i wlx18a6f713679b

Und das Folgende ist die Ausgabe:

listening on wlx18a6f713679b, link-type EN10MB (Ethernet), capture size 262144 bytes
IP himanshu.56992 > mails11.telegram.org.https: Flags [.], ack 3090054317, win 965, options [nop,nop,TS val 226976758 ecr 3781653930], length 0
IP himanshu.41122 > one.one.one.one.domain: 12755+ [1au] PTR? 22.171.154.149.in-addr.arpa. (56)
IP mails11.telegram.org.https > himanshu.56824: Flags [.], ack 273652159, win 1001, options [nop,nop,TS val 3781656472 ecr 226966324], length 0
ARP, Request who-has 192.168.2.48 tell _gateway, length 46
ARP, Request who-has 192.168.2.135 tell _gateway, length 46
...
...

Sie können also sehen, dass Zeitstempelinformationen (die normalerweise am Anfang jeder Zeile stehen) jetzt nicht in der Ausgabe vorhanden sind.

Q8. Wie bringt man tcpdump dazu, eine detaillierte Ausgabe zu erzeugen?

Sie können in diesem Fall die Befehlszeilenoption -v verwenden. Im Folgenden wird diese Option in der Manpage des Tools erklärt:

tcpdump -v -i [INTERFACE]
When parsing and printing, produce (slightly more) verbose output. For example, the time to live,
identification, total length and options in an IP packet are printed. Also enables additional
packet integrity checks such as verifying the IP and ICMP header checksum.

When writing to a file with the -w option, report, every 10 seconds, the number of packets captured

Schlussfolgerung

Wir haben hier nur an der Oberfläche gekratzt, da der Befehl tcpdump viele Befehlszeilenoptionen bietet. Sobald Sie mit dem Üben fertig sind, können Sie zur Manpage des Tools gehen, um mehr darüber zu erfahren.


Linux
  1. Linux-CD-Befehls-Tutorial für Anfänger (8 Beispiele)

  2. Linux-Kommando-Tutorial für Anfänger (5 Beispiele)

  3. Linux-df-Befehls-Tutorial für Anfänger (8 Beispiele)

  4. Linux Date Command Tutorial für Anfänger (8 Beispiele)

  5. Linux-Hostname-Befehls-Tutorial für Anfänger (5 Beispiele)

Linux Who Command Tutorial für Anfänger (8 Beispiele)

Linux nl Command Tutorial für Anfänger (7 Beispiele)

Linux-nm-Befehls-Tutorial für Anfänger (10 Beispiele)

Linux OD Command Tutorial für Anfänger (6 Beispiele)

Linux w Command Tutorial für Anfänger (5 Beispiele)

Linux ss Command Tutorial für Anfänger (8 Beispiele)