03/19/2024

Cum să capturați și să analizați traficul de rețea cu tcpdump?

tcpdump este un instrument uimitor de linie de comandă pentru sniffing în rețea. Este un standard industrial pentru capturarea și analiza pachetelor TCP/IP.

Instrumentul tcpdump poate fi de mare ajutor la rezolvarea problemelor de rețea. Pachetele pot fi salvate într-un fișier și analizate ulterior. Este o idee bună să rulați acest instrument ocazional pentru a supraveghea rețeaua dvs.

Cum arată ieșirea tcpdump?

tcpdump vă permite să examinați anteturile pachetelor TCP/IP. Tipărește o linie pentru fiecare pachet, iar comanda continuă să ruleze până când apăsați Ctrl+C pentru a termina.

Să examinăm o linie dintr-un exemplu de ieșire:

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

Fiecare linie include

  • Marca temporală Unix (20:58:26.765637)
  • protocol (IP)
  • numele de gazdă sau IP-ul sursei și numărul portului (10.0.0.50.80)
  • numele gazdă sau IP-ul destinației și numărul portului (10.0.0.1.53181)
  • Steaguri TCP (Flags [F.]). Steagurile indică starea conexiunii. Aceasta poate include mai multe valori, ca în acest exemplu [F.] pentru FIN-ACK. Acest câmp poate avea următoarele valori:
    • S – SYN. Primul pas în stabilirea conexiunii.
    • F – FIN. Încetarea conexiunii.
    • . – ACK. Pachetul de confirmare a primit cu succes.
    • P – IMPINGERE. Spune receptorului să proceseze pachetele în loc să le pună în tampon.
    • R – RST. Comunicarea sa oprit.
  • Numărul de secvență al datelor din pachet. (sev. 1)
  • Numărul de confirmare (ack 2)
  • Dimensiunea ferestrei (win 453). Numărul de octeți disponibili în memoria tampon de recepție. Acesta este urmat de opțiunile TCP.
  • Lungimea încărcăturii de date. (lungime 0)

Instalare

Pe distribuțiile bazate pe Debian, tcpdump poate fi instalat cu comanda APT:

# apt install tcpdump -y

Pe distribuțiile bazate pe RPM, tcpdump poate fi instalat cu YUM:

# yum install tcpdump -y

Sau folosind DNF dacă RHEL 8

# dnf install tcpdump -y

opțiunile de comandă tcpdump

Trebuie să fii root pentru a rula tcpdump. Include multe opțiuni și filtre. Rularea tcpdump fără opțiuni va captura toate pachetele care curg prin interfața implicită.

Pentru a vedea lista interfețelor de rețea disponibile pe sistem și pe care tcpdump poate captura pachete.

# tcpdump -D

Sau

# 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]

Acest lucru este util în special pe sistemele care nu au o comandă pentru a enumera interfețele.

  Cum se instalează și rulează IDE-ul Arduino pe un Raspberry Pi

Pentru a captura pachete care circulă printr-o anumită interfață, utilizați steag-ul -i cu numele interfeței. Fără interfața -i, tcpdump va prelua prima interfață de rețea pe care o întâlnește.

# 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

Indicatorul -v mărește informațiile pe care le vedeți despre pachete, -vv vă oferă și mai multe detalii.

În mod implicit, tcpdump rezolvă adresele IP în nume de gazdă și, de asemenea, utilizează nume de servicii în loc de numere de port. Dacă DNS este defect sau nu doriți ca tcpdump să efectueze căutări de nume, utilizați opțiunea -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

Pentru a captura doar un set de linii, de exemplu 5, utilizați steag-ul -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

Ieșirea implicită tcpdump utilizează marcaje temporale Unix. Pentru a captura pachete cu marca temporală care poate fi citită de om:

# 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

expresii de filtru tcpdump

Expresiile de filtrare selectează ce antete de pachete vor fi afișate. Dacă nu sunt aplicate filtre, sunt afișate toate anteturile pachetelor. Filtrele utilizate în mod obișnuit sunt port, host, src, dst, tcp, udp, icmp.

  Cum să obțineți cea mai bună calitate a sunetului în Spotify

filtru de port

Utilizați filtrul de porturi pentru a vizualiza pachetele care sosesc într-un anumit port:

# 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

filtru gazdă

Pentru a captura toate pachetele care sosesc sau pleacă de la gazdă cu adresa 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

Pentru a captura pachete cu un anumit tip de protocol, de exemplu, icmp, pe interfața 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

Combinarea expresiilor de filtrare

Puteți combina aceste expresii de filtrare cu operatori AND, OR și NOT. Acest lucru vă va permite să scrieți comenzi care pot izola pachetele mai precis:

Pachete de la un anumit IP și destinate unui anumit port:

# 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

Pentru a captura toate pachetele cu excepția ICMP, utilizați operatorul NOT:

# tcpdump -i eth1 not icmp

Salvarea antetelor pachetelor într-un fișier

Deoarece ieșirea tcpdump poate derula pe lângă ecran destul de repede, puteți stoca antetele pachetelor într-un fișier cu steag-w. Fișierele pentru a salva rezultatul folosesc formatul pcap și au extensia .pcap.

  De ce fotografiile arată diferit când le imprimez?

PCAP înseamnă captura de pachete. Următoarea comandă salvează 10 linii de ieșire pe interfața eth1 în 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

Puteți citi acest fișier cu flag -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

Vizualizarea detaliilor pachetului

Până acum am văzut doar antetele pachetelor, pentru a vizualiza conținutul pachetului utilizați opțiunea -A. Acest lucru tipărește conținutul pachetului în ASCII, ceea ce poate fi de ajutor în depanarea rețelei. De asemenea, -X flag poate fi folosit pentru a afișa rezultatul în format hex. Acest lucru poate să nu fie de mare ajutor dacă conexiunea este criptată.

# 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

Concluzie

tcpdump este ușor de configurat și, odată ce înțelegeți rezultatul, diferitele steaguri și filtre, poate fi folosit pentru a rezolva problemele de rețea și pentru a vă securiza rețeaua.

x