tcpdump è un'utilità della riga di comando che ci consente di acquisire e analizzare il traffico di rete che attraversa il nostro sistema. A seconda delle opzioni di filtro, possiamo utilizzare questo strumento per aiutare a risolvere efficacemente qualsiasi tipo di problema di rete. È uno strumento molto comunemente utilizzato dagli ingegneri di sistema per queste funzionalità.
In questo tutorial analizzeremo alcuni dei modi di utilizzare tcpdump , ma non tutto. Questo perché ci sono semplicemente troppe opzioni di filtro coinvolte in questo comando e non è possibile coprirle tutte. Qui esamineremo solo alcune delle opzioni comunemente utilizzate. Puoi trovare il resto nella pagina man.
Installazione del comando tcpdump
Puoi controllare se il tuo sistema ha il tcpdump
comando, digitando
tcpdump --version
Se l'output mostra che non è installato, puoi ottenerlo direttamente utilizzando il gestore di pacchetti del tuo sistema.
NOTA :Dal momento che cattureremo i pacchetti, abbiamo bisogno di autorizzazioni elevate. (sudo è obbligatorio). Verrà prefissato tutto tcpdump
comandi con sudo
di conseguenza.
Elenca le interfacce per l'acquisizione dei pacchetti
Prima di acquisire attivamente i pacchetti, esamineremo le interfacce disponibili per tcpdump
.
Possiamo elencare le interfacce usando il -D Opzione (Visualizza).
sudo tcpdump -D
Otterrai un elenco di tutte le interfacce disponibili sulla tua macchina. Dipende da sistema a sistema, quindi il mio ha alcune altre interfacce come Docker , poiché il servizio Docker è in esecuzione, a parte le tipiche interfacce di rete.
L'interfaccia speciale qualsiasi consente di acquisire in qualsiasi interfaccia attiva.
Ora che conosciamo le interfacce disponibili sulla nostra macchina, iniziamo a catturare i pacchetti!
Acquisisci pacchetti utilizzando tcpdump
Cattura tutti i pacchetti in qualsiasi interfaccia eseguendo questo comando:
sudo tcpdump -i any
Questo specificherà che l'interfaccia sia qualsiasi , l'interfaccia speciale menzionata in precedenza.
tcpdump continua a catturare i pacchetti finché non riceve un interrupt segnale. Puoi interrompere l'acquisizione premendo Ctrl+C
.
L'output elencherà tutte le acquisizioni di pacchetti fino alla ricezione del segnale di interruzione per terminare 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
Come puoi osservare, tcpdump
aveva catturato 264 pacchetti. Ad esempio, poiché sono connesso a questo server utilizzando ssh
, tcpdump catturato tutti questi pacchetti.
Numero limite di acquisizioni di pacchetti
Per limitare il numero di pacchetti catturati e fermare tcpdump
, usa il -c
opzione (limite di acquisizione):
sudo tcpdump -i any -c 2
Ciò farà sì che il comando tcpdump interrompa automaticamente l'acquisizione dopo 2 pacchetti. In questo caso non sarà necessario utilizzare il segnale di interruzione per terminarlo manualmente.
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
Questa opzione può essere molto utile nel monitoraggio delle connessioni di rete per la risoluzione di eventuali problemi, se ci sono problemi di rete.
Disabilita nome e risoluzione porta
Per impostazione predefinita, tcpdump Il comando risolve gli indirizzi IP e le porte in nomi (come vultr.com.ssh , che esegue la risoluzione dei nomi dagli indirizzi IP e dalle porte).
Durante la risoluzione dei problemi di rete, è spesso più semplice utilizzare gli indirizzi IP ei numeri di porta; Possiamo disabilitare la risoluzione dei nomi usando l'opzione -n
e risoluzione della porta con -nn
.
sudo tcpdump -i any -c 2 -nn
Il comando precedente acquisisce 2 pacchetti su qualsiasi interfaccia, disabilitando la risoluzione della porta.
Quindi l'output interromperà qualsiasi risoluzione dei nomi e restituirà semplicemente gli indirizzi IP e i numeri di porta.
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
Qui, esaminiamo una riga dell'output.
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
Questo è un tipico TCP acquisizione di pacchetti. È possibile fare riferimento ad altri pacchetti e formati di protocollo nella pagina di manuale del comando tcpdump.
Il primo campo, 11:00:36.459922 , rappresenta il timestamp del pacchetto ricevuto secondo l'orologio locale.
Successivamente, IP
rappresenta il protocollo del livello di rete, in questo caso IPv4
. Per IPv6
pacchetti, il valore è IP6
.
Il campo successivo, 111.11.111.11.22 , è l'indirizzo IP e la porta di origine. Segue l'indirizzo IP e la porta di destinazione, rappresentati da 123.45.678.90.48006 .
Ora che sappiamo come è il formato di output di base, analizziamo alcune opzioni di filtro per tcpdump
Filtraggio dei pacchetti
Uno di tcpdump la caratteristica più potente del comando è la sua capacità di filtrare i pacchetti catturati utilizzando una varietà di parametri, come indirizzi IP di origine e destinazione, porte, protocolli, ecc. Diamo un'occhiata ad alcuni dei più comuni.
Filtro basato su protocollo
Per filtrare i pacchetti in base al protocollo, dobbiamo specificare il protocollo nel comando.
Per acquisire ICMP solo pacchetti, possiamo filtrare in base a ICMP protocollo.
sudo tcpdump -i any -c 5 icmp
Dal ping
comando utilizza ICMP pacchetti, possiamo analizzare i pacchetti in arrivo a causa di ping
da un'altra macchina.
Eseguiamo il ping della nostra macchina attuale e catturiamo i pacchetti ping in arrivo.
Apri una sessione terminale su un'altra macchina e digita
ping IP_ADDRESS_MACHINE_1
Ora, nel nostro tcpdump
sessione terminale, ora possiamo vedere che cattura quei pacchetti di risposta ping ICMP.
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
Qui, 123.45.678.90 è l'indirizzo IP della macchina (Macchina 2) che invia il ping al nostro tcpdump
sistema e 111.11.111.11 è l'indirizzo IP della macchina per il filtraggio dei pacchetti (Macchina 1).
Dato che stavo usando ssh
per inviare le richieste di ping, esiste una risoluzione del dominio (ma nessuna risoluzione del nome) a vultr.com
.
Filtro in base all'host
Per limitare l'acquisizione ai soli pacchetti relativi a un host specifico, possiamo utilizzare host
filtro
sudo tcpdump -i any -c5 -nn host 192.168.1.2
In questo esempio, tcpdump acquisisce e visualizza solo i pacchetti da e verso l'host 192.168.1.2
.
Filtro in base alla porta
Per filtrare i pacchetti in base al servizio o alla porta desiderati, utilizza la port
filtro. Ad esempio, acquisisci i pacchetti relativi a una sessione ssh utilizzando questo comando (porta 22 filtraggio):
sudo tcpdump -i any -c5 -nn port 22
Filtro basato su IP sorgente/nome host
Puoi anche filtrare i pacchetti in base all'indirizzo IP o al nome host di origine o destinazione. Ad esempio, per acquisire pacchetti dall'host 192.168.1.2
sudo tcpdump -i any -c 5 -nn src 192.168.1.2
Possiamo usare dst
per filtrare anche per IP/nome host di destinazione.
sudo tcpdump -i any -c 5 -nn src 172.168.1.2
Salva le acquisizioni dei pacchetti
Possiamo salvare i risultati delle acquisizioni dei pacchetti in un file per un'analisi successiva.
Per salvare i pacchetti in un file invece di visualizzarli sullo schermo, usa l'opzione -w
:
sudo tcpdump -i any -c 5 -nn -w sample.pcap port 22
Questo comando salva l'output in un file chiamato sample.pcap
. Il .pcap
l'estensione sta per "packet capture" ed è la convenzione per questo formato di file.
Conclusione
In questo tutorial, abbiamo imparato come eseguire l'acquisizione e il filtraggio dei pacchetti in base a diverse opzioni, utilizzando tcpdump
comando.