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.
Cuprins
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.
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.
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.
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.