Grundlegende Fähigkeiten zur Linux-Netzwerkanalyse: tcpdump detaillierte Erklärung des tatsächlichen Kampfes

Grundlegende Fähigkeiten zur Linux-Netzwerkanalyse: tcpdump detaillierte Erklärung des tatsächlichen Kampfes

Liang Xu Linux  Gestern

Der folgende Artikel stammt aus der Programmierleistung, die vom Programmierer Chopin verfasst wurde

Programmierleistung

Programmierleistung

Der Autor beschäftigt sich seit vielen Jahren mit der Entwicklung von Linux-Systemen. Der offizielle Account enthält hauptsächlich Artikel zu Linux-Systemen, Algorithmen, Netzwerken, qualitativ hochwertiger Programmierung usw. Willkommen zu folgen!

 

Bild

Bild

Was ich heute mitteilen möchte, ist,  tcpdumpdass es ein besonders nützliches Netzwerkwerkzeug im Linux-System ist. Es wird normalerweise zur Fehlerdiagnose und Netzwerkanalyse verwendet und hat sehr leistungsfähige Funktionen.

Im Vergleich zu anderen Linux-Tools ist es tcpdump kompliziert. Natürlich empfehle ich Ihnen nicht, alles zu lernen. Das Anwenden des Gelernten ist der Schlüssel zur Lösung von Problemen in Ihrer Arbeit.

Dieser Artikel beginnt mit den Anwendungsszenarien und Grundprinzipien , bietet eine Fülle von praktischen Fällen und ermöglicht es Ihnen, schnell  tcpdump die wichtigsten Verwendungsmethoden zu verstehen, die den Anforderungen der täglichen Arbeit entsprechen.

Anwendungsszenarien

Viele Netzwerkprobleme, die bei der täglichen Arbeit auftreten, können mit tcpdump elegant gelöst werden:

1. Ich  glaube, dass die meisten Schüler auf eine langsame SSH-Verbindung zum Server gestoßen sind. Durch das Erfassen von Paketen mit tcpdump können Sie die spezifische Ursache schnell finden, normalerweise weil die DNS-Auflösung zu langsam ist.

2.  Wenn unsere Ingenieure und Benutzer über Netzwerkprobleme streiten, können wir die Fehlerursache schnell lokalisieren, indem wir Pakete über tcpdump erfassen, was es einfach und stressfrei macht.

3.  Wenn unser neu entwickeltes Netzwerkprogramm nicht wie erwartet funktioniert, sammeln Sie relevante Datenpakete über tcpdump, analysieren Sie die spezifischen Gründe auf Paketebene und lösen Sie das Problem.

4.  Wenn die Leistung unseres Netzwerkprogramms relativ niedrig ist, analysieren Sie mit tcpdump die Eigenschaften des Datenstroms und kombinieren Sie die relevanten Protokolle, um die Netzwerkparameter zu optimieren und die Netzwerkleistung des Systems zu verbessern.

5.  Wenn wir Netzwerkprotokolle lernen, verwenden wir tcpdump, um Pakete zu erfassen und das Protokollformat zu analysieren, damit wir Netzwerkprotokolle intuitiver, effektiver und schneller lernen können.

Das Obige ist nur eine einfache Liste mehrerer gängiger Anwendungsszenarien, und tcpdump ist in der Tat ein sehr leistungsfähiges Netzwerkwerkzeug in Bezug auf Netzwerkdiagnose, Netzwerkoptimierung und Protokolllernen. Solange es Netzwerkprobleme gibt, können Sie es immer sehen.

Der geschickte Einsatz  tcpdumpkann uns helfen, verschiedene Netzwerkprobleme in unserer Arbeit zu lösen. Lassen Sie uns im Folgenden kurz lernen, wie dies funktioniert.

Arbeitsprinzip

tcpdump ist ein sehr nützliches Netzwerkwerkzeug im Linux-System. Es wird im Benutzermodus ausgeführt und  implementiert im Wesentlichen die Datenpaketerfassungsfunktion durch Aufrufen  libpcap verschiedener Bibliotheken  api.

Bild

Aus der obigen Abbildung können wir intuitiv erkennen, dass das Datenpaket, nachdem es auf der Netzwerkkarte angekommen ist, vom Datenpaketfilter (BPF) gefiltert und zur anschließenden Verarbeitung, Ausgabe oder Speicherung durch den tcpdump in das Programm tcpdump im Benutzermodus kopiert wird Tool. Zur pcap-Datei.

Die Hauptfunktion des Datenpaketfilters (BPF) besteht darin, nur die Datenpakete zu kopieren, die der Benutzer gemäß den vom Benutzer eingegebenen Filterregeln tcpdump ausführen möchte, wodurch unnötiges Kopieren von Datenpaketen und der durch Pakete verursachte Leistungsverlust verringert werden können Erfassung.

Denken : hier, um eine echte Interviewfrage zu teilen

Interviewer: Wenn einige Datenpakete von iptables blockiert werden, können sie von tcpdump erfasst werden?

Durch das obige Bild können wir diese Frage leicht beantworten.

Da das Linux-System  netfilter in der Protokollstapelphase arbeitet, arbeitet der tcpdump-Filter (BPF) vor dem Protokollstapel, sodass das Paket natürlich erfasst werden kann!

Nachdem wir die Grundprinzipien von tcpdump verstanden haben, gehen wir direkt zum eigentlichen Kampf!

Tatsächlicher Kampf: Grundnutzung

Wir führen zunächst die grundlegende Verwendung von tcpdump anhand einiger einfacher Beispiele ein.

1.  Ohne Parameter werden standardmäßig alle Datenpakete auf der ersten Nicht-Lo-Netzwerkkarte erfasst

$ tcpdump 

2.   Holen Sie sich alle Pakete auf der eth0-Netzwerkkarte

$ tcpdump -i eth0

3.  Geben Sie beim Erfassen von Paketen -n Optionen an  und lösen Sie Host- und Portnamen nicht auf. Dieser Parameter ist sehr kritisch und wirkt sich auf die Leistung der Paketerfassung aus. Im Allgemeinen müssen Sie diese Option beim Erfassen von Paketen angeben.

$ tcpdump -n -i eth0

4.   Holen Sie sich 192.168.1.100 alle Datenpakete des angegebenen Hosts  

$ tcpdump -ni eth0 host 192.168.1.100

5.  Holen Sie sich 10.1.1.2 das vom angegebenen Host  gesendete Datenpaket

$ tcpdump -ni eth0 src host 10.1.1.2

6.  Holen Sie sich 10.1.1.2 alle Pakete, an die gesendet wurde 

$ tcpdump -ni eth0 dst host 10.1.1.2

7.  Holen Sie sich die Datenpakete, die an den angegebenen Host auf der eth0-Netzwerkkarte gesendet wurden, und stoppen Sie, wenn 10 Pakete abgefangen werden. Dieser Parameter wird auch häufig verwendet

$ tcpdump -ni eth0 -c 10 dst host 192.168.1.200

8.  Holen Sie sich alle SSH-Anforderungspakete auf der eth0-Netzwerkkarte. Der Standard-SSH-Port ist 22

$ tcpdump -ni eth0 dst port 22

9.  Nehmen Sie 5 Ping-Pakete auf die eth0-Netzwerkkarte

$ tcpdump -ni eth0 -c 5 icmp

10.  Holen Sie sich alle Arp-Pakete auf der eth0-Netzwerkkarte

$ tcpdump -ni eth0 arp

11.  Verwenden Sie die hexadezimale Ausgabe. Wenn Sie überprüfen möchten, ob ein Problem mit dem Inhalt des Datenpakets vorliegt, ist die hexadezimale Ausgabe sehr hilfreich.

$ tcpdump -ni eth0 -c 1 arp -X
listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes
12:13:31.602995 ARP, Request who-has 172.17.92.133 tell 172.17.95.253, length 28
    0x0000:  0001 0800 0604 0001 eeff ffff ffff ac11  ................
    0x0010:  5ffd 0000 0000 0000 ac11 5c85            _.........\.

12.  Erfassen Sie nur IPv6-Verkehr auf der eth0-Netzwerkkarte

$ tcpdump -ni eth0 ip6

13.  Erfassen Sie den Datenverkehr des angegebenen Portbereichs

$ tcpdump -ni eth0 portrange 80-9000

14.  Erfassen Sie den Datenverkehr des angegebenen Netzwerksegments

$ tcpdump -ni eth0 net 192.168.1.0/24

Tatsächlicher Kampf: Fortgeschrittene Fortgeschrittene

Die leistungsstarke Funktion und die flexible Strategie von tcpdump spiegeln sich hauptsächlich in der leistungsstarken Ausdruckskombinationsfähigkeit des Filters (BPF) wider.

In diesem Abschnitt werden hauptsächlich einige gängige so genannte erweiterte Verwendungszwecke erläutert. Ich hoffe, die Leser können daraus Rückschlüsse ziehen und sie entsprechend ihren tatsächlichen Anforderungen flexibel verwenden.

1.  Holen Sie sich das Datenpaket des angegebenen Clients, der auf ssh zugreift

$ tcpdump -ni eth0 src 192.168.1.100 and dst port 22

2.  Holen Sie sich den Datenverkehr von einem bestimmten Netzwerksegment zu einem bestimmten Netzwerksegment

$ tcpdump -ni eth0 src net 192.168.1.0/16 and dst net 10.0.0.0/8 or 172.16.0.0/16

3.  Nehmen Sie den Datenverkehr von einem Host zu einem Nicht-SSH-Port auf

$ tcpdump -ni eth0 src 10.0.2.4 and not dst port 22

4.  Wenn Sie komplexe Abfragen erstellen, müssen Sie möglicherweise Anführungszeichen verwenden. Einzelne Anführungszeichen () weisen tcpdump an, bestimmte Sonderzeichen zu ignorieren. Hier  sind Sonderzeichen. Wenn Sie keine Anführungszeichen benötigen, müssen Sie Escapezeichen verwenden.

$ tcpdump -ni eth0 'src 10.0.2.4 and (dst port 3389 or 22)'

5.  Filtern Sie basierend auf der Paketgröße. Wenn Sie eine bestimmte Paketgröße anzeigen, können Sie diesen Parameter verwenden

Weniger als oder gleich 64 Bytes:

$ tcpdump -ni less 64

64 Bytes oder mehr:

$ tcpdump -ni eth0 greater 64

Entspricht 64 Bytes:

$ tcpdump -ni eth0 length == 64

6.  Filtern Sie speziell gekennzeichnete TCP-Pakete

Holen Sie sich ein RST Datenpaket, das von einem Host gesendet wurde  :

$ tcpdump -ni eth0 src host 192.168.1.100 and 'tcp[tcpflags] & (tcp-rst) != 0'

Holen Sie sich ein SYN Datenpaket, das von einem Host gesendet wurde  :

$ tcpdump -ni eth0 src host 192.168.1.100 and 'tcp[tcpflags] & (tcp-syn) != 0'

Holen Sie sich ein FIN Datenpaket, das von einem Host gesendet wurde  :

$ tcpdump -ni eth0 src host 192.168.1.100 and 'tcp[tcpflags] & (tcp-fin) != 0'

Holen Sie sich das SYN ODER-  FIN Paket in der TCP-Verbindung 

$ tcpdump 'tcp[tcpflags] & (tcp-syn|tcp-fin) != 0'

7.  Holen Sie sich alle Nicht-Ping-  ICMP Pakete

$ tcpdump 'icmp[icmptype] != icmp-echo and icmp[icmptype] != icmp-echoreply'

8. Der  Erfassungsport ist 80, das Netzwerkschichtprotokoll ist IPv4 und enthält Daten anstelle von SYN, FIN, ACK und anderen Nicht-Datenpaketen

$ tcpdump 'tcp port 80 and (((ip[2:2] - ((ip[0]&0xf)<<2)) - ((tcp[12]&0xf0)>>2)) != 0)'

Erklären Sie diesen komplizierten Ausdruck. Die spezifische Bedeutung ist, dass die Länge des gesamten IP-Datenpakets abzüglich der Länge des IP-Headers und dann die Länge des TCP-Headers. Wenn das Ergebnis nicht 0 ist, bedeutet dies, dass ein Datenpaket vorhanden ist  data. wenn Sie es noch nicht verstehen, müssen Sie es tun machen Sie sich die oben  tcp/ipVereinbarung

9.  Rufen Sie die HTTP-Nachricht ab, bei der 0x4754 es sich um  GET den Wert 0x4854 der HTTP ersten beiden Zeichen und den Wert der  ersten beiden Zeichen handelt

$ tcpdump  -ni eth0 'tcp[20:2]=0x4745 or tcp[20:2]=0x4854'

Allgemeine Optionen

Durch die oben genannten praktischen Fälle glaube ich, dass jeder die tcpdump grundlegende Verwendung beherrscht  . Hier ist eine detaillierte Zusammenfassung der häufig verwendeten Optionsparameter.

(1) Grundlegende Optionen

  • -i: Geben Sie die Schnittstelle an

  • -D: Listen Sie die Schnittstellen auf, die zum Erfassen von Paketen verwendet werden können

  • -s: Geben Sie die Länge der Paketerfassung an

  • -c: Geben Sie die Anzahl der zu erfassenden Pakete an

  • -w: Speichern Sie die erfassten Daten in einer Datei

  • -r: Lesen Sie Daten aus der Datei

  • -C: Geben Sie die Dateigröße an und  -w verwenden Sie sie in Verbindung mit

  • -F: Lesen Sie den Ausdruck des erfassten Pakets aus der Datei

  • -n: Lösen Sie die Host- und Portnummer nicht auf. Dieser Parameter ist sehr wichtig und muss im Allgemeinen hinzugefügt werden

  • -P: In fließt Grabbelsack Bestimmt oder des Beutels, können Sie den Wert angeben  in, out,inout

(Zwei) Ausgabeoptionen

  • -e: Die Ausgabeinformationen enthalten die Headerinformationen der Datenverbindungsschicht

  • -t: Zeitstempel tttt anzeigen, detailliertere Zeit anzeigen

  • -X: Hexadezimalformat anzeigen

  • -v:  Zeigen Sie detaillierte Nachrichteninformationen an. Versuchen Sie  -vvv, je vmehr Sie anzeigen, desto detaillierter

Ausdruck filtern

Die leistungsstarke Funktion und die flexible Strategie von tcpdump spiegeln sich hauptsächlich in der leistungsstarken Ausdruckskombinationsfähigkeit des Filters (BPF) wider.

(1) Operationsobjekt

Folgende Objekte können in Ausdrücken bearbeitet werden:

  • typeGibt den Typ des Objekts, wie zum hostBeispiel: net, port,, portrange, wenn Sie keinen Typ angeben, wird der Standardwert ist der Host

  • dir: Gibt die Übertragungsrichtung an, die bevorzugten Methoden sind: src, dst.

  • proto: Protokoll, das Fakultativprotokoll etherist: ip, ip6, arp, icmp, tcp, udp,.

(2) Bedingungskombination

Zwischen Objekten auch nach Stichwort ausgedrückt werden können  and, or, not verbunden sind mächtigen Ausdruck zu bilden.

  • or: Mittel oder Betrieb

  • and: Darstellung und Bedienung

  • not: Zeigt an, dass keine Bedienung erfolgt

Es wird empfohlen, dass Sie, nachdem Sie dies gesehen haben, einen Blick zurück werfen und die Beispiele im eigentlichen Kampfkapitel betrachten. Ich glaube, dass es ein tieferes Verständnis geben wird. Wenn dies der Fall ist, habe ich den gewünschten Effekt erzielt!

Erfahrung

Hier werden keine neuen Wissenspunkte hinzugefügt und einige in der Arbeit zusammengefasste Erfahrungen werden geteilt:

1.  Wir müssen wissen, dass es  tcpdump kein Allheilmittel ist und nicht alle Netzwerkprobleme lösen kann.

2.  In Szenarien mit hohem Datenverkehr kann die Paketerfassung die Systemleistung beeinträchtigen. Wenn Sie sich in einer Produktionsumgebung befinden, verwenden Sie diese bitte mit Vorsicht!

3.  In stark frequentierten Szenarien ist es tcpdump nicht für Verkehrsstatistiken geeignet. Bei Bedarf können Sie die Statistik mithilfe der Switch-Spiegelung analysieren.

4. Die  Verwendung der tcpdump Paketerfassung unter Linux  in Kombination mit  wireshark Tools zur Datenanalyse kann mit halbem Aufwand das doppelte Ergebnis erzielen.

5.  Versuchen Sie beim Erfassen von Paketen, keine any Schnittstellen zu verwenden, um Pakete so oft wie möglich zu erfassen  .

6. Geben Sie beim  Erfassen von Paketen so weit wie möglich detaillierte Ausdrücke zum Filtern von Datenpaketen an, um die Kopie nutzloser Datenpakete zu reduzieren.

7.  Versuchen Sie beim Erfassen von Paketen, -n Optionen anzugeben  , um den durch die Analyse von Host und Port verursachten Leistungsaufwand zu verringern.

Zu guter Letzt

Durch den obigen Inhalt wissen wir, dass tcpdump ein leistungsstarkes Tool zur Fehlerdiagnose und Netzwerkanalyse ist. In unserer täglichen Arbeit können Netzwerkprobleme immer mit tcpdump gelöst werden.

Tcpdump ist jedoch viel komplizierter als andere Linux-Befehle, aber angesichts der Anziehungskraft seiner leistungsstarken Funktionen lohnt es sich für uns, etwas mehr Zeit zu verbringen. Um tcpdump gut zu beherrschen, müssen Sie TCP/IPein gewisses Verständnis für Netzwerknachrichten ( Protokolle) haben.

Ich denke du magst

Origin blog.csdn.net/wzlsunice88/article/details/114022283
Empfohlen
Rangfolge