In qualità di amministratore di rete, la risoluzione dei problemi di rete fa parte della tua attività quotidiana. Uno strumento indispensabile quando si lavora su problemi relativi alla rete è il comando tcpdump Linux.
Questo tutorial ti guiderà attraverso alcuni esempi del mondo reale di come tcpdump può aiutarti a diagnosticare problemi di rete comuni. Alla fine di questo tutorial, avrai una migliore comprensione di come sfruttare tcpdump per risolvere i tuoi problemi di rete.
Prerequisiti
Questo tutorial sarà una dimostrazione pratica. Se desideri continuare, assicurati di avere una macchina Linux. Questo tutorial utilizza Ubuntu 20.04, ma qualsiasi distribuzione Linux moderna funzionerà.
Installazione dello strumento Linux tcpdump
La maggior parte delle moderne distribuzioni Linux, in particolare i server, hanno già tcpdump. In caso contrario, non preoccuparti perché l'installazione è rapida e senza sudore.
1. Accedi al tuo computer Linux utilizzando il tuo client SSH preferito.
2. Innanzitutto, controlla se tcpdump è già installato eseguendo il comando seguente.
sudo apt list --installed tcpdump
Se tcpdump esiste sulla tua macchina, vedrai un output simile allo screenshot qui sotto.
Se tcpdump non esiste, otterrai invece il risultato seguente.
3. Dopo aver verificato che tcpdump non è installato, esegui i comandi seguenti per installarlo.
# Update the package index
sudo apt update -y
# Install tcpdump
sudo apt install tcpdump -y
4. Infine, controlla la versione di tcpdump installata eseguendo il comando seguente.
tcpdump --version
Al momento della stesura di questo articolo, l'ultima versione di tcpdump dal repository di Ubuntu è la 4.9.3.
Acquisizione del traffico dei pacchetti sull'interfaccia predefinita
L'uso principale di tcpdump è l'acquisizione di pacchetti. Grazie alla libreria pcap, lo strumento può acquisire pacchetti da diversi tipi di rete, come Ethernet, Wi-Fi, PPP, ecc.
La sintassi per la forma base del comando tcpdump è la seguente.
tcpdump [options] [expression]
Dove:
options
:Imposta varie opzioni di tcpdump. Le opzioni controllano come tcpdump acquisisce e visualizza i pacchetti.expression
:Filtra o specifica il tipo di traffico da acquisire. Le espressioni sono discusse più dettagliatamente più avanti in questo tutorial.
Il caso d'uso più semplice per tcpdump è acquisire tutto il traffico sull'interfaccia di rete predefinita e visualizzare i dati sull'output standard.
Esegui tcpdump
comando senza opzioni o espressioni per acquisire tutto il traffico sulla tua interfaccia predefinita.
sudo tcpdump
Devi eseguire tcpdump come root o con il prefisso sudo perché l'accesso alle interfacce di rete è un'operazione privilegiata.
Il tcpdump
lo strumento acquisisce i pacchetti e stampa l'output sul terminale, come mostrato di seguito. Quando ritieni di aver catturato abbastanza pacchetti, premi CTRL+C
per interrompere l'acquisizione.
Limitazione del numero di acquisizioni di pacchetti
Il tcpdump
Il comando Linux può sovraccaricare rapidamente il tuo terminale di output ed è meglio acquisire solo una piccola quantità di dati alla volta.
Puoi includere il -c
opzione per specificare il numero di pacchetti tcpdump
dovrebbe catturare prima che esca. Questa opzione è spesso applicabile quando desideri acquisire solo una piccola quantità di dati per l'analisi.
Per farlo, esegui il comando seguente e cambia il numero dopo -c
opzione. Questo esempio acquisisce solo fino a 10 pacchetti e termina automaticamente.
sudo tcpdump -c 10
Aumento della verbosità
Durante l'acquisizione dei pacchetti, è possibile che, a volte, l'output predefinito non contenga o mostri informazioni approfondite. Fortunatamente, lo strumento tcpdump Linux ti offre tre livelli di verbosità rappresentati dai flag -v, -vv e -vvv.
Quando si utilizzano queste opzioni, tcpdump
analizza e stampa molte più informazioni per ogni pacchetto, come il tempo per vivere (TTL), l'identificazione, ecc.
# Verbose
sudo tcpdump -v
# Even more verbose
sudo tcpdump -vv
# Most verbose
sudo tcpdump -vvv
Per una migliore prospettiva, fai riferimento alle immagini sottostanti confrontando la differenza di dettaglio tra -v
e -vvv
.
Acquisizione di pacchetti su un'interfaccia specifica o su tutte
Nell'esempio precedente, tcpdump stava acquisendo pacchetti sull'interfaccia di rete predefinita, il che significa che hai solo un'interfaccia a cui pensare. Ma cosa succede se si dispone di più interfacce e si desidera acquisire il traffico su un'interfaccia specifica o su tutte le interfacce?
Il comando tcpdump Linux consente di specificare quale interfaccia di rete acquisire utilizzando il flag -i. Questo flag accetta il nome dell'interfaccia come valore, il che significa che devi prima conoscere il nome dell'interfaccia.
1. Eseguire il comando tcpdump con l'opzione -D per stampare un elenco di tutte le interfacce disponibili sulla macchina.
sudo tcpdump -D
Come puoi vedere di seguito, ci sono sette interfacce su questa macchina. Il tuo computer potrebbe avere un diverso set di interfacce di rete. Questo esempio si concentra solo sulle interfacce di rete ethernet, in particolare eth0 ed eth1.
2. Quindi, esegui il comando seguente per iniziare a catturare i pacchetti sull'interfaccia specifica che desideri. Questo esempio acquisisce l'interfaccia eth1. Inoltre, per limitare il numero di pacchetti catturati, il comando seguente usa il flag -c seguito dal conteggio.
sudo tcpdump -i eth1 -c 5
3. Invece di specificare un'interfaccia, puoi anche acquisire pacchetti su tutte le interfacce contemporaneamente. Per fare ciò, imposta any come valore del parametro per -i.
sudo tcpdump -i any -c 5
Perché vorresti acquisire pacchetti su tutte le interfacce? Ecco alcuni motivi comuni.
Per prima cosa, l'acquisizione del traffico su tutte le interfacce ti consente di vedere tutto il traffico che passa attraverso il tuo sistema, anche se non è destinato al tuo sistema.
Inoltre, puoi vedere quali servizi e protocolli passano attraverso la tua rete. Queste informazioni possono essere utili durante la configurazione delle regole del firewall o di altre misure di sicurezza, in particolare durante la creazione di nuovi server.
Aggiunta di filtri al comando Linux tcpdump
L'acquisizione selvaggia di pacchetti non è sempre l'approccio migliore. La quantità di dati può creare confusione e ostacolare la risoluzione dei problemi. Come mai? Perché potresti acquisire traffico non pertinente alla situazione.
I filtri sono utili in queste situazioni. Lo strumento tcpdump ha molti filtri incorporati per acquisire specifici tipi di traffico. Puoi combinare questi filtri per catturare solo il traffico pertinente. Di seguito sono riportati alcuni esempi.
Filtraggio per numero di porta
Ad esempio, se stai risolvendo un problema con il server SSH, probabilmente non ti interessano altri tipi di traffico che passano attraverso la tua rete.
Esegui il comando seguente per acquisire tutto il traffico destinato alla porta 22
, la porta SSH predefinita.
sudo tcpdump -c 5 port 22
Come puoi vedere, lo strumento ha catturato solo il traffico sulla porta 22 come origine o destinazione.
Che ne dici se sei interessato solo al traffico HTTP? Devi solo sostituire il numero di porta con la tua porta HTTP, che per impostazione predefinita è la porta 80.
sudo tcpdump -c 1 port 80
Nota:lo strumento tcpdump è abbastanza intelligente da riconoscere i nomi dei protocolli di servizio al posto dei numeri di porta. Ad esempio, invece di specificare la porta 22 per filtrare il traffico SSH, puoi invece specificare la porta ssh. Lo stesso vale per la porta 80 per il traffico HTTP, la porta http.
Filtraggio per protocollo
Non lasciare che il nome tcpdump
ingannarti nel pensare che funzioni solo con il traffico TCP. Questo strumento può anche acquisire traffico non TCP come ICMP o UDP.
Ad esempio, il comando seguente acquisisce i pacchetti da qualsiasi interfaccia ma filtra solo il traffico UDP.
sudo tcpdump -i any -c 5 udp
Di conseguenza, i risultati seguenti mostrano solo il traffico UDP, che sembra essere pacchetti relativi alle operazioni NTP e DNS.
E se avessi solo bisogno di acquisire il traffico relativo al DNS? In tal caso, puoi combinare i filtri udp
e port 53
. In questo modo, l'output previsto dovrebbe mostrare solo i pacchetti relativi al DNS.
sudo tcpdump -i any -c 5 udp port 53
Questa volta, hai catturato solo il traffico relativo al DNS (A, PTR, ricerca AAA e risposta) limitato al protocollo di trasporto UDP.
Sospetti che si stia verificando un attacco ping flood nella tua rete? Perché non provi a trovare la fonte e la destinazione usando tcpdump
? Per fare ciò, esegui il comando seguente per ascoltare su qualsiasi interfaccia per il traffico ICMP.
Il -n
flag impedisce a tcpdump di tentare di risolvere i nomi host e mostra invece gli indirizzi IP. In questo tipo di situazione, bypassare la risoluzione dei nomi può migliorare le prestazioni.
sudo tcpdump -n -i any icmp
Potresti aver già realizzato che il tcpdump
i filtri sono potenti e flessibili. Combinando diversi filtri, puoi catturare il traffico pertinente al risultato desiderato.
Per maggiori informazioni sui filtri tcpdump, consulta la pagina man di tcpdump.
Salvataggio dei pacchetti acquisiti su un file su disco
La visualizzazione di acquisizioni di pacchetti sullo schermo al volo va bene per acquisizioni brevi. Ma se stai generando enormi acquisizioni di pacchetti, l'output sullo schermo non è più pratico. Hai bisogno di un modo per esportare i dati acquisiti in un file per un'analisi o una condivisione successive.
Fortunatamente, tcpdump supporta la possibilità di salvare i pacchetti acquisiti in un file su disco. Devi specificare l'opzione -w seguita dal percorso del file.
Esegui il comando seguente per salvare tutto il traffico che passa attraverso il tuo sistema in un file chiamato /tmp/capture.pcap. Questo comando è in ascolto su qualsiasi interfaccia e cattura un massimo di 20 pacchetti prima di uscire automaticamente.
sudo tcpdump -i any -w /tmp/capture.pcap -vv -c 20
Ora hai il file di acquisizione del pacchetto e, quando necessario, puoi rileggere il file nel terminale. Per leggere l'acquisizione di un pacchetto da un file, aggiungi il -r
opzione seguita dal nome del file di acquisizione del pacchetto.
sudo tcpdump -r /tmp/capture.pcap
Conclusione
Questo tutorial ti ha insegnato a catturare e analizzare il traffico di rete usando il comando tcpdump Linux. Hai utilizzato opzioni comuni e filtri combinati per generare acquisizioni di pacchetti accurate. Hai anche utilizzato lo strumento per acquisire i pacchetti da archiviare per un'analisi successiva e rileggere il file nel terminale.
Lo strumento tcpdump Linux è essenziale nella cassetta degli attrezzi di ogni amministratore di rete. Le conoscenze acquisite in questo tutorial ti aiutano a diventare efficace ed efficiente nella risoluzione dei problemi di rete.