GNU/Linux >> Linux Esercitazione >  >> Linux

Un'introduzione all'uso di tcpdump nella riga di comando di Linux

Nella mia esperienza come amministratore di sistema, ho spesso riscontrato problemi di connettività di rete difficili da risolvere. Per queste situazioni, tcpdump è un ottimo alleato.

Il terminale Linux

  • I 7 migliori emulatori di terminale per Linux
  • 10 strumenti da riga di comando per l'analisi dei dati in Linux
  • Scarica ora:cheat sheet SSH
  • Cheat sheet sui comandi avanzati di Linux
  • Esercitazioni sulla riga di comando di Linux

Tcpdump è un'utilità della riga di comando che consente di acquisire e analizzare il traffico di rete che passa attraverso il sistema. Viene spesso utilizzato per risolvere i problemi di rete, nonché come strumento di sicurezza.

Uno strumento potente e versatile che include molte opzioni e filtri, tcpdump può essere utilizzato in una varietà di casi. Trattandosi di uno strumento da riga di comando, è l'ideale da eseguire in server remoti o dispositivi per i quali non è disponibile una GUI, per raccogliere dati che possono essere analizzati in seguito. Può anche essere avviato in background o come lavoro pianificato utilizzando strumenti come cron.

In questo articolo, esamineremo alcune delle funzionalità più comuni di tcpdump.

1. Installazione su Linux

Tcpdump è incluso in diverse distribuzioni Linux, quindi è probabile che tu l'abbia già installato. Verifica se tcpdump è installato sul tuo sistema con il seguente comando:

$ which tcpdump
/usr/sbin/tcpdump

Se tcpdump non è installato, puoi installarlo ma usando il gestore di pacchetti della tua distribuzione. Ad esempio, su CentOS o Red Hat Enterprise Linux, in questo modo:

$ sudo dnf install -y tcpdump

Tcpdump richiede libpcap , che è una libreria per l'acquisizione di pacchetti di rete. Se non è installato, verrà aggiunto automaticamente come dipendenza.

Sei pronto per iniziare a catturare alcuni pacchetti.

2. Catturare i pacchetti con tcpdump

Per acquisire pacchetti per la risoluzione dei problemi o l'analisi, tcpdump richiede autorizzazioni elevate, quindi negli esempi seguenti la maggior parte dei comandi è preceduta da sudo .

Per iniziare, usa il comando tcpdump --list-interfaces (o -D in breve) per vedere quali interfacce sono disponibili per l'acquisizione:

$ sudo tcpdump -D
1.eth0
2.virbr0
3.eth1
4.any (Pseudo-device that captures on all interfaces)
5.lo [Loopback]

Nell'esempio sopra, puoi vedere tutte le interfacce disponibili nella mia macchina. L'interfaccia speciale any consente di acquisire in qualsiasi interfaccia attiva.

Usiamolo per iniziare a catturare alcuni pacchetti. Cattura tutti i pacchetti in qualsiasi interfaccia eseguendo questo comando:

$ sudo tcpdump --interface any
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
09:56:18.293641 IP rhel75.localdomain.ssh > 192.168.64.1.56322: Flags [P.], seq 3770820720:3770820916, ack 3503648727, win 309, options [nop,nop,TS val 76577898 ecr 510770929], length 196
09:56:18.293794 IP 192.168.64.1.56322 > rhel75.localdomain.ssh: Flags [.], ack 196, win 391, options [nop,nop,TS val 510771017 ecr 76577898], length 0
09:56:18.295058 IP rhel75.59883 > gateway.domain: 2486+ PTR? 1.64.168.192.in-addr.arpa. (43)
09:56:18.310225 IP gateway.domain > rhel75.59883: 2486 NXDomain* 0/1/0 (102)
09:56:18.312482 IP rhel75.49685 > gateway.domain: 34242+ PTR? 28.64.168.192.in-addr.arpa. (44)
09:56:18.322425 IP gateway.domain > rhel75.49685: 34242 NXDomain* 0/1/0 (103)
09:56:18.323164 IP rhel75.56631 > gateway.domain: 29904+ PTR? 1.122.168.192.in-addr.arpa. (44)
09:56:18.323342 IP rhel75.localdomain.ssh > 192.168.64.1.56322: Flags [P.], seq 196:584, ack 1, win 309, options [nop,nop,TS val 76577928 ecr 510771017], length 388
09:56:18.323563 IP 192.168.64.1.56322 > rhel75.localdomain.ssh: Flags [.], ack 584, win 411, options [nop,nop,TS val 510771047 ecr 76577928], length 0
09:56:18.335569 IP gateway.domain > rhel75.56631: 29904 NXDomain* 0/1/0 (103)
09:56:18.336429 IP rhel75.44007 > gateway.domain: 61677+ PTR? 98.122.168.192.in-addr.arpa. (45)
09:56:18.336655 IP gateway.domain > rhel75.44007: 61677* 1/0/0 PTR rhel75. (65)
09:56:18.337177 IP rhel75.localdomain.ssh > 192.168.64.1.56322: Flags [P.], seq 584:1644, ack 1, win 309, options [nop,nop,TS val 76577942 ecr 510771047], length 1060

---- SKIPPING LONG OUTPUT -----

09:56:19.342939 IP 192.168.64.1.56322 > rhel75.localdomain.ssh: Flags [.], ack 1752016, win 1444, options [nop,nop,TS val 510772067 ecr 76578948], length 0
^C
9003 packets captured
9010 packets received by filter
7 packets dropped by kernel
$

Tcpdump continua a catturare i pacchetti finché non riceve un segnale di interruzione. Puoi interrompere l'acquisizione premendo Ctrl+C . Come puoi vedere in questo esempio, tcpdump catturato più di 9.000 pacchetti. In questo caso, poiché sono connesso a questo server usando ssh , tcpdump ha catturato tutti questi pacchetti. Per limitare il numero di pacchetti catturati e fermare tcpdump , usa il -c (per contare ) opzione:

$ sudo tcpdump -i any -c 5
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:21:30.242740 IP rhel75.localdomain.ssh > 192.168.64.1.56322: Flags [P.], seq 3772575680:3772575876, ack 3503651743, win 309, options [nop,nop,TS val 81689848 ecr 515883153], length 196
11:21:30.242906 IP 192.168.64.1.56322 > rhel75.localdomain.ssh: Flags [.], ack 196, win 1443, options [nop,nop,TS val 515883235 ecr 81689848], length 0
11:21:30.244442 IP rhel75.43634 > gateway.domain: 57680+ PTR? 1.64.168.192.in-addr.arpa. (43)
11:21:30.244829 IP gateway.domain > rhel75.43634: 57680 NXDomain 0/0/0 (43)
11:21:30.247048 IP rhel75.33696 > gateway.domain: 37429+ PTR? 28.64.168.192.in-addr.arpa. (44)
5 packets captured
12 packets received by filter
0 packets dropped by kernel
$

In questo caso, tcpdump ha interrotto l'acquisizione automaticamente dopo l'acquisizione di cinque pacchetti. Ciò è utile in diversi scenari, ad esempio, se stai risolvendo i problemi di connettività e se è sufficiente acquisire alcuni pacchetti iniziali. Ciò è ancora più utile quando applichiamo filtri per acquisire pacchetti specifici (mostrati di seguito).

Per impostazione predefinita, tcpdump risolve gli indirizzi IP e le porte in nomi, come mostrato nell'esempio precedente. Durante la risoluzione dei problemi di rete, è spesso più semplice utilizzare gli indirizzi IP ei numeri di porta; disabilitare la risoluzione dei nomi utilizzando l'opzione -n e risoluzione della porta con -nn :

$ sudo tcpdump -i any -c5 -nn
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
23:56:24.292206 IP 192.168.64.28.22 > 192.168.64.1.35110: Flags [P.], seq 166198580:166198776, ack 2414541257, win 309, options [nop,nop,TS val 615664 ecr 540031155], length 196
23:56:24.292357 IP 192.168.64.1.35110 > 192.168.64.28.22: Flags [.], ack 196, win 1377, options [nop,nop,TS val 540031229 ecr 615664], length 0
23:56:24.292570 IP 192.168.64.28.22 > 192.168.64.1.35110: Flags [P.], seq 196:568, ack 1, win 309, options [nop,nop,TS val 615664 ecr 540031229], length 372
23:56:24.292655 IP 192.168.64.1.35110 > 192.168.64.28.22: Flags [.], ack 568, win 1400, options [nop,nop,TS val 540031229 ecr 615664], length 0
23:56:24.292752 IP 192.168.64.28.22 > 192.168.64.1.35110: Flags [P.], seq 568:908, ack 1, win 309, options [nop,nop,TS val 615664 ecr 540031229], length 340
5 packets captured
6 packets received by filter
0 packets dropped by kernel

Come mostrato sopra, l'output di acquisizione ora mostra gli indirizzi IP ei numeri di porta. Ciò impedisce inoltre a tcpdump di eseguire ricerche DNS, il che aiuta a ridurre il traffico di rete durante la risoluzione dei problemi di rete.

Ora che sei in grado di acquisire pacchetti di rete, esploriamo il significato di questo output.

3. Comprendere il formato di output

Tcpdump è in grado di acquisire e decodificare molti protocolli diversi, come TCP, UDP, ICMP e molti altri. Anche se non possiamo coprirli tutti qui, per aiutarti a iniziare, esploriamo il pacchetto TCP. Puoi trovare maggiori dettagli sui diversi formati di protocollo nelle pagine di manuale di tcpdump. Un tipico pacchetto TCP catturato da tcpdump è simile al seguente:

08:41:13.729687 IP 192.168.64.28.22 > 192.168.64.1.41916: Flags [P.], seq 196:568, ack 1, win 309, options [nop,nop,TS val 117964079 ecr 816509256], length 372

I campi possono variare a seconda del tipo di pacchetto inviato, ma questo è il formato generale.

Il primo campo, 08:41:13.729687, 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, 192.168.64.28.22 , è l'indirizzo IP e la porta di origine. Questo è seguito dall'indirizzo IP e dalla porta di destinazione, rappresentato da 192.168.64.1.41916 .

Dopo l'origine e la destinazione, puoi trovare i flag TCP Flags [P.] . I valori tipici per questo campo includono:

Valore Tipo di bandiera Descrizione
S SYN Inizio connessione
V FIN Fine connessione
P PUSH Pubblicazione dati
R RST Reimpostazione connessione
. ACK Riconoscimento

Questo campo può anche essere una combinazione di questi valori, come [S.] per un SYN-ACK pacchetto.

Il prossimo è il numero di sequenza dei dati contenuti nel pacchetto. Per il primo pacchetto catturato, questo è un numero assoluto. I pacchetti successivi utilizzano un numero relativo per renderlo più facile da seguire. In questo esempio, la sequenza è seq 196:568, il che significa che questo pacchetto contiene i byte da 196 a 568 di questo flusso.

Questo è seguito dal numero Ack:ack 1 . In questo caso, è 1 poiché questo è il lato che invia i dati. Per il lato che riceve i dati, questo campo rappresenta il successivo byte previsto (dati) su questo flusso. Ad esempio, il numero Ack per il pacchetto successivo in questo flusso sarebbe 568.

Il campo successivo è la dimensione della finestra win 309 , che rappresenta il numero di byte disponibili nel buffer di ricezione, seguito da opzioni TCP come MSS (Maximum Segment Size) o Window Scale. Per i dettagli sulle opzioni del protocollo TCP, consultare i parametri del protocollo TCP (Transmission Control Protocol).

Infine, abbiamo la lunghezza del pacchetto, length 372 , che rappresenta la lunghezza, in byte, dei dati del carico utile. La lunghezza è la differenza tra l'ultimo e il primo byte nel numero di sequenza.

Ora impariamo come filtrare i pacchetti per restringere i risultati e semplificare la risoluzione di problemi specifici.

4. Pacchetti filtranti

Come accennato in precedenza, tcpdump può acquisire troppi pacchetti, alcuni dei quali non sono nemmeno correlati al problema che stai risolvendo. Ad esempio, se stai risolvendo un problema di connettività con un server web non sei interessato al traffico SSH, quindi rimuovere i pacchetti SSH dall'output semplifica il lavoro sul vero problema.

Una delle funzionalità più potenti di tcpdump è la sua capacità di filtrare i pacchetti acquisiti utilizzando una varietà di parametri, come indirizzi IP di origine e destinazione, porte, protocolli, ecc. Diamo un'occhiata ad alcuni dei più comuni.

Protocollo

Per filtrare i pacchetti in base al protocollo, specificando il protocollo nella riga di comando. Ad esempio, acquisisci pacchetti ICMP solo utilizzando questo comando:

$ sudo tcpdump -i any -c5 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

In un terminale diverso, prova a eseguire il ping su un'altra macchina:

$ ping opensource.com
PING opensource.com (54.204.39.132) 56(84) bytes of data.
64 bytes from ec2-54-204-39-132.compute-1.amazonaws.com (54.204.39.132): icmp_seq=1 ttl=47 time=39.6 ms

Tornando all'acquisizione di tcpdump, si noti che tcpdump acquisisce e visualizza solo i pacchetti relativi a ICMP. In questo caso, tcpdump non visualizza i pacchetti di risoluzione dei nomi generati durante la risoluzione del nome opensource.com :

09:34:20.136766 IP rhel75 > ec2-54-204-39-132.compute-1.amazonaws.com: ICMP echo request, id 20361, seq 1, length 64
09:34:20.176402 IP ec2-54-204-39-132.compute-1.amazonaws.com > rhel75: ICMP echo reply, id 20361, seq 1, length 64
09:34:21.140230 IP rhel75 > ec2-54-204-39-132.compute-1.amazonaws.com: ICMP echo request, id 20361, seq 2, length 64
09:34:21.180020 IP ec2-54-204-39-132.compute-1.amazonaws.com > rhel75: ICMP echo reply, id 20361, seq 2, length 64
09:34:22.141777 IP rhel75 > ec2-54-204-39-132.compute-1.amazonaws.com: ICMP echo request, id 20361, seq 3, length 64
5 packets captured
5 packets received by filter
0 packets dropped by kernel

Ospite

Limita l'acquisizione ai soli pacchetti relativi a un host specifico utilizzando host filtro:

$ sudo tcpdump -i any -c5 -nn host 54.204.39.132
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
09:54:20.042023 IP 192.168.122.98.39326 > 54.204.39.132.80: Flags [S], seq 1375157070, win 29200, options [mss 1460,sackOK,TS val 122350391 ecr 0,nop,wscale 7], length 0
09:54:20.088127 IP 54.204.39.132.80 > 192.168.122.98.39326: Flags [S.], seq 1935542841, ack 1375157071, win 28960, options [mss 1460,sackOK,TS val 522713542 ecr 122350391,nop,wscale 9], length 0
09:54:20.088204 IP 192.168.122.98.39326 > 54.204.39.132.80: Flags [.], ack 1, win 229, options [nop,nop,TS val 122350437 ecr 522713542], length 0
09:54:20.088734 IP 192.168.122.98.39326 > 54.204.39.132.80: Flags [P.], seq 1:113, ack 1, win 229, options [nop,nop,TS val 122350438 ecr 522713542], length 112: HTTP: GET / HTTP/1.1
09:54:20.129733 IP 54.204.39.132.80 > 192.168.122.98.39326: Flags [.], ack 113, win 57, options [nop,nop,TS val 522713552 ecr 122350438], length 0
5 packets captured
5 packets received by filter
0 packets dropped by kernel

In questo esempio, tcpdump acquisisce e visualizza solo i pacchetti da e verso l'host 54.204.39.132 .

Porto

Per filtrare i pacchetti in base al servizio o alla porta desiderati, utilizza la port filtro. Ad esempio, acquisisci i pacchetti relativi a un servizio Web (HTTP) utilizzando questo comando:

$ sudo tcpdump -i any -c5 -nn port 80
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
09:58:28.790548 IP 192.168.122.98.39330 > 54.204.39.132.80: Flags [S], seq 1745665159, win 29200, options [mss 1460,sackOK,TS val 122599140 ecr 0,nop,wscale 7], length 0
09:58:28.834026 IP 54.204.39.132.80 > 192.168.122.98.39330: Flags [S.], seq 4063583040, ack 1745665160, win 28960, options [mss 1460,sackOK,TS val 522775728 ecr 122599140,nop,wscale 9], length 0
09:58:28.834093 IP 192.168.122.98.39330 > 54.204.39.132.80: Flags [.], ack 1, win 229, options [nop,nop,TS val 122599183 ecr 522775728], length 0
09:58:28.834588 IP 192.168.122.98.39330 > 54.204.39.132.80: Flags [P.], seq 1:113, ack 1, win 229, options [nop,nop,TS val 122599184 ecr 522775728], length 112: HTTP: GET / HTTP/1.1
09:58:28.878445 IP 54.204.39.132.80 > 192.168.122.98.39330: Flags [.], ack 113, win 57, options [nop,nop,TS val 522775739 ecr 122599184], length 0
5 packets captured
5 packets received by filter
0 packets dropped by kernel

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.122.98 :

$ sudo tcpdump -i any -c5 -nn src 192.168.122.98
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:02:15.220824 IP 192.168.122.98.39436 > 192.168.122.1.53: 59332+ A? opensource.com. (32)
10:02:15.220862 IP 192.168.122.98.39436 > 192.168.122.1.53: 20749+ AAAA? opensource.com. (32)
10:02:15.364062 IP 192.168.122.98.39334 > 54.204.39.132.80: Flags [S], seq 1108640533, win 29200, options [mss 1460,sackOK,TS val 122825713 ecr 0,nop,wscale 7], length 0
10:02:15.409229 IP 192.168.122.98.39334 > 54.204.39.132.80: Flags [.], ack 669337581, win 229, options [nop,nop,TS val 122825758 ecr 522832372], length 0
10:02:15.409667 IP 192.168.122.98.39334 > 54.204.39.132.80: Flags [P.], seq 0:112, ack 1, win 229, options [nop,nop,TS val 122825759 ecr 522832372], length 112: HTTP: GET / HTTP/1.1
5 packets captured
5 packets received by filter
0 packets dropped by kernel

Si noti che tcpdumps cattura i pacchetti con l'indirizzo IP di origine 192.168.122.98 per più servizi come la risoluzione dei nomi (porta 53) e HTTP (porta 80). I pacchetti di risposta non vengono visualizzati poiché il loro IP di origine è diverso.

Al contrario, puoi utilizzare il dst filtro per filtrare per IP/nome host di destinazione:

$ sudo tcpdump -i any -c5 -nn dst 192.168.122.98
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:05:03.572931 IP 192.168.122.1.53 > 192.168.122.98.47049: 2248 1/0/0 A 54.204.39.132 (48)
10:05:03.572944 IP 192.168.122.1.53 > 192.168.122.98.47049: 33770 0/0/0 (32)
10:05:03.621833 IP 54.204.39.132.80 > 192.168.122.98.39338: Flags [S.], seq 3474204576, ack 3256851264, win 28960, options [mss 1460,sackOK,TS val 522874425 ecr 122993922,nop,wscale 9], length 0
10:05:03.667767 IP 54.204.39.132.80 > 192.168.122.98.39338: Flags [.], ack 113, win 57, options [nop,nop,TS val 522874436 ecr 122993972], length 0
10:05:03.672221 IP 54.204.39.132.80 > 192.168.122.98.39338: Flags [P.], seq 1:643, ack 113, win 57, options [nop,nop,TS val 522874437 ecr 122993972], length 642: HTTP: HTTP/1.1 302 Found
5 packets captured
5 packets received by filter
0 packets dropped by kernel

Espressioni complesse

Puoi anche combinare i filtri usando gli operatori logici and e or per creare espressioni più complesse. Ad esempio, per filtrare i pacchetti dall'indirizzo IP di origine 192.168.122.98 e solo servizio HTTP, usa questo comando:

$ sudo tcpdump -i any -c5 -nn src 192.168.122.98 and port 80
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:08:00.472696 IP 192.168.122.98.39342 > 54.204.39.132.80: Flags [S], seq 2712685325, win 29200, options [mss 1460,sackOK,TS val 123170822 ecr 0,nop,wscale 7], length 0
10:08:00.516118 IP 192.168.122.98.39342 > 54.204.39.132.80: Flags [.], ack 268723504, win 229, options [nop,nop,TS val 123170865 ecr 522918648], length 0
10:08:00.516583 IP 192.168.122.98.39342 > 54.204.39.132.80: Flags [P.], seq 0:112, ack 1, win 229, options [nop,nop,TS val 123170866 ecr 522918648], length 112: HTTP: GET / HTTP/1.1
10:08:00.567044 IP 192.168.122.98.39342 > 54.204.39.132.80: Flags [.], ack 643, win 239, options [nop,nop,TS val 123170916 ecr 522918661], length 0
10:08:00.788153 IP 192.168.122.98.39342 > 54.204.39.132.80: Flags [F.], seq 112, ack 643, win 239, options [nop,nop,TS val 123171137 ecr 522918661], length 0
5 packets captured
5 packets received by filter
0 packets dropped by kernel

Puoi creare espressioni più complesse raggruppando il filtro tra parentesi. In questo caso, racchiudere l'intera espressione del filtro tra virgolette per evitare che la shell le confonda con le espressioni della shell:

$ sudo tcpdump -i any -c5 -nn "port 80 and (src 192.168.122.98 or src 54.204.39.132)"
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:10:37.602214 IP 192.168.122.98.39346 > 54.204.39.132.80: Flags [S], seq 871108679, win 29200, options [mss 1460,sackOK,TS val 123327951 ecr 0,nop,wscale 7], length 0
10:10:37.650651 IP 54.204.39.132.80 > 192.168.122.98.39346: Flags [S.], seq 854753193, ack 871108680, win 28960, options [mss 1460,sackOK,TS val 522957932 ecr 123327951,nop,wscale 9], length 0
10:10:37.650708 IP 192.168.122.98.39346 > 54.204.39.132.80: Flags [.], ack 1, win 229, options [nop,nop,TS val 123328000 ecr 522957932], length 0
10:10:37.651097 IP 192.168.122.98.39346 > 54.204.39.132.80: Flags [P.], seq 1:113, ack 1, win 229, options [nop,nop,TS val 123328000 ecr 522957932], length 112: HTTP: GET / HTTP/1.1
10:10:37.692900 IP 54.204.39.132.80 > 192.168.122.98.39346: Flags [.], ack 113, win 57, options [nop,nop,TS val 522957942 ecr 123328000], length 0
5 packets captured
5 packets received by filter
0 packets dropped by kernel

In questo esempio, stiamo filtrando i pacchetti solo per il servizio HTTP (porta 80) e gli indirizzi IP di origine 192.168.122.98 o 54.204.39.132 . Questo è un modo rapido per esaminare entrambi i lati dello stesso flusso.

5. Controllo del contenuto del pacchetto

Negli esempi precedenti, stiamo controllando solo le intestazioni dei pacchetti per informazioni come origine, destinazioni, porte, ecc. A volte questo è tutto ciò di cui abbiamo bisogno per risolvere i problemi di connettività di rete. A volte, tuttavia, abbiamo bisogno di controllare il contenuto del pacchetto per assicurarci che il messaggio che stiamo inviando contenga ciò di cui abbiamo bisogno o che abbiamo ricevuto la risposta prevista. Per vedere il contenuto del pacchetto, tcpdump fornisce due flag aggiuntivi:-X per stampare il contenuto in esadecimale e ASCII o -A per stampare il contenuto in ASCII.

Ad esempio, controlla il contenuto HTTP di una richiesta web come questa:

$ sudo tcpdump -i any -c10 -nn -A port 80
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
13:02:14.871803 IP 192.168.122.98.39366 > 54.204.39.132.80: Flags [S], seq 2546602048, win 29200, options [mss 1460,sackOK,TS val 133625221 ecr 0,nop,wscale 7], length 0
E..<..@[email protected].'[email protected]............
............................
13:02:14.910734 IP 54.204.39.132.80 > 192.168.122.98.39366: Flags [S.], seq 1877348646, ack 2546602049, win 28960, options [mss 1460,sackOK,TS val 525532247 ecr 133625221,nop,wscale 9], length 0
E..<..@./..a6.'...zb.P..o..&...A..q a..........
.R.W.......     ................
13:02:14.910832 IP 192.168.122.98.39366 > 54.204.39.132.80: Flags [.], ack 1, win 229, options [nop,nop,TS val 133625260 ecr 525532247], length 0
E..4..@[email protected].'....P...Ao..'...........
.....R.W................
13:02:14.911808 IP 192.168.122.98.39366 > 54.204.39.132.80: Flags [P.], seq 1:113, ack 1, win 229, options [nop,nop,TS val 133625261 ecr 525532247], length 112: HTTP: GET / HTTP/1.1
E.....@[email protected].'....P...Ao..'...........
.....R.WGET / HTTP/1.1
User-Agent: Wget/1.14 (linux-gnu)
Accept: */*
Host: opensource.com
Connection: Keep-Alive

................
13:02:14.951199 IP 54.204.39.132.80 > 192.168.122.98.39366: Flags [.], ack 113, win 57, options [nop,nop,TS val 525532257 ecr 133625261], length 0
E..4.F@./.."6.'...zb.P..o..'.......9.2.....
.R.a....................
13:02:14.955030 IP 54.204.39.132.80 > 192.168.122.98.39366: Flags [P.], seq 1:643, ack 113, win 57, options [nop,nop,TS val 525532258 ecr 133625261], length 642: HTTP: HTTP/1.1 302 Found
E....G@./...6.'...zb.P..o..'.......9.......
.R.b....HTTP/1.1 302 Found
Server: nginx
Date: Sun, 23 Sep 2018 17:02:14 GMT
Content-Type: text/html; charset=iso-8859-1
Content-Length: 207
X-Content-Type-Options: nosniff
Location: https://opensource.com/
Cache-Control: max-age=1209600
Expires: Sun, 07 Oct 2018 17:02:14 GMT
X-Request-ID: v-6baa3acc-bf52-11e8-9195-22000ab8cf2d
X-Varnish: 632951979
Age: 0
Via: 1.1 varnish (Varnish/5.2)
X-Cache: MISS
Connection: keep-alive

<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>302 Found</title>
</head><body>
<h1>Found</h1>
<p>The document has moved <a href="https://opensource.com/%3C/span%3Ehttps%3A%3Cspan%20class%3D"sy0">//opensource.com/">here</a>.</p>
</body></html>
................
13:02:14.955083 IP 192.168.122.98.39366 > 54.204.39.132.80: Flags [.], ack 643, win 239, options [nop,nop,TS val 133625304 ecr 525532258], length 0
E..4..@[email protected].'....P....o..............
.....R.b................
13:02:15.195524 IP 192.168.122.98.39366 > 54.204.39.132.80: Flags [F.], seq 113, ack 643, win 239, options [nop,nop,TS val 133625545 ecr 525532258], length 0
E..4..@[email protected].'....P....o..............
.....R.b................
13:02:15.236592 IP 54.204.39.132.80 > 192.168.122.98.39366: Flags [F.], seq 643, ack 114, win 57, options [nop,nop,TS val 525532329 ecr 133625545], length 0
E..4.H@./.. 6.'...zb.P..o..........9.I.....
.R......................
13:02:15.236656 IP 192.168.122.98.39366 > 54.204.39.132.80: Flags [.], ack 644, win 239, options [nop,nop,TS val 133625586 ecr 525532329], length 0
E..4..@[email protected].'....P....o..............
.....R..................
10 packets captured
10 packets received by filter
0 packets dropped by kernel

Ciò è utile per la risoluzione dei problemi con le chiamate API, presupponendo che le chiamate utilizzino HTTP semplice. Per le connessioni crittografate, questo output è meno utile.

6. Salvataggio delle acquisizioni in un file

Un'altra utile funzionalità fornita da tcpdump è la possibilità di salvare l'acquisizione in un file in modo da poter analizzare i risultati in un secondo momento. Ciò consente, ad esempio, di acquisire pacchetti in modalità batch durante la notte e di verificare i risultati al mattino. Aiuta anche quando ci sono troppi pacchetti da analizzare poiché l'acquisizione in tempo reale può avvenire troppo velocemente.

Per salvare i pacchetti in un file invece di visualizzarli sullo schermo, usa l'opzione -w (per scrivi ):

$ sudo tcpdump -i any -c10 -nn -w webserver.pcap port 80
[sudo] password for ricardo:
tcpdump: listening on any, link-type LINUX_SLL (Linux cooked), capture size 262144 bytes
10 packets captured
10 packets received by filter
0 packets dropped by kernel

Questo comando salva l'output in un file chiamato webserver.pcap . Il .pcap extension sta per "packet capture" ed è la convenzione per questo formato di file.

Come mostrato in questo esempio, sullo schermo non viene visualizzato nulla e l'acquisizione termina dopo l'acquisizione di 10 pacchetti, come per l'opzione -c10 . Se desideri un feedback per assicurarti che i pacchetti vengano acquisiti, usa l'opzione -v .

Tcpdump crea un file in formato binario, quindi non puoi semplicemente aprirlo con un editor di testo. Per leggere il contenuto del file, eseguire tcpdump con il -r (per leggi ) opzione:

$ tcpdump -nn -r webserver.pcap
reading from file webserver.pcap, link-type LINUX_SLL (Linux cooked)
13:36:57.679494 IP 192.168.122.98.39378 > 54.204.39.132.80: Flags [S], seq 3709732619, win 29200, options [mss 1460,sackOK,TS val 135708029 ecr 0,nop,wscale 7], length 0
13:36:57.718932 IP 54.204.39.132.80 > 192.168.122.98.39378: Flags [S.], seq 1999298316, ack 3709732620, win 28960, options [mss 1460,sackOK,TS val 526052949 ecr 135708029,nop,wscale 9], length 0
13:36:57.719005 IP 192.168.122.98.39378 > 54.204.39.132.80: Flags [.], ack 1, win 229, options [nop,nop,TS val 135708068 ecr 526052949], length 0
13:36:57.719186 IP 192.168.122.98.39378 > 54.204.39.132.80: Flags [P.], seq 1:113, ack 1, win 229, options [nop,nop,TS val 135708068 ecr 526052949], length 112: HTTP: GET / HTTP/1.1
13:36:57.756979 IP 54.204.39.132.80 > 192.168.122.98.39378: Flags [.], ack 113, win 57, options [nop,nop,TS val 526052959 ecr 135708068], length 0
13:36:57.760122 IP 54.204.39.132.80 > 192.168.122.98.39378: Flags [P.], seq 1:643, ack 113, win 57, options [nop,nop,TS val 526052959 ecr 135708068], length 642: HTTP: HTTP/1.1 302 Found
13:36:57.760182 IP 192.168.122.98.39378 > 54.204.39.132.80: Flags [.], ack 643, win 239, options [nop,nop,TS val 135708109 ecr 526052959], length 0
13:36:57.977602 IP 192.168.122.98.39378 > 54.204.39.132.80: Flags [F.], seq 113, ack 643, win 239, options [nop,nop,TS val 135708327 ecr 526052959], length 0
13:36:58.022089 IP 54.204.39.132.80 > 192.168.122.98.39378: Flags [F.], seq 643, ack 114, win 57, options [nop,nop,TS val 526053025 ecr 135708327], length 0
13:36:58.022132 IP 192.168.122.98.39378 > 54.204.39.132.80: Flags [.], ack 644, win 239, options [nop,nop,TS val 135708371 ecr 526053025], length 0
$

Dal momento che non stai più acquisendo i pacchetti direttamente dall'interfaccia di rete, sudo non è richiesto per leggere il file.

Puoi anche utilizzare uno qualsiasi dei filtri che abbiamo discusso per filtrare il contenuto dal file, proprio come faresti con i dati in tempo reale. Ad esempio, controlla i pacchetti nel file di acquisizione dall'indirizzo IP di origine 54.204.39.132 eseguendo questo comando:

$ tcpdump -nn -r webserver.pcap src 54.204.39.132
reading from file webserver.pcap, link-type LINUX_SLL (Linux cooked)
13:36:57.718932 IP 54.204.39.132.80 > 192.168.122.98.39378: Flags [S.], seq 1999298316, ack 3709732620, win 28960, options [mss 1460,sackOK,TS val 526052949 ecr 135708029,nop,wscale 9], length 0
13:36:57.756979 IP 54.204.39.132.80 > 192.168.122.98.39378: Flags [.], ack 113, win 57, options [nop,nop,TS val 526052959 ecr 135708068], length 0
13:36:57.760122 IP 54.204.39.132.80 > 192.168.122.98.39378: Flags [P.], seq 1:643, ack 113, win 57, options [nop,nop,TS val 526052959 ecr 135708068], length 642: HTTP: HTTP/1.1 302 Found
13:36:58.022089 IP 54.204.39.132.80 > 192.168.122.98.39378: Flags [F.], seq 643, ack 114, win 57, options [nop,nop,TS val 526053025 ecr 135708327], length 0

Cosa c'è dopo?

Queste funzionalità di base di tcpdump ti aiuteranno a iniziare con questo strumento potente e versatile. Per saperne di più, consulta il sito Web e le pagine man di tcpdump.

The tcpdump command line interface provides great flexibility for capturing and analyzing network traffic. If you need a graphical tool to understand more complex flows, look at Wireshark.

One benefit of Wireshark is that it can read .pcap files captured by tcpdump. You can use tcpdump to capture packets in a remote machine that does not have a GUI and analyze the result file with Wireshark, but that is a topic for another day.

This article was originally published in October 2018 and has been updated by Seth Kenlon.


Linux
  1. Usando la forza sulla riga di comando di Linux

  2. Avere una mucca sulla riga di comando di Linux

  3. Entra nella riga di comando di Linux

  4. Utilizzo di Stratis per gestire l'archiviazione Linux dalla riga di comando

  5. Come estrarre il file tar.gz in Linux utilizzando la riga di comando

Risolvi Wordle usando la riga di comando di Linux

Utilizzo di più per visualizzare i file di testo dalla riga di comando di Linux

Utilizzo di less per visualizzare i file di testo dalla riga di comando di Linux

Usando il comando gratuito di Linux

Padroneggia la riga di comando di Linux

Tutorial sull'uso del comando Timeout su Linux