Πώς να καταγράψετε και να αναλύσετε την κίνηση δικτύου με το tcpdump;

Το tcpdump είναι ένα καταπληκτικό εργαλείο γραμμής εντολών για σάρωση δικτύου. Είναι ένα βιομηχανικό πρότυπο για τη λήψη και την ανάλυση πακέτων TCP/IP.

Το εργαλείο tcpdump μπορεί να βοηθήσει πολύ κατά την επίλυση προβλημάτων δικτύωσης. Τα πακέτα μπορούν να αποθηκευτούν σε ένα αρχείο και να αναλυθούν αργότερα. Είναι καλή ιδέα να εκτελείτε αυτό το εργαλείο περιστασιακά για να παρακολουθείτε το δίκτυό σας.

Πώς μοιάζει η έξοδος tcpdump;

tcpdump σας επιτρέπει να εξετάσετε τις κεφαλίδες των πακέτων TCP/IP. Εκτυπώνει μία γραμμή για κάθε πακέτο και η εντολή συνεχίζει να εκτελείται μέχρι να πατήσετε Ctrl+C για τερματισμό.

Ας εξετάσουμε μια γραμμή από ένα παράδειγμα εξόδου:

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

Κάθε γραμμή περιλαμβάνει

  • Χρονική σήμανση Unix (20:58:26.765637)
  • πρωτόκολλο (IP)
  • το όνομα κεντρικού υπολογιστή προέλευσης ή η IP και ο αριθμός θύρας (10.0.0.50.80)
  • όνομα κεντρικού υπολογιστή προορισμού ή IP και αριθμός θύρας (10.0.0.1.53181)
  • Σημαίες TCP (Σημαίες [F.]). Οι σημαίες υποδεικνύουν την κατάσταση της σύνδεσης. Αυτό μπορεί να περιλαμβάνει περισσότερες από μία τιμές, όπως σε αυτό το παράδειγμα [F.] για FIN-ACK. Αυτό το πεδίο μπορεί να έχει τις ακόλουθες τιμές:
    • Σ – ΣΥΝ. Το πρώτο βήμα για τη δημιουργία της σύνδεσης.
    • F – FIN. Τερματισμός σύνδεσης.
    • . – ACK. Το πακέτο επιβεβαίωσης ελήφθη με επιτυχία.
    • P – ΩΘΗΣΗ. Λέει στον δέκτη να επεξεργάζεται πακέτα αντί να τα αποθηκεύει στην προσωρινή μνήμη.
    • R – RST. Η επικοινωνία σταμάτησε.
  • Αριθμός ακολουθίας των δεδομένων στο πακέτο. (ακολουθία 1)
  • Αριθμός επιβεβαίωσης (ack 2)
  • Μέγεθος παραθύρου (win 453). Ο αριθμός των byte που είναι διαθέσιμα στο buffer λήψης. Αυτό ακολουθείται από επιλογές TCP.
  • Μήκος ωφέλιμου φορτίου δεδομένων. (μήκος 0)

Εγκατάσταση

Σε διανομές που βασίζονται στο Debian, το tcpdump μπορεί να εγκατασταθεί με την εντολή APT:

# apt install tcpdump -y

Σε διανομές που βασίζονται σε RPM, το tcpdump μπορεί να εγκατασταθεί με το YUM:

# yum install tcpdump -y

Ή χρησιμοποιώντας DNF εάν RHEL 8

# dnf install tcpdump -y

επιλογές εντολής tcpdump

Πρέπει να είστε root για να τρέξετε το tcpdump. Περιλαμβάνει πολλές επιλογές και φίλτρα. Η εκτέλεση του tcpdump χωρίς καμία επιλογή θα καταγράψει όλα τα πακέτα που ρέουν μέσω της προεπιλεγμένης διεπαφής.

Για να δείτε τη λίστα των διασυνδέσεων δικτύου που είναι διαθέσιμες στο σύστημα και στις οποίες το tcpdump μπορεί να καταγράψει πακέτα.

# tcpdump -D

Ή

# Tcpdump --list-interfaces
1.eth0
2.nflog (Linux netfilter log (NFLOG) interface)
3.nfqueue (Linux netfilter queue (NFQUEUE) interface)
4.eth1
5.any (Pseudo-device that captures on all interfaces)
6.lo [Loopback]

Αυτό είναι ιδιαίτερα χρήσιμο σε συστήματα που δεν διαθέτουν εντολή για τη λίστα διεπαφών.

  Πώς να εκτυπώσετε το τρίγωνο του Pascal στην Python

Για να καταγράψετε πακέτα που ρέουν μέσω μιας συγκεκριμένης διεπαφής, χρησιμοποιήστε τη σημαία -i με το όνομα της διεπαφής. Χωρίς τη διεπαφή -i, το tcpdump θα πάρει την πρώτη διεπαφή δικτύου που συναντά.

# tcpdump -i eth1
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth1, link-type EN10MB (Ethernet), capture size 262144 bytes
01:06:09.278817 IP vagrant-ubuntu-trusty-64 > 10.0.0.51: ICMP echo request, id 4761, seq 1, length 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

Η σημαία -v αυξάνει τις πληροφορίες που βλέπετε για τα πακέτα, το -vv σας δίνει ακόμα περισσότερες λεπτομέρειες.

Από προεπιλογή, το tcpdump επιλύει διευθύνσεις IP σε ονόματα κεντρικών υπολογιστών και χρησιμοποιεί επίσης ονόματα υπηρεσιών αντί για αριθμούς θυρών. Εάν το DNS είναι κατεστραμμένο ή δεν θέλετε το tcpdump να πραγματοποιεί αναζητήσεις ονομάτων, χρησιμοποιήστε την επιλογή -n.

# tcpdump -n
listening on eth0, link-type EN10MB (Ethernet), capture size 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, length 100

Για να καταγράψετε μόνο ένα σύνολο γραμμών, ας πούμε 5, χρησιμοποιήστε τη σημαία -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, length 100
5 packets captured

Η προεπιλεγμένη έξοδος tcpdump χρησιμοποιεί χρονικές σημάνσεις Unix. Για να καταγράψετε πακέτα με χρονική σήμανση αναγνώσιμη από τον άνθρωπο:

# 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, length 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 εκφράσεις φίλτρου

Οι εκφράσεις φίλτρου επιλέγουν ποιες κεφαλίδες πακέτων θα εμφανίζονται. Εάν δεν εφαρμόζονται φίλτρα, εμφανίζονται όλες οι κεφαλίδες πακέτων. Τα φίλτρα που χρησιμοποιούνται συνήθως είναι τα port, host, src, dst, tcp, udp, icmp.

  Πώς να αφαιρέσετε σκαριφήματα σε ένα στιγμιότυπο οθόνης iPhone

φίλτρο θύρας

Χρησιμοποιήστε το φίλτρο θύρας για να δείτε τα πακέτα που φτάνουν σε μια συγκεκριμένη θύρα:

# 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

φίλτρο κεντρικού υπολογιστή

Για να καταγράψετε όλα τα πακέτα που φτάνουν ή φεύγουν από τον κεντρικό υπολογιστή με διεύθυνση IP 10.0.2.15:

# 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, length 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

Για να καταγράψετε πακέτα συγκεκριμένου τύπου πρωτοκόλλου, για παράδειγμα, icmp, στη διεπαφή eth1:

# 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

Συνδυασμός εκφράσεων φίλτρου

Μπορείτε να συνδυάσετε αυτές τις εκφράσεις φίλτρου με τελεστές AND, OR και NOT. Αυτό θα σας επιτρέψει να γράψετε εντολές που μπορούν να απομονώσουν πακέτα με μεγαλύτερη ακρίβεια:

Πακέτα από μια συγκεκριμένη IP και προορίζονται για μια συγκεκριμένη θύρα:

# tcpdump -n -i eth1 src 10.0.0.1 and 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

Για να καταγράψετε όλα τα πακέτα εκτός από το ICMP, χρησιμοποιήστε τον τελεστή NOT:

# tcpdump -i eth1 not icmp

Αποθήκευση κεφαλίδων πακέτων σε αρχείο

Δεδομένου ότι η έξοδος του tcpdump μπορεί να μετακινηθεί πέρα ​​από την οθόνη αρκετά γρήγορα, μπορείτε να αποθηκεύσετε τις κεφαλίδες των πακέτων σε ένα αρχείο με τη σημαία -w. Τα αρχεία για αποθήκευση της εξόδου χρησιμοποιούν μορφή pcap και έχουν επέκταση .pcap.

  Απενεργοποιήστε την ασφάλεια στον διακομιστή εφαρμογών IBM WebSphere

Το PCAP σημαίνει σύλληψη πακέτων. Η ακόλουθη εντολή αποθηκεύει 10 γραμμές εξόδου στη διεπαφή eth1 στο icmp.pcap.

# tcpdump -i eth1 -c 10 -w icmp.pcap
tcpdump: listening on eth1, link-type EN10MB (Ethernet), capture size 262144 bytes
10 packets captured
10 packets received by filter
0 packets dropped by kernel

Μπορείτε να διαβάσετε αυτό το αρχείο με σημαία -r:

tcpdump -r icmp.pcap
reading from file icmp.pcap, link-type 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

Προβολή λεπτομερειών πακέτου

Μέχρι στιγμής έχουμε δει μόνο τις κεφαλίδες των πακέτων, για να δείτε τα περιεχόμενα των πακέτων χρησιμοποιήστε την επιλογή -A. Αυτό εκτυπώνει το περιεχόμενο του πακέτου σε ASCII, το οποίο μπορεί να βοηθήσει στην αντιμετώπιση προβλημάτων δικτύου. Επίσης, η σημαία -X μπορεί να χρησιμοποιηθεί για την εμφάνιση εξόδου σε μορφή hex. Αυτό μπορεί να μην είναι πολύ χρήσιμο εάν η σύνδεση είναι κρυπτογραφημένη.

# 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..'[email protected]@.%.
...
..2...P..M.
uE............
.6.}.Q.bGET / HTTP/1.1
Host: 10.0.0.50
Connection: keep-alive
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Safari/537.36
Accept: 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

συμπέρασμα

Το tcpdump είναι εύκολο να ρυθμιστεί και μόλις κατανοήσετε την έξοδο, τις διάφορες σημαίες και τα φίλτρα, μπορεί να χρησιμοποιηθεί για την επίλυση προβλημάτων δικτύωσης και την ασφάλεια του δικτύου σας.