tcpdump je nástroj příkazového řádku, který nám umožňuje zachytit a analyzovat síťový provoz procházející naším systémem. V závislosti na možnostech filtrování můžeme tento nástroj použít k efektivnímu řešení jakýchkoli problémů se sítí. Je to velmi často používaný nástroj systémovými inženýry pro tyto funkce.
V tomto tutoriálu analyzujeme některé způsoby použití tcpdump , ale ne všechny. Je to proto, že tento příkaz obsahuje příliš mnoho možností filtrování a není možné je všechny pokrýt. Zde se podíváme pouze na některé běžně používané možnosti. Zbytek najdete na manuálové stránce.
Instalace příkazu tcpdump
Můžete zkontrolovat, zda váš systém obsahuje tcpdump
příkaz, zadáním
tcpdump --version
Pokud výstup ukazuje, že není nainstalován, můžete jej získat přímo pomocí systémového správce balíčků.
POZNÁMKA :Protože budeme zachycovat pakety, potřebujeme zvýšená oprávnění. (sudo je požadováno). Všemu tcpdump
přidáme předponu příkazy pomocí sudo
v důsledku toho.
Seznam rozhraní pro zachycení paketů
Před aktivním zachycováním paketů se podíváme na dostupná rozhraní protcpdump
.
Seznam rozhraní můžeme vypsat pomocí -D (Zobrazení).
sudo tcpdump -D
Získáte seznam všech dostupných rozhraní na vašem počítači. To bude záviset od systému k systému, takže můj má některá další rozhraní, jako je Docker , protože služba Docker je spuštěna, kromě typických síťových rozhraní.
Speciální rozhraní jakékoli umožňuje snímání v jakémkoli aktivní rozhraní.
Nyní, když známe dostupná rozhraní na našem počítači, začněme zachycovat pakety!
Zachycení paketů pomocí tcpdump
Zachyťte všechny pakety v jakémkoli rozhraní spuštěním tohoto příkazu:
sudo tcpdump -i any
Tím určíte, že rozhraní bude libovolné , speciální rozhraní zmíněné výše.
tcpdump pokračuje v zachycování paketů, dokud neobdrží přerušení signál. Nahrávání můžete přerušit stisknutím Ctrl+C
.
Výstup zobrazí seznam všech zachycených paketů, dokud nebude přijat signál přerušení k ukončení tcpdump
.
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode listening on any, link-type LINUX_SLL (Linux cooked), capture size 262144 bytes 10:49:32.841984 IP 111.11.111.11.vultr.com.ssh > 123.45.678.90.48006: Flags [P.], seq 4132693749:4132693857, ack 3344962610, win 1002, options [nop,nop,TS val 135269404 ecr 1623818400], length 108 10:49:32.842057 IP 111.11.111.11.vultr.com.ssh > 123.45.678.90.48006: Flags [P.], seq 108:144, ack 1, win 1002, options [nop,nop,TS val 135269404 ecr 1623818400], length 36 10:49:32.842101 IP 111.11.111.11.vultr.com.ssh > 123.45.678.90.48006: Flags [P.], seq 144:260, ack 1, win 1002, options [nop,nop,TS val 135269404 ecr 1623818400], length 116 10:49:32.842135 IP 111.11.111.11.vultr.com.ssh > 123.45.678.90.48006: Flags [P.], seq 260:296, ack 1, win 1002, options [nop,nop,TS val 135269404 ecr 1623818400], length 36 ... ... ^C 264 packets captured 361 packets received by filter 91 packets dropped by kernel
Jak můžete vidět, tcpdump
zachytil 264 paketů. Například, protože jsem připojen k tomuto serveru pomocí ssh
, tcpdump zachytil všechny tyto pakety.
Omezit počet zachycených paketů
Chcete-li omezit počet zachycených paketů a zastavit tcpdump
, použijte -c
(limit zachycení) možnost:
sudo tcpdump -i any -c 2
To způsobí, že příkaz tcpdump automaticky zastaví zachytávání po 2 paketech. V tomto případě nemusíme nutně použít signál přerušení k ručnímu ukončení.
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode listening on any, link-type LINUX_SLL (Linux cooked), capture size 262144 bytes 10:57:31.284198 IP 111.11.111.11.vultr.com.ssh > 123.45.678.90.48006: Flags [P.], seq 4132754245:4132754353, ack 3344963698, win 1002, options [nop,nop,TS val 135747845 ecr 1624296856], length 108 10:57:31.284275 IP 111.11.111.11.vultr.com.ssh > 123.45.678.90.48006: Flags [P.], seq 108:144, ack 1, win 1002, options [nop,nop,TS val 135747845 ecr 1624296856], length 36 2 packets captured 16 packets received by filter 8 packets dropped by kernel
Tato možnost může být docela užitečná při monitorování síťových připojení pro řešení jakéhokoli problému, pokud se vyskytnou problémy se sítí.
Zakázat rozlišení názvu a portu
Ve výchozím nastavení tcpdump příkaz přeloží adresy IP a porty na názvy (například vultr.com.ssh , který provádí překlad názvů z IP adres a portů).
Při odstraňování problémů se sítí je často jednodušší použít adresy IP a čísla portů; Překlad názvů můžeme zakázat pomocí volby -n
a rozlišení portu pomocí -nn
.
sudo tcpdump -i any -c 2 -nn
Výše uvedený příkaz zachytí 2 pakety na libovolném rozhraní, přičemž deaktivuje rozlišení portu.
Takže výstup nyní zastaví jakýkoli překlad názvů a jednoduše vrátí IP adresy a čísla portů.
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode listening on any, link-type LINUX_SLL (Linux cooked), capture size 262144 bytes 11:00:36.459922 IP 111.11.111.11.22 > 123.45.678.90.48006: Flags [P.], seq 4132755513:4132755621, ack 3344963838, win 1002, options [nop,nop,TS val 135933020 ecr 1624482048], length 108 11:00:36.459982 IP 111.11.111.11.22 > 123.45.678.90.48006: Flags [P.], seq 108:144, ack 1, win 1002, options [nop,nop,TS val 135933020 ecr 1624482048], length 36 2 packets captured 8 packets received by filter 0 packets dropped by kernel
Zde se podívejme na řádek výstupu.
11:00:36.459922 IP 111.11.111.11.22 > 123.45.678.90.48006: Flags [P.], seq 4132755513:4132755621, ack 3344963838, win 1002, options [nop,nop,TS val 135933020 ecr 1624482048], length 108
Toto je typický TCP zachycení paketů. Další protokolové pakety a formáty jsou uvedeny na manuálové stránce příkazu tcpdump.
První pole, 11:00:36.459922 , představuje časové razítko přijatého paketu podle místních hodin.
Dále IP
představuje protokol síťové vrstvy – v tomto případě IPv4
. Pro IPv6
pakety, hodnota je IP6
.
Další pole, 111.11.111.11.22 , je zdrojová IP adresa a port. Následuje cílová IP adresa a port, reprezentovaný 123.45.678.90.48006 .
Nyní, když víme, jaký je základní výstupní formát, pojďme analyzovat některé možnosti filtrování pro tcpdump
Filtrování paketů
Jeden z tcpdump nejvýkonnější funkcí příkazu je jeho schopnost filtrovat zachycené pakety pomocí různých parametrů, jako jsou zdrojové a cílové IP adresy, porty, protokoly atd. Podívejme se na některé z nejběžnějších.
Filtr založený na protokolu
Chcete-li filtrovat pakety na základě protokolu, musíme v příkazu specifikovat protokol.
Chcete-li zachytit ICMP pouze pakety, můžeme filtrovat na základě ICMP protokol.
sudo tcpdump -i any -c 5 icmp
Od ping
používá ICMP pakety, můžeme analyzovat příchozí pakety kvůli ping
z jiného stroje.
Odešleme příkaz ping na náš aktuální počítač a zachytíme příchozí pakety ping.
Otevřete terminálovou relaci na jiném počítači a zadejte
ping IP_ADDRESS_MACHINE_1
Nyní v našem tcpdump
terminálovou relaci, nyní vidíme, že zachycuje pakety odpovědí ICMP ping.
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode listening on any, link-type LINUX_SLL (Linux cooked), capture size 262144 bytes 11:18:47.947475 IP 123.45.678.90 > 111.11.111.11.vultr.com: ICMP echo request, id 6068, seq 1, length 64 11:18:47.947554 IP 111.11.111.11.vultr.com > 123.45.678.90: ICMP echo reply, id 6068, seq 1, length 64 11:18:48.947669 IP 123.45.678.90 > 111.11.111.11.vultr.com: ICMP echo request, id 6068, seq 2, length 64 11:18:48.947752 IP 111.11.111.11.vultr.com > 123.45.678.90: ICMP echo reply, id 6068, seq 2, length 64 11:18:49.947853 IP 123.45.678.90 > 111.11.111.11.vultr.com: ICMP echo request, id 6068, seq 3, length 64 5 packets captured 6 packets received by filter 0 packets dropped by kernel
Zde 123.45.678.90 je IP adresa stroje (Machine 2), který odešle ping našemu tcpdump
systému a 111.11.111.11 je IP adresa stroje pro filtrování paketů (Machine 1).
Protože jsem používal ssh
pro odeslání požadavků ping existuje rozlišení domény (ale žádné rozlišení názvu) na vultr.com
.
Filtr na základě hostitele
Chcete-li omezit zachycování pouze na pakety související s konkrétním hostitelem, můžeme použít host
filtr
sudo tcpdump -i any -c5 -nn host 192.168.1.2
V tomto příkladu tcpdump zachycuje a zobrazuje pouze pakety do az hostitele 192.168.1.2
.
Filtr na základě portu
Chcete-li filtrovat pakety na základě požadované služby nebo portu, použijte port
filtr. Pomocí tohoto příkazu můžete například zachytit pakety související s relací ssh (port 22 filtrování):
sudo tcpdump -i any -c5 -nn port 22
Filtr na základě zdrojové IP/názvu hostitele
Pakety můžete také filtrovat na základě zdrojové nebo cílové IP adresy nebo názvu hostitele. Například k zachycení paketů z hostitele 192.168.1.2
sudo tcpdump -i any -c 5 -nn src 192.168.1.2
Můžeme použít dst
filtrovat také podle cílové IP/názvu hostitele.
sudo tcpdump -i any -c 5 -nn src 172.168.1.2
Uložit zachycení paketů
Výsledky zachycení paketů můžeme uložit do souboru pro pozdější analýzu.
Chcete-li pakety uložit do souboru místo jejich zobrazení na obrazovce, použijte volbu -w
:
sudo tcpdump -i any -c 5 -nn -w sample.pcap port 22
Tento příkaz uloží výstup do souboru s názvem sample.pcap
. .pcap
přípona znamená „packet capture“ a je konvencí pro tento formát souboru.
Závěr
V tomto tutoriálu jsme se naučili, jak můžeme provádět zachycování a filtrování paketů na základě různých možností pomocí tcpdump
příkaz.