Tcpdump je příkaz pro odstraňování problémů se sítí, který je také známý jako sniffer paketů a používá se k zachycení a zobrazení paketů ze sítě. Tcpdump umožňuje uživatelům zachytit a zobrazit TCP/IP a další pakety (UDP, ARP nebo ICMP), které jsou přenášeny nebo přijímány přes síť, ke které je počítač připojen.
Na pakety můžete použít filtry a vyhnout se provozu, který nechcete vidět. Můžete zachytit všechna data procházející vaší místní sítí a uložit tato data do souboru pro pozdější analýzu. Ke spuštění příkazu tcpdump potřebujete root nebo uživatele s právy sudo.
V tomto tutoriálu se naučíme, jak používat příkazy tcpdump k analýze provozu proudícího na počítači se systémem Linux.
1. Zachyťte provoz na rozhraní
Když použijete tcpdump bez jakýchkoli voleb, bude analyzovat provoz na všech rozhraních, spusťte následující příkaz:
$ sudo tcpdump
Chcete-li jej zastavit, musíte stisknout tlačítko Ctrl + C.
Chcete-li zachytit provoz na konkrétním rozhraní, použijte -i
a omezit počet paketů na -c
možnost:
Následující příklad tcpdump analyzuje rozhraní 'ens160' a omezuje paket na 5:
$ sudo tcpdump -i ens160 -c 5
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on ens160, link-type EN10MB (Ethernet), capture size 262144 bytes
22:37:57.488830 IP Ubuntu.ssh > static.vnpt.vn.50302: Flags [P.], seq 904499689:904499877, ack 2322684183, win 501, options [nop,nop,TS val 215651573 ecr 764510174], length 188
22:37:57.489727 IP Ubuntu.33256 > dns.google.domain: 5774+ [1au] PTR? 219.62.249.14.in-addr.arpa. (55)
22:37:57.496238 IP static.vnpt.vn.50302 > Ubuntu.ssh: Flags [.], ack 188, win 2045, options [nop,nop,TS val 764510247 ecr 215651573], length 0
22:37:57.546212 ARP, Request who-has 42.112.22.189 tell 42.112.22.254, length 46
22:37:57.549223 ARP, Request who-has 42.112.22.162 tell 42.112.22.254, length 46
5 packets captured
2) Zachyťte provoz na konkrétním hostiteli
Příchozí a odchozí pakety od určitého hostitele můžete zachytit pomocí -host
možnost.
$ sudo tcpdump -i ens160 -c 5 -ttttnnvvS host 14.249.62.219
Nyní můžete vidět pakety požadavků i odpovědí:
tcpdump: listening on ens160, link-type EN10MB (Ethernet), capture size 262144 bytes
2020-06-22 06:07:36.407733 IP (tos 0x12,ECT(0), ttl 64, id 60196, offset 0, flags [DF], proto TCP (6), length 176)
100.9.8.40.22 > 14.249.62.219.49396: Flags [P.], cksum 0x60a7 (incorrect -> 0x8547), seq 296088568:296088692, ack 3491435441, win 501, options [nop,nop,TS val 242630491 ecr 673952638], length 124
2020-06-22 06:07:36.407905 IP (tos 0x12,ECT(0), ttl 64, id 60197, offset 0, flags [DF], proto TCP (6), length 208)
100.9.8.40.22 > 14.249.62.219.49396: Flags [P.], cksum 0x60c7 (incorrect -> 0xeed4), seq 296088692:296088848, ack 3491435441, win 501, options [nop,nop,TS val 242630492 ecr 673952638], length 156
2020-06-22 06:07:36.407967 IP (tos 0x12,ECT(0), ttl 64, id 60198, offset 0, flags [DF], proto TCP (6), length 288)
100.9.8.40.22 > 14.249.62.219.49396: Flags [P.], cksum 0x6117 (incorrect -> 0x82ca), seq 296088848:296089084, ack 3491435441, win 501, options [nop,nop,TS val 242630492 ecr 673952638], length 236
2020-06-22 06:07:36.408018 IP (tos 0x12,ECT(0), ttl 64, id 60199, offset 0, flags [DF], proto TCP (6), length 408)
100.9.8.40.22 > 14.249.62.219.49396: Flags [P.], cksum 0x618f (incorrect -> 0xebc8), seq 296089084:296089440, ack 3491435441, win 501, options [nop,nop,TS val 242630492 ecr 673952638], length 356
2020-06-22 06:07:36.408049 IP (tos 0x12,ECT(0), ttl 64, id 60200, offset 0, flags [DF], proto TCP (6), length 208)
100.9.8.40.22 > 14.249.62.219.49396: Flags [P.], cksum 0x60c7 (incorrect -> 0x3db7), seq 296089440:296089596, ack 3491435441, win 501, options [nop,nop,TS val 242630492 ecr 673952638], length 156
3) Najděte paket podle portu
K vyhledání paketů na zadané číslo portu použijte -port
možnost.
Za předpokladu, že chcete analyzovat síťové rozhraní 'ens160' a omezit počet paketů na 5 z portu 22, spusťte následující příkaz:
$ sudo tcpdump -i ens160 -c 5 -nn port 22
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on ens160, link-type EN10MB (Ethernet), capture size 262144 bytes
22:55:11.567754 IP 100.9.8.40.22 > 14.249.62.219.50302: Flags [P.], seq 904502461:904502649, ack 2322684399, win 501, options [nop,nop,TS val 216685651 ecr 765506106], length 188
22:55:11.567973 IP 100.9.8.40.22 > 14.249.62.219.50302: Flags [P.], seq 188:408, ack 1, win 501, options [nop,nop,TS val 216685652 ecr 765506106], length 220
22:55:11.568102 IP 100.9.8.40.22 > 14.249.62.219.50302: Flags [P.], seq 408:604, ack 1, win 501, options [nop,nop,TS val 216685652 ecr 765506106], length 196
22:55:11.568184 IP 100.9.8.40.22 > 14.249.62.219.50302: Flags [P.], seq 604:800, ack 1, win 501, options [nop,nop,TS val 216685652 ecr 765506106], length 196
22:55:11.568262 IP 100.9.8.40.22 > 14.249.62.219.50302: Flags [P.], seq 800:996, ack 1, win 501, options [nop,nop,TS val 216685652 ecr 765506106], length 196
Pro ignorování portu při zachycení paketů použijte not port
.
Pokud chcete analyzovat port síťového rozhraní 'ens160' jiný než 22, spusťte následující příkaz:
$ sudo tcpdump -i ens160 -nn not port 22
Pro zachycení síťového provozu můžete použít řadu portů.
Pokud například chcete analyzovat síťové rozhraní ens160 v rozsahu portů:od portu 20 do portu 23, spusťte následující příkaz:
$ sudo tcpdump -i ens160 -c 3 -nns 0 portrange 20-23
4) Zachycení paketů z konkrétního protokolu
Můžete se rozhodnout, zda chcete zachytit pouze pakety ICMP (Internet Control Message Protocol) nebo TCP (Transmission Control Protocol). Následující příkaz zachytí pouze pakety TCP:
$ sudo tcpdump -i ens160 -c 5 -nn tcp
Output
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on ens160, link-type EN10MB (Ethernet), capture size 262144 bytes
23:13:04.283421 IP 10.9.8.40.22 > 14.249.62.219.50302: Flags [P.], seq 904505569:904505677, ack 2322684631, win 501, options [nop,nop,TS val 217758367 ecr 766570531], length 108
23:13:04.283512 IP 100.9.8.40.22 > 14.249.62.219.50302: Flags [P.], seq 108:144, ack 1, win 501, options [nop,nop,TS val 217758367 ecr 766570531], length 36
23:13:04.283588 IP 100.9.8.40.22 > 14.249.62.219.50302: Flags [P.], seq 144:260, ack 1, win 501, options [nop,nop,TS val 217758367 ecr 766570531], length 116
23:13:04.283642 IP 100.9.8.40.22 > 14.249.62.219.50302: Flags [P.], seq 260:296, ack 1, win 501, options [nop,nop,TS val 217758367 ecr 766570531], length 36
23:13:04.283863 IP 100.9.8.40.22 > 14.249.62.219.50302: Flags [P.], seq 296:508, ack 1, win 501, options [nop,nop,TS val 217758368 ecr 766570531], length 212
5) Uložit protokol do konkrétního souboru
Zachycené pakety je možné uložit do souboru. Ve výchozím nastavení se při zachytávání paketů do souboru uloží pouze 68 bajtů dat z každého paketu. Zbývající informace jsou ignorovány.
Můžete použít -s
možnost sdělit tcpdump linux, kolik bajtů pro každý paket uložit a zadat 0
protože délka snímku paketů říká tcpdump, aby uložil celý paket, použijte následující příkaz:
$ sudo tcpdump -i ens160 -c 5 -nn tcp -w packets-record.pcap -s 0
Output
tcpdump: listening on ens160, link-type EN10MB (Ethernet), capture size 262144 bytes
5 packets captured
6) Přečtěte si soubor záznamu tcpdump
Nemůžete číst obsah souboru, který ukládá pakety tcpdump pomocí běžných příkazů, jako je 'cat' nebo 'less', ale musíte použít -r
parametr příkazu tcpdump:
$ sudo tcpdump -r packets-record.pcap
Nyní si můžete přečíst obsah souboru záznamu tcpdump:
reading from file packets-record.pcap, link-type EN10MB (Ethernet)
23:18:57.823581 IP Ubuntu.ssh > static.vnpt.vn.50302: Flags [P.], seq 904507573:904507617, ack 2322684767, win 501, options [nop,nop,TS val 218111907 ecr 766921765], length 44
23:18:57.823697 IP Ubuntu.ssh > static.vnpt.vn.50302: Flags [P.], seq 44:160, ack 1, win 501, options [nop,nop,TS val 218111907 ecr 766921765], length 116
23:18:57.823778 IP Ubuntu.ssh > static.vnpt.vn.50302: Flags [P.], seq 160:196, ack 1, win 501, options [nop,nop,TS val 218111907 ecr 766921765], length 36
23:18:57.832656 IP static.vnpt.vn.50302 > Ubuntu.ssh: Flags [.], ack 44, win 2047, options [nop,nop,TS val 766921826 ecr 218111907], length 0
23:18:57.832685 IP static.vnpt.vn.50302 > Ubuntu.ssh: Flags [.], ack 160, win 2045, options [nop,nop,TS val 766921826 ecr 218111907], length 0
Tento soubor pcap můžete také použít pro prohlížení pomocí Wireshark k analýze.
7) Filtrujte pakety z konkrétního zdroje
Chcete-li filtrovat pakety, které pocházejí z konkrétní zdrojové IP adresy, můžete použít src
možnost.
$ sudo tcpdump src 100.9.8.40
Stejným způsobem, pokud chcete vidět provoz v jiném směru, použijte dst
možnost:
$ sudo tcpdump dst 14.249.62.219
8) Zachycení paketů sítí
Pro zachycení příchozích a odchozích dat ze sítě použijte -net
volba. Následující příkaz zachycuje provoz ze sítě 192.168.0.0/24:
$ sudu tcpdump net 192.169.0.0/24
9) Zachyťte pakety v ASCII
Pro zobrazení zachycených paketů v ASCII použijte -A
možnost, která je užitečná pro zachycení webových stránek.
$ sudo tcpdump -A -i eth0
Tcpdump může také zobrazit obsah paketů ve formátu Hex a ASCII a poté použít -X
možnost:
$ sudo tcpdump -X -i eth0
10) Zachyťte pakety IPV6
Provoz IPV6 můžeme zachytit pomocí ip6
volba a proto pro specifikaci protokolu TCP nebo UDP.
proto 6 - TCP
proto 17 - UDP
Následující zachycuje veškerý provoz ipv6 pomocí protokolu tcp:
$ sudo tcpdump -nn ip6 proto 6
11) Filtrujte uživatelského agenta HTTP
Následující příkaz filtruje uživatelského agenta a hostitele Http z hlavičky požadavku http:
$ sudo tcpdump -nn -A -s1500 -l | egrep -i 'User-Agent:|Host:'
K zachycení souborů cookie použijte následující příkaz:
$ sudo tcpdump -nn -A -s0 -l | egrep -i 'Set-Cookie|Host:|Cookie:'
12) Seznam dostupných rozhraní
Pomocí tcpdump můžete zobrazit seznam dostupných rozhraní s -D
možnost.
Například:
$ sudo tcpdump -D
Output
1.ens160 [Up, Running]
2.any (Pseudo-device that captures on all interfaces) [Up, Running]
3.lo [Up, Running, Loopback]
4.docker0 [Up]
5.nflog (Linux netfilter log (NFLOG) interface)
6.nfqueue (Linux netfilter queue (NFQUEUE) interface)
7.usbmon1 (USB bus number 1)
8.usbmon2 (USB bus number 2)
13) Otočte zachycené soubory
Pokud zachycujete provoz pomocí tcpdump po dlouhou dobu, je dobré vytvořit nový soubor, když dosáhnete určité velikosti nebo času.
Následující příkaz vytvoří nový soubor 'network-02-30.pcap' každých 30 minut (-G 1800) se souborem omezeným na 100 MB (-C 100) s počtem souborů 24 (-W 48).
$ sudo tcpdump -i ens160 -w /tmp/network-%H-%M.pcap -W 48 -G 300 -C 100
Možnosti Tcpdump
Tcpdump poskytuje několik možností, které vylepšují nebo upravují jeho výstup, zkontrolujte, které to jsou:
-i <interface>
:Poslouchejte na zadaném rozhraní.-n
:Nepřekládejte názvy hostitelů. Můžete použít-nn
neřešit názvy hostitelů nebo portů.-t
:Na každém řádku výpisu vytiskne lidsky čitelné časové razítko-tttt
:Poskytujte maximálně čitelný výstup časového razítka.-X
:Zobrazit obsah paketu v hexadecimálním i ascii.-v
,-vv
,-vvv
:Zvyšte množství informací o paketech, které získáváte zpět.-c N
:Získejte pouze N počet paketů a poté přestaňte.-s
:Definujte délku (velikost) zachycení v bajtech. Použijte-s0
získat vše, pokud úmyslně nezachytíte méně.-S
:Tisk absolutních pořadových čísel.-q
:Zobrazit méně informací o protokolu.-w <file name>
:Zapisujte nezpracované pakety raději do souboru
Síla operátoru a nebo a ne
Příkaz Tcpdump podporuje kombinaci operátorů 'and', 'or' a 'not' pro filtrování přesnějších výsledků.
Zachyťte provoz přicházející z 10.20.0.0/16 a směřující do sítě 10.30.0.0/16 se zobrazením člověkem čitelných časových razítek (tt), bez rozlišení názvů hostitelů nebo čísel portů (nn), podrobným výstupem (vv) a použitím absolutní sekvence čísla (S):
$ sudo -ttnnvvS tcpdump src net 10.20.0.0/16 and dst net 10.30.0.0/16
Zobrazit provoz ze zdroje 192.168.0.10, který není protokolem UDP:
$ sudo tcpdump src 192.168.0.10 and src net and not udp
Chcete-li zachytit provoz arp nebo ping pro konkrétního hostitele a uložit výstup do souboru s názvem packetfile.txt:
$ sudo tcpdump -nnti eth0 arp or icmp and host 192.168.0.1 -w packetfile.txt
Výstupní formát Tcpdump
Vezměme jeden nový řádek z výstupu tcpdump, abychom pochopili jeho formát.
10:31:13.440803 IP Ubuntu.ssh > 117.6.129.86.50736: Flags [P.], seq 188:400, ack 1, win 501, options [nop,nop,TS val 468736347 ecr 335665367], length 212
Kde:
10:31:13.401128
- Čas, kdy byl paket zachycen v místním čase.
IP
- Ukazuje, že protokol paketů je IPV4.
Ubuntu.ssh
- Toto označuje zdrojovou IP adresu nebo zdrojový název hostitele a .ssh znamená port (zde to bude 22).
117.6.129.86.50376
- Označuje cílovou IP adresu a tečku (.) oddělenou číslem portu.
Příznaky:
[P.]
- Toto je pole TCP flags.
[.]
- ACK (Potvrzení).
[S]
- SYN (Zahájit připojení).
[P]
- PSH (Push Data).
[F]
- FIN (Dokončit připojení).
[R]
- RST (Reset Connection).
[S.]
- SYN-ACK (paket SynAcK).
seq 188:400
- Pořadové číslo označuje, že paket obsahuje bajty '188' až '400' dat.
win 501
- Toto pole je velikost okna, která představuje počet bajtů dostupných v přijímací vyrovnávací paměti.
options [nop,nop,TS val 468736347 ecr 335665367]
- Jedná se o možnosti TCP, jako je MSS (Maximum Segment Size) nebo Window Scale. Můžete si přečíst více o možnostech protokolu TCP.
length 212
- Toto představuje délku dat užitečného zatížení v bajtech.
Závěr
Přestože jsou paketové sniffery užitečnými diagnostickými nástroji, lze je také zneužít. Bezohlední jednotlivci mohou například spustit sniffery paketů, aby zachytili hesla, která ostatní posílají po síti. V závislosti na konfiguraci sítě může tento trik fungovat i v případě, že sniffer paketů neběží ani na odesílajícím, ani na přijímajícím počítači.
Z tohoto důvodu má mnoho organizací zásady zakazující použití snifferů paketů s výjimkou omezených okolností.
Doufám, že jste si užili čtení příkazů tcpdump a zanechte prosím svůj návrh v sekci komentářů níže.