Kā uztvert un analizēt tīkla trafiku, izmantojot tcpdump?

tcpdump ir pārsteidzošs komandrindas rīks tīkla sniffing. Tas ir nozares standarts TCP/IP pakešu uztveršanai un analīzei.

Rīks tcpdump var būt ļoti noderīgs, risinot tīkla problēmas. Paketes var saglabāt failā un vēlāk analizēt. Ieteicams laiku pa laikam palaist šo rīku, lai uzraudzītu tīklu.

Kā izskatās tcpdump izvade?

tcpdump ļauj pārbaudīt TCP/IP pakešu galvenes. Tā izdrukā vienu rindiņu katrai paketei, un komanda turpina darboties, līdz nospiežat Ctrl+C, lai pārtrauktu.

Apskatīsim vienu rindiņu no piemēra izvades:

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

Katra rinda ietver

  • Unix laikspiedols (20:58:26.765637)
  • protokols (IP)
  • avota resursdatora nosaukums vai IP un porta numurs (10.0.0.50.80)
  • galamērķa resursdatora nosaukums vai IP un porta numurs (10.0.0.1.53181)
  • TCP karogi (Flags [F.]). Karogi norāda savienojuma stāvokli. Tas var ietvert vairāk nekā vienu vērtību, piemēram, šajā piemērā [F.] priekš FIN-ACK. Šim laukam var būt šādas vērtības:
    • S – SYN. Pirmais solis savienojuma izveidošanā.
    • F – FIN. Savienojuma pārtraukšana.
    • . – AK. Apstiprinājuma pakete veiksmīgi saņemta.
    • P – PUSH. Liek uztvērējam apstrādāt paketes, nevis buferizēt.
    • R – RST. Komunikācija pārtraukta.
  • Paketē esošo datu kārtas numurs. (1. secība)
  • Apstiprinājuma numurs (ack 2)
  • Logu izmērs (win 453). Saņemšanas buferī pieejamo baitu skaits. Tam seko TCP opcijas.
  • Datu derīgās slodzes garums. (garums 0)

Uzstādīšana

Uz Debian balstītiem izplatījumiem tcpdump var instalēt ar komandu APT:

# apt install tcpdump -y

Uz RPM balstītos izplatījumos tcpdump var instalēt kopā ar YUM:

# yum install tcpdump -y

Vai arī izmantojot DNF, ja RHEL 8

# dnf install tcpdump -y

tcpdump komandas opcijas

Lai palaistu tcpdump, jums ir jābūt root. Tas ietver daudzas iespējas un filtrus. Palaižot tcpdump bez opcijām, tiks uztvertas visas paketes, kas plūst caur noklusējuma saskarni.

Lai skatītu sistēmā pieejamo tīkla saskarņu sarakstu un kurās tcpdump var uztvert paketes.

# tcpdump -D

Or

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

Tas ir īpaši noderīgi sistēmās, kurām nav komandas, lai uzskaitītu saskarnes.

Lai uztvertu paketes, kas plūst caur noteiktu saskarni, izmantojiet karogu -i ar saskarnes nosaukumu. Bez -i interfeisa tcpdump uzņems pirmo tīkla interfeisu, ar kuru tas saskarsies.

# 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

Karogs -v palielina informāciju, ko redzat par paketēm, bet -vv sniedz vēl vairāk informācijas.

  Kā gūt labumu no agrīnas piekļuves NFT pilieniem

Pēc noklusējuma tcpdump atdala IP adreses uz resursdatora nosaukumiem un portu numuru vietā izmanto arī pakalpojumu nosaukumus. Ja DNS ir bojāta vai nevēlaties, lai tcpdump veiktu vārda meklēšanu, izmantojiet opciju -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

Lai uzņemtu tikai līniju kopu, piemēram, 5, izmantojiet karogu -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

Noklusējuma tcpdump izvade izmanto Unix laikspiedolus. Lai tvertu paketes ar cilvēkiem lasāmu laikspiedolu:

# 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 filtra izteiksmes

Filtra izteiksmes atlasiet, kuras pakešu galvenes tiks parādītas. Ja netiek lietoti filtri, tiek parādītas visas pakešu galvenes. Parasti izmantotie filtri ir ports, resursdators, src, dst, tcp, udp, icmp.

  Kā izmantot Jio 5G tīklu Indijā

porta filtrs

Izmantojiet porta filtru, lai skatītu paketes, kas pienāk noteiktā 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

saimniekdatora filtrs

Lai tvertu visas paketes, kas pienāk resursdatorā vai iziet no tā ar IP adresi 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

Lai tvertu noteikta protokola tipa, piemēram, icmp, paketes eth1 saskarnē:

# 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

Filtru izteiksmju apvienošana

Varat apvienot šīs filtra izteiksmes ar operatoriem UN, OR un NOT. Tas ļaus jums rakstīt komandas, kas var precīzāk izolēt paketes:

Paketes no noteikta IP un paredzētas noteiktam portam:

# 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

Lai tvertu visas paketes, izņemot ICMP, izmantojiet operatoru NOT:

# tcpdump -i eth1 not icmp

Pakešu galvenes saglabāšana failā

Tā kā tcpdump izvade var ritināt garām ekrānam diezgan ātri, jūs varat saglabāt pakešu galvenes failā ar karogu -w. Faili izvades saglabāšanai izmanto pcap formātu, un to paplašinājums ir .pcap.

  Piemērs komentāru pievienošanai 15 programmēšanas valodās

PCAP apzīmē pakešu uztveršanu. Šī komanda saglabā 10 izvades rindas eth1 saskarnē 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

Šo failu var lasīt ar karodziņu -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

Pakešu informācijas skatīšana

Līdz šim mēs esam redzējuši tikai pakešu galvenes, lai skatītu pakešu saturu, izmantojiet opciju -A. Tas izdrukā pakešu saturu ASCII formātā, kas var palīdzēt tīkla problēmu novēršanā. Arī -X karogu var izmantot, lai parādītu izvadi hex formātā. Tas var nepalīdzēt, ja savienojums ir šifrēts.

# 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

Secinājums

tcpdump ir viegli iestatīt, un, tiklīdz jūs saprotat izvadi, dažādus karogus un filtrus, to var izmantot, lai atrisinātu tīkla problēmas un nodrošinātu tīkla drošību.