Quando la rete non funziona come dovrebbe o è semplicemente necessario capire cosa viene trasmesso attraverso i cavi, tcpdump viene in tuo aiuto. È come uno stetoscopio per il tuo server, uno strumento che ti permette di “ascoltare” il traffico di rete in tempo reale. Può sembrare complicato solo a prima vista, ma in realtà è un assistente molto potente e affidabile per gli amministratori di sistema e per qualsiasi utente Linux curioso.
In questo articolo non approfondiremo la teoria delle reti. Passiamo invece direttamente al sodo ed esaminiamo alcuni esempi concreti di comandi che potrete utilizzare nel vostro lavoro quotidiano. Imparerete a filtrare i pacchetti in base agli indirizzi IP, alle porte e ai tipi di protocollo, in modo da trovare rapidamente le informazioni necessarie nel mare dei dati di rete.
I nostri esempi vi aiuteranno a diagnosticare i problemi di connessione, a monitorare attività sospette o semplicemente a soddisfare la vostra curiosità su come i programmi comunicano tra loro. Cominciamo con i comandi più semplici e passiamo gradualmente a scenari di utilizzo più avanzati.
Tcpdump è un'utile utility di Linux per l'ascolto e l'analisi del traffico di rete, spesso utilizzata da amministratori e sviluppatori per capire cosa sta succedendo nella rete: ad esempio, perché un servizio non funziona, chi sta sovraccaricando il canale o se ci sono connessioni sospette. Con semplici comandi è possibile filtrare il traffico per IP, porte, protocolli o interfacce, salvarlo per un'ulteriore analisi o visualizzarlo in tempo reale. È come collegarsi a una conversazione tra computer e capire di cosa stanno parlando.
- Installazione
- Sintassi
- Opzioni
- Filtri
- Esempi di utilizzo
- Visualizzazione dell'elenco delle interfacce
- Acquisizione normale del traffico
- Acquisizione del traffico con l'opzione -v
- Opzioni -w e -r
- Filtraggio per IP
- Filtraggio per HOST
- L'applicazione del filtro and e or
- Filtro port e portrange
- Filtraggio per protocollo
- Filtro net
- Filtraggio in base alla dimensione del pacchetto
Installazione
La maggior parte degli sviluppatori di sistemi operativi basati su Linux include l'utilità tcpdump nell'elenco di quelle preinstallate, ma se per qualche motivo non è presente nella vostra distribuzione, potete sempre scaricarla e installarla tramite “Terminale”. Se il sistema operativo è basato su Debian, ovvero Ubuntu, Linux Mint, Kali Linux e simili, è necessario eseguire questo comando:
sudo apt install tcpdump
Durante l'installazione è necessario inserire una password. Si noti che durante la digitazione non viene visualizzata, inoltre per confermare l'installazione è necessario inserire il simbolo «D» e premere Invio.
Se si utilizza Red Hat, Fedora o CentOS, il comando per l'installazione sarà il seguente:
sudo yam install tcpdump
Una volta installata l'utilità, è possibile utilizzarla immediatamente. Di questo e di molto altro si parlerà più avanti nel testo.
Sintassi
Come qualsiasi altro comando, tcpdump ha una sua sintassi. Conoscendola, potrete impostare tutti i parametri necessari che saranno presi in considerazione durante l'esecuzione del comando. La sintassi è la seguente:
tcpdump opzioni -i interfaccia filtri
Quando si utilizza il comando, è necessario specificare l'interfaccia da monitorare. I filtri e le opzioni non sono variabili obbligatorie, ma consentono una configurazione più flessibile.
Opzioni
Sebbene non sia necessario specificare l'opzione, è comunque necessario elencare quelle disponibili. La tabella non mostra l'elenco completo, ma solo le più popolari, che sono comunque sufficienti per risolvere la maggior parte dei compiti assegnati.
| Opzione | Definizione |
|---|---|
| -A | Consente di ordinare i pacchetti in formato ASCII |
| -l | Aggiunge la funzione di scorrimento |
| -i | Dopo l'immissione, è necessario specificare l'interfaccia di rete che verrà monitorata. Per iniziare a monitorare tutte le interfacce, inserire la parola “any” dopo l'opzione. |
| -c | Termina il processo di tracciamento dopo aver verificato il numero specificato di pacchetti |
| -w | Genera un file di testo con il rapporto di verifica |
| -e | Mostra il livello di connessione Internet del pacchetto dati |
| -L | Visualizza solo i protocolli supportati dall'interfaccia di rete specificata |
| -C | Crea un altro file durante la registrazione del pacchetto, se la sua dimensione è superiore a quella specificata |
| -r | Apre il file di lettura creato con l'opzione -w |
| -j | Per la registrazione dei pacchetti verrà utilizzato il formato TimeStamp |
| -J | Consente di visualizzare tutti i formati TimeStamp disponibili |
| -G | Serve per creare un file con i log. L'opzione richiede anche l'indicazione di un valore temporale, al termine del quale verrà creato un nuovo log |
| -v, -vv, -vvv | A seconda del numero di caratteri nell'opzione, l'output del comando sarà più dettagliato (l'aumento è direttamente proporzionale al numero di caratteri) |
| -f | Nel risultato mostra il nome di dominio degli indirizzi IP |
| -F | Consente di leggere le informazioni non dall'interfaccia di rete, ma dal file specificato |
| -D | Mostra tutte le interfacce di rete che possono essere utilizzate |
| -n | Disattiva la visualizzazione dei nomi di dominio |
| -Z | Imposta l'utente sotto il cui account verranno creati tutti i file |
| -K | Omissione dell'analisi dei checksum |
| -q | Mostra informazioni sintetiche |
| -H | Consente di rilevare le intestazioni 802.11s |
| -I | Utilizzato durante l'acquisizione dei pacchetti in modalità monitor |
Dopo aver esaminato le opzioni, passeremo direttamente alle loro applicazioni. Per ora esamineremo i filtri.
Filtri
Come accennato all'inizio dell'articolo, è possibile aggiungere filtri alla sintassi di tcpdump. Di seguito vengono esaminati i più popolari:
| Filtro | Definizione |
|---|---|
| host | Serve per specificare il nome dell'host |
| net | Indica l'IP della sottorete e della rete |
| ip | Serve per specificare l'indirizzo del protocollo |
| src | Visualizza i pacchetti che sono stati inviati dall'indirizzo specificato |
| dst | Visualizza i pacchetti che sono stati ricevuti dall'indirizzo specificato |
| arp, udp, tcp | Filtraggio in base a uno dei protocolli |
| port | Visualizza le informazioni relative a una determinata porta |
| and, or | Serve per combinare più filtri in un comando |
| less, greater | Output di pacchetti inferiori o superiori alla dimensione specificata |
Tutti i filtri sopra elencati possono essere combinati tra loro, in modo che nel risultato del comando vedrete solo le informazioni che desiderate vedere. Per comprendere più dettagliatamente l'uso dei filtri sopra elencati, è opportuno fornire alcuni esempi.
Esempi di utilizzo
Di seguito sono riportate le opzioni di sintassi del comando tcpdump più utilizzate. Non è possibile elencarle tutte, poiché le loro varianti possono essere infinite.
Visualizzazione dell'elenco delle interfacce
Si consiglia a ogni utente di verificare inizialmente l'elenco di tutte le sue interfacce di rete che possono essere tracciate. Dalla tabella sopra riportata sappiamo che per farlo è necessario utilizzare l'opzione -D, pertanto, nel terminale eseguire il seguente comando:
sudo tcpdump -D
Esempio:
Come puoi notare, nell'esempio ci sono otto interfacce che possono essere visualizzate con il comando tcpdump. L'articolo fornirà esempi con ppp0, potete usare qualsiasi altro.
Acquisizione normale del traffico
Se è necessario monitorare una sola interfaccia di rete, è possibile farlo utilizzando l'opzione -i. Dopo averlo inserito, non dimenticare di specificare il nome dell'interfaccia. Ecco un esempio di esecuzione di tale comando:
sudo tcpdump -i ppp0
Attenzione: prima del comando stesso è necessario inserire “sudo”, poiché richiede i diritti di superutente.
Esempio:
Nota: dopo aver premuto Invio nel “Terminale”, i pacchetti intercettati verranno visualizzati ininterrottamente. Per interrompere il flusso, è necessario premere la combinazione di tasti Ctrl+C.
Se si esegue il comando senza opzioni e filtri aggiuntivi, verrà visualizzato il seguente formato di visualizzazione dei pacchetti tracciati:
22:18:52.597573 IP vrrp-topf2.p.mail.ru.https > 10.0.6.67.35482: Flags [P.], seq 1:595, ack 1118, win 6494, options [nop,nop,TS val 257060077 ecr 697597623], length 594
Dove è evidenziato in colore:
| Blu | Tempo di ricezione del pacchetto |
| Arancione | Versione del protocollo |
| Verde | Indirizzo del mittente |
| Viola | Indirizzo del destinatario |
| Grigio | Ulteriori informazioni su tcp |
| Rosso | Dimensione del pacchetto (visualizzata in byte) |
Questa sintassi può essere visualizzata nella finestra “Terminale” senza utilizzare opzioni aggiuntive.
Acquisizione del traffico con l'opzione -v
Come si può vedere dalla tabella, l'opzione -v permette di aumentare la quantità di informazioni. Analizziamo un esempio. Controlliamo la stessa interfaccia:
sudo tcpdump -v -i ppp0
Esempio:

Qui si può notare che nella stampa è apparsa la seguente riga:
IP (tos 0x0, ttl 58, id 30675, offset 0, flags [DF], proto TCP (6), length 52
Dove è evidenziato in colore:
| In arancione | Versione del protocollo |
| Blu | Durata del protocollo |
| Verde | Lunghezza dell'intestazione del campo |
| Viola | Versione del pacchetto tcp |
| In rosso | Dimensione del pacchetto (visualizzata in byte) |
Inoltre, nella sintassi del comando è possibile specificare l'opzione -vv oppure -vvv, che consentirà di aumentare ulteriormente la quantità di informazioni visualizzate sullo schermo.
Opzioni -w e -r
Nella tabella delle opzioni è stata menzionata la possibilità di salvare tutti i dati visualizzati in un file separato, in modo da poterli visualizzare in un secondo momento. Ciò è possibile grazie all'opzione -w. Usarla è piuttosto semplice, basta specificarla nel comando e poi inserire il nome del futuro file con l'estensione “.pcap”. Esaminiamo tutto con un esempio:
sudo tcpdump -i ppp0 -w file.pcap
Esempio:
Nota: durante la registrazione dei log nel file, sullo schermo del “Terminale” non viene visualizzato alcun testo.
Quando si desidera visualizzare l'output registrato, è necessario utilizzare l'opzione -r, dopo di che scrivere il nome del file precedentemente registrato. Si applica senza altre opzioni e filtri:
sudo tcpdump -r file.pcap
Esempio:

Entrambe queste opzioni sono ideali nei casi in cui è necessario salvare grandi quantità di testo per una successiva analisi.
Filtraggio per IP
Dalla tabella dei filtri sappiamo che dst consente di visualizzare sulla console solo i pacchetti che sono stati ricevuti dall'indirizzo specificato nella sintassi del comando. In questo modo è molto comodo visualizzare i pacchetti ricevuti dal computer. Per farlo, è sufficiente specificare il proprio indirizzo IP nel comando:
sudo tcpdump -i ppp0 ip dst 10.0.6.67
Esempio:
Come si può notare, oltre a dst, nel comando abbiamo anche specificato il filtro ip. In altre parole, abbiamo detto al computer che durante la selezione dei pacchetti deve prestare attenzione al loro indirizzo IP e non ad altri parametri.
È possibile filtrare i pacchetti inviati tramite IP. Nell'esempio riportiamo nuovamente il nostro IP. In altre parole, ora monitoreremo quali pacchetti vengono inviati dal nostro computer ad altri indirizzi. A tal fine, è necessario eseguire il seguente comando:
sudo tcpdump -i ppp0 ip src 10.0.6.67
Esempio:

Come potete notare, nella sintassi del comando abbiamo modificato il filtro dst su src, dicendo così alla macchina di cercare il mittente tramite IP.
Filtraggio per HOST
Analogamente all'IP nel comando, possiamo specificare il filtro host, per filtrare i pacchetti con l'host di interesse. Cioè, nella sintassi, invece dell'indirizzo IP del mittente/destinatario, sarà necessario specificare il suo host. Il risultato sarà il seguente:
sudo tcpdump -i ppp0 dst host google-public-dns-a.google.com
Esempio:
Nell'immagine si può vedere che in “Terminale” vengono visualizzati solo i pacchetti che sono stati inviati dal nostro IP all'host google.com. Come si può capire, al posto dell'host google è possibile inserirne qualsiasi altro.
Come nel caso del filtraggio per IP, nella sintassi dst può essere sostituita con src, per visualizzare i pacchetti inviati al tuo computer:
sudo tcpdump -i ppp0 src host google-public-dns-a.google.com
Attenzione: il filtro host deve essere posizionato dopo dst o src, altrimenti il comando genererà un errore. Nel caso del filtraggio per IP, al contrario, dst e src precedono il filtro ip.
L'applicazione del filtro and e or
Se si rende necessario utilizzare più filtri contemporaneamente in un unico comando, è necessario applicare il filtro and oppure or (a seconda dei casi). Specificando i filtri nella sintassi e separandoli con questo operatore, li si “costringerà” a funzionare come uno solo. Nell'esempio, appare come segue:
sudo tcpdump -i ppp0 ip dst 95.47.144.254 or ip src 95.47.144.254
Esempio:
Dalla sintassi del comando si evince che desideriamo visualizzare sullo schermo «Terminale» tutti i pacchetti che sono stati inviati all'indirizzo 95.47.144.254 e i pacchetti ricevuti dallo stesso indirizzo. È anche possibile modificare alcune variabili in questa espressione. Ad esempio, invece di IP, specificare HOST o sostituire direttamente gli indirizzi stessi.
Filtro port e portrange
Filtro port è perfetto quando serve ottenere informazioni sui pacchetti con una porta specifica. Quindi, se vuoi vedere solo le risposte o le richieste DNS, devi specificare la porta 53:
sudo tcpdump -vv -i ppp0 port 53
Esempio:
Se si desidera visualizzare i pacchetti http, è necessario inserire la porta 80:
sudo tcpdump -vv -i ppp0 port 80
Esempio:
Tra le altre cose, è possibile monitorare contemporaneamente un intervallo di porte. A tal fine si utilizza un filtro portrange:
sudo tcpdump portrange 50-80
Come si può notare, in combinazione con il filtro portrange non è necessario specificare opzioni aggiuntive. È sufficiente impostare l'intervallo.
Filtraggio per protocollo
È anche possibile visualizzare solo il traffico che corrisponde a un determinato protocollo. A tal fine, è necessario utilizzare come filtro il nome del protocollo stesso. Analizziamo l'esempio udp:
sudo tcpdump -vvv -i ppp0 udp
Esempio:

Come si può vedere nell'immagine, dopo aver eseguito il comando in “Terminale” sono stati visualizzati solo i pacchetti con il protocollo udp. Di conseguenza, è possibile effettuare il filtraggio anche in base ad altri criteri, ad esempio arp:
sudo tcpdump -vvv -i ppp0 arp
o tcp:
sudo tcpdump -vvv -i ppp0 tcp
Filtro net
Operatore net aiuta a filtrare i pacchetti in base alla loro rete. È facile da usare come gli altri: basta specificare l'attributo nella sintassi net, dopo di che inserire l'indirizzo di rete. Ecco un esempio di tale comando:)
sudo tcpdump -i ppp0 net 192.168.1.1
Esempio:
Filtraggio in base alla dimensione del pacchetto
Non abbiamo ancora esaminato altri due filtri interessanti: less e greater. Dalla tabella dei filtri sappiamo che servono per visualizzare i pacchetti di dati più grandi ()less o inferiore (greater della dimensione specificata dopo l'inserimento dell'attributo.
Supponiamo di voler monitorare solo i pacchetti che non superano i 50 bit, quindi il comando sarà il seguente:
sudo tcpdump -i ppp0 less 50
Esempio:

Ora visualizziamo in “Terminale” pacchetti di dimensioni superiori a 50 bit:
sudo tcpdump -i ppp0 greater 50
Esempio:
Come si può notare, vengono utilizzati allo stesso modo, l'unica differenza è nel nome del filtro.
Come puoi vedere, tcpdump è uno strumento incredibilmente potente per chi ha bisogno di dare un'occhiata sotto il cofano dell'interazione di rete. Permette di vedere in tempo reale ciò che viene effettivamente trasmesso via cavo o via etere, trasformando i problemi di rete astratti in dati concreti che possono essere analizzati.
Inizia con comandi semplici, come il filtraggio per porta o indirizzo IP. Man mano che acquisisci esperienza, potrai creare filtri più complessi per intercettare con precisione i pacchetti desiderati. Non aver paura di sperimentare sul tuo computer di prova: è il modo migliore per capire come funziona tutto.
In definitiva, la capacità di utilizzare tcpdump è una superpotenza per un amministratore di sistema o uno sviluppatore. Offre indipendenza nella diagnosi dei problemi, che si tratti di un errore di connessione, di attività sospette o semplicemente del desiderio di comprendere la logica di funzionamento di un determinato servizio di rete. Questo strumento diventerà un affidabile alleato nel tuo arsenale.









