GNU/Linux >> Linux Esercitazione >  >> Linux

Esempi di Tcpdump - Cattura il traffico di rete in Linux

Tcpdump è un comando per la risoluzione dei problemi di rete, noto anche come packet sniffer, utilizzato per acquisire e visualizzare i pacchetti da una rete. Tcpdump consente agli utenti di acquisire e visualizzare TCP/IP e altri pacchetti (UDP, ARP o ICMP) trasmessi o ricevuti sulla rete a cui è collegato il computer.

Puoi applicare filtri ai pacchetti ed evitare il traffico che non vuoi vedere. Puoi acquisire tutti i dati che passano attraverso la tua rete locale e metterli in un file per un'analisi successiva. Per eseguire il comando tcpdump è necessario root o utente con privilegi sudo.

In questo tutorial impareremo come utilizzare i comandi tcpdump per analizzare il traffico che scorre su una macchina Linux.

1. Cattura il traffico sull'interfaccia

Quando usi tcpdump senza alcuna opzione, analizzerà il traffico su tutte le interfacce, esegui il seguente comando:

$ sudo tcpdump

Devi premere il pulsante Ctrl + C per fermarlo.

Per acquisire il traffico su un'interfaccia specifica usa -i opzione e limitare il numero di pacchetti a -c opzione:

Il seguente esempio di tcpdump analizza l'interfaccia 'ens160' e limita il pacchetto a 5:

$ sudo tcpdump -i ens160 -c 5
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on ens160, link-type EN10MB (Ethernet), capture size 262144 bytes
22:37:57.488830 IP Ubuntu.ssh > static.vnpt.vn.50302: Flags [P.], seq 904499689:904499877, ack 2322684183, win 501, options [nop,nop,TS val 215651573 ecr 764510174], length 188
22:37:57.489727 IP Ubuntu.33256 > dns.google.domain: 5774+ [1au] PTR? 219.62.249.14.in-addr.arpa. (55)
22:37:57.496238 IP static.vnpt.vn.50302 > Ubuntu.ssh: Flags [.], ack 188, win 2045, options [nop,nop,TS val 764510247 ecr 215651573], length 0
22:37:57.546212 ARP, Request who-has 42.112.22.189 tell 42.112.22.254, length 46
22:37:57.549223 ARP, Request who-has 42.112.22.162 tell 42.112.22.254, length 46
5 packets captured

2) Cattura il traffico su un host specifico

Puoi acquisire pacchetti in entrata e in uscita da un host specifico usando -host opzione.

$ sudo tcpdump -i ens160 -c 5 -ttttnnvvS host 14.249.62.219

Ora puoi vedere sia i pacchetti di richiesta che quelli di risposta:

tcpdump: listening on ens160, link-type EN10MB (Ethernet), capture size 262144 bytes
2020-06-22 06:07:36.407733 IP (tos 0x12,ECT(0), ttl 64, id 60196, offset 0, flags [DF], proto TCP (6), length 176)
    100.9.8.40.22 > 14.249.62.219.49396: Flags [P.], cksum 0x60a7 (incorrect -> 0x8547), seq 296088568:296088692, ack 3491435441, win 501, options [nop,nop,TS val 242630491 ecr 673952638], length 124
2020-06-22 06:07:36.407905 IP (tos 0x12,ECT(0), ttl 64, id 60197, offset 0, flags [DF], proto TCP (6), length 208)
    100.9.8.40.22 > 14.249.62.219.49396: Flags [P.], cksum 0x60c7 (incorrect -> 0xeed4), seq 296088692:296088848, ack 3491435441, win 501, options [nop,nop,TS val 242630492 ecr 673952638], length 156
2020-06-22 06:07:36.407967 IP (tos 0x12,ECT(0), ttl 64, id 60198, offset 0, flags [DF], proto TCP (6), length 288)
    100.9.8.40.22 > 14.249.62.219.49396: Flags [P.], cksum 0x6117 (incorrect -> 0x82ca), seq 296088848:296089084, ack 3491435441, win 501, options [nop,nop,TS val 242630492 ecr 673952638], length 236
2020-06-22 06:07:36.408018 IP (tos 0x12,ECT(0), ttl 64, id 60199, offset 0, flags [DF], proto TCP (6), length 408)
    100.9.8.40.22 > 14.249.62.219.49396: Flags [P.], cksum 0x618f (incorrect -> 0xebc8), seq 296089084:296089440, ack 3491435441, win 501, options [nop,nop,TS val 242630492 ecr 673952638], length 356
2020-06-22 06:07:36.408049 IP (tos 0x12,ECT(0), ttl 64, id 60200, offset 0, flags [DF], proto TCP (6), length 208)
    100.9.8.40.22 > 14.249.62.219.49396: Flags [P.], cksum 0x60c7 (incorrect -> 0x3db7), seq 296089440:296089596, ack 3491435441, win 501, options [nop,nop,TS val 242630492 ecr 673952638], length 156

3) Trova il pacchetto per porta

Per trovare i pacchetti su un numero di porta specificato, usa -port opzione.

Supponendo di voler analizzare l'interfaccia di rete 'ens160' e limitare il numero di pacchetti a 5 dalla porta 22, eseguiamo il seguente comando:

$ sudo tcpdump -i ens160 -c 5 -nn port 22
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on ens160, link-type EN10MB (Ethernet), capture size 262144 bytes
22:55:11.567754 IP 100.9.8.40.22 > 14.249.62.219.50302: Flags [P.], seq 904502461:904502649, ack 2322684399, win 501, options [nop,nop,TS val 216685651 ecr 765506106], length 188
22:55:11.567973 IP 100.9.8.40.22 > 14.249.62.219.50302: Flags [P.], seq 188:408, ack 1, win 501, options [nop,nop,TS val 216685652 ecr 765506106], length 220
22:55:11.568102 IP 100.9.8.40.22 > 14.249.62.219.50302: Flags [P.], seq 408:604, ack 1, win 501, options [nop,nop,TS val 216685652 ecr 765506106], length 196
22:55:11.568184 IP 100.9.8.40.22 > 14.249.62.219.50302: Flags [P.], seq 604:800, ack 1, win 501, options [nop,nop,TS val 216685652 ecr 765506106], length 196
22:55:11.568262 IP 100.9.8.40.22 > 14.249.62.219.50302: Flags [P.], seq 800:996, ack 1, win 501, options [nop,nop,TS val 216685652 ecr 765506106], length 196

Per ignorare una porta quando intercetti i pacchetti usa not port .

Se vuoi analizzare la porta dell'interfaccia di rete 'ens160' diversa da 22, esegui il comando seguente:

$ sudo tcpdump -i ens160 -nn not port 22

Puoi utilizzare una gamma di porte per acquisire il traffico di rete.

Ad esempio, se si desidera analizzare l'interfaccia di rete ens160 nell'intervallo di porte:dalla porta 20 alla porta 23, eseguire il comando seguente:

$ sudo tcpdump -i ens160 -c 3 -nns 0 portrange 20-23

4) Cattura pacchetti da un protocollo specifico

Puoi decidere se acquisire solo i pacchetti ICMP (Internet Control Message Protocol) o TCP (Transmission Control Protocol). Il comando seguente catturerà solo i pacchetti TCP:

$ sudo tcpdump -i ens160 -c 5 -nn tcp
Output
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on ens160, link-type EN10MB (Ethernet), capture size 262144 bytes
23:13:04.283421 IP 10.9.8.40.22 > 14.249.62.219.50302: Flags [P.], seq 904505569:904505677, ack 2322684631, win 501, options [nop,nop,TS val 217758367 ecr 766570531], length 108
23:13:04.283512 IP 100.9.8.40.22 > 14.249.62.219.50302: Flags [P.], seq 108:144, ack 1, win 501, options [nop,nop,TS val 217758367 ecr 766570531], length 36
23:13:04.283588 IP 100.9.8.40.22 > 14.249.62.219.50302: Flags [P.], seq 144:260, ack 1, win 501, options [nop,nop,TS val 217758367 ecr 766570531], length 116
23:13:04.283642 IP 100.9.8.40.22 > 14.249.62.219.50302: Flags [P.], seq 260:296, ack 1, win 501, options [nop,nop,TS val 217758367 ecr 766570531], length 36
23:13:04.283863 IP 100.9.8.40.22 > 14.249.62.219.50302: Flags [P.], seq 296:508, ack 1, win 501, options [nop,nop,TS val 217758368 ecr 766570531], length 212

5) Salva il registro in un file specifico

È possibile salvare i pacchetti catturati in un file. Per impostazione predefinita, quando si acquisiscono pacchetti in un file, verranno salvati solo 68 byte di dati da ciascun pacchetto. Il resto delle informazioni viene ignorato.

Puoi usare -s opzione per dire a tcpdump linux quanti byte salvare ogni pacchetto e specificare 0 poiché la lunghezza dell'istantanea dei pacchetti indica a tcpdump di salvare l'intero pacchetto, utilizzare il comando seguente:

$ sudo tcpdump -i ens160 -c 5 -nn tcp -w packages-record.pcap -s 0

Output
tcpdump: listening on ens160, link-type EN10MB (Ethernet), capture size 262144 bytes
5 packets captured

6) Leggi il file di registrazione tcpdump

Non puoi leggere il contenuto di un file che salva i pacchetti tcpdump con i comandi comuni come 'cat' o 'less' ma devi usare il -r parametro del comando tcpdump:

$ sudo tcpdump -r packets-record.pcap 

Ora puoi leggere il contenuto del file di registrazione tcpdump:

reading from file packets-record.pcap, link-type EN10MB (Ethernet)
23:18:57.823581 IP Ubuntu.ssh > static.vnpt.vn.50302: Flags [P.], seq 904507573:904507617, ack 2322684767, win 501, options [nop,nop,TS val 218111907 ecr 766921765], length 44
23:18:57.823697 IP Ubuntu.ssh > static.vnpt.vn.50302: Flags [P.], seq 44:160, ack 1, win 501, options [nop,nop,TS val 218111907 ecr 766921765], length 116
23:18:57.823778 IP Ubuntu.ssh > static.vnpt.vn.50302: Flags [P.], seq 160:196, ack 1, win 501, options [nop,nop,TS val 218111907 ecr 766921765], length 36
23:18:57.832656 IP static.vnpt.vn.50302 > Ubuntu.ssh: Flags [.], ack 44, win 2047, options [nop,nop,TS val 766921826 ecr 218111907], length 0
23:18:57.832685 IP static.vnpt.vn.50302 > Ubuntu.ssh: Flags [.], ack 160, win 2045, options [nop,nop,TS val 766921826 ecr 218111907], length 0

Puoi anche utilizzare questo file pcap per la visualizzazione con Wireshark per l'analisi.

7) Filtra i pacchetti da una fonte specifica

Per filtrare i pacchetti che provengono da un IP sorgente specifico, puoi usare src opzione.

$ sudo tcpdump src 100.9.8.40

Allo stesso modo, se vuoi vedere il traffico in un'altra direzione, usa dst opzione:

$ sudo tcpdump dst 14.249.62.219

8) Cattura i pacchetti dalla rete

Per acquisire in entrata e in uscita da una rete, usa -net opzione. Il comando seguente acquisisce il traffico dalla rete 192.168.0.0/24:

$ sudu tcpdump net 192.169.0.0/24

9) Cattura pacchetti in ASCII

Per visualizzare i pacchetti catturati in ASCII usa -A opzione, che è utile per acquisire pagine web.

$ sudo tcpdump -A -i eth0

Tcpdump può anche visualizzare il contenuto dei pacchetti in formato esadecimale e ASCII, quindi utilizzare -X opzione:

$ sudo tcpdump -X -i eth0

10) Cattura pacchetti IPV6

Possiamo acquisire il traffico IPV6 utilizzando ip6 opzione e proto per specificare il protocollo TCP o UDP.

proto 6 - TCP

proto 17 - UDP

Quanto segue acquisisce tutto il traffico IPv6 utilizzando il protocollo TCP:

$ sudo tcpdump -nn ip6 proto 6

11) Filtra agente utente HTTP

Il comando seguente filtra l'agente utente HTTP e l'host dall'intestazione della richiesta http:

$ sudo tcpdump -nn -A -s1500 -l | egrep -i 'User-Agent:|Host:'

Per acquisire i cookie utilizzare il seguente comando:

$ sudo tcpdump -nn -A -s0 -l | egrep -i 'Set-Cookie|Host:|Cookie:'

12) Elenca le interfacce disponibili

Puoi usare tcpdump per elencare l'interfaccia disponibile con il -D opzione.

Ad esempio:

$ sudo tcpdump -D
Output
1.ens160 [Up, Running]
2.any (Pseudo-device that captures on all interfaces) [Up, Running]
3.lo [Up, Running, Loopback]
4.docker0 [Up]
5.nflog (Linux netfilter log (NFLOG) interface)
6.nfqueue (Linux netfilter queue (NFQUEUE) interface)
7.usbmon1 (USB bus number 1)
8.usbmon2 (USB bus number 2)

13) Ruota i file di acquisizione

Se stai acquisendo traffico utilizzando tcpdump per un lungo periodo, è bene creare un nuovo file quando viene raggiunta una certa quantità di dimensione del file o tempo.

Il comando seguente creerà un nuovo file 'network-02-30.pcap' ogni 30 minuti (-G 1800) con un file limitato a 100 MB (-C 100) con un numero di file di 24 (-W 48).

$ sudo tcpdump -i ens160 -w /tmp/network-%H-%M.pcap -W 48 -G 300 -C 100

Opzioni Tcpdump

Tcpdump fornisce diverse opzioni che migliorano o modificano il suo output, controlliamo quali sono:

  • -i <interface> :Ascolta sull'interfaccia specificata.
  • -n :Non risolvere i nomi host. Puoi usare -nn per non risolvere nomi host o nomi di porta.
  • -t :stampa timestamp leggibile su ogni riga di dump, -tttt :fornisce un output di timestamp il più possibile leggibile dall'uomo.
  • -X :mostra il contenuto del pacchetto sia in esadecimale che in ascii.
  • -v , -vv , -vvv :aumenta la quantità di informazioni sui pacchetti che ricevi.
  • -c N :Ottieni solo un numero N di pacchetti e poi fermati.
  • -s :definisce la lunghezza dello snap (dimensione) dell'acquisizione in byte. Usa -s0 per ottenere tutto, a meno che tu non stia catturando intenzionalmente meno.
  • -S :stampa numeri di sequenza assoluti.
  • -q :mostra meno informazioni sul protocollo.
  • -w <file name> :Scrivi i pacchetti grezzi su file piuttosto

Potenza di e, o e non operatore

Il comando Tcpdump supporta la combinazione di operatori "e", "o" e "non" per filtrare risultati più accurati.

Cattura il traffico proveniente da 10.20.0.0/16 e diretto alla rete 10.30.0.0/16 con visualizzazione di timestamp leggibili dall'uomo (tt), senza risoluzione di nomi host o numeri di porta (nn), output dettagliato (vv) e utilizzando sequenza assoluta numeri (S):

$ sudo  -ttnnvvS tcpdump src net 10.20.0.0/16 and dst net 10.30.0.0/16

Visualizza il traffico dalla sorgente 192.168.0.10 che non è il protocollo UDP:

$ sudo tcpdump src 192.168.0.10 and src net and not udp

Per acquisire il traffico arp o ping per un host specifico e salvare l'output in un file denominato packetfile.txt:

$ sudo tcpdump -nnti eth0 arp or icmp and host 192.168.0.1 -w packetfile.txt

Formato di output Tcpdump

Prendiamo una nuova riga dall'output di tcpdump per comprenderne il formato.

10:31:13.440803 IP Ubuntu.ssh > 117.6.129.86.50736: Flags [P.], seq 188:400, ack 1, win 501, options [nop,nop,TS val 468736347 ecr 335665367], length 212

Dove:

10:31:13.401128 - Ora in cui il pacchetto è stato acquisito nell'ora locale.

IP - Ha indicato che il protocollo del pacchetto è IPV4.

Ubuntu.ssh - Indica l'indirizzo IP di origine o il nome host di origine e .ssh significa porta (qui sarà 22).

117.6.129.86.50376 - Indica l'indirizzo IP di destinazione e il punto (.) separati dal numero di porta.

Bandiere:

[P.] - Questo è il campo dei flag TCP.

[.] - ACK (Riconoscimento).

[S] - SYN (Avvia connessione).

[P] - PSH (Dati push).

[F] - FIN (Fine connessione).

[R] - RST (Ripristina connessione).

[S.] - SYN-ACK (pacchetto SynAcK).

seq 188:400 - Il numero di sequenza indica che il pacchetto contiene byte da '188' a '400' di dati.

win 501 - Questo campo è la dimensione di Windows, che rappresenta il numero di byte disponibili nel buffer di ricezione.

options [nop,nop,TS val 468736347 ecr 335665367] - Si tratta di opzioni TCP come MSS (Maximum Segment Size) o Window Scale. Puoi fare riferimento a ulteriori informazioni sulle opzioni del protocollo TCP.

length 212 - Rappresenta la lunghezza dei dati del carico utile in byte.

Conclusione

Sebbene gli sniffer di pacchetti siano utili strumenti diagnostici, possono anche essere utilizzati in modo improprio. Ad esempio, individui senza scrupoli possono eseguire sniffer di pacchetti per acquisire le password che altri inviano sulla rete. A seconda della configurazione della tua rete, questo trucco può funzionare anche se lo sniffer di pacchetti non è in esecuzione né sul computer di invio né su quello di ricezione.

Per questo motivo, molte organizzazioni hanno politiche che vietano l'uso di sniffer di pacchetti se non in circostanze limitate.

Spero che ti sia piaciuto leggere i comandi tcpdump e per favore lascia il tuo suggerimento nella sezione commenti qui sotto.


Linux
  1. Linux:come inoltrare il traffico tra gli spazi dei nomi di rete Linux?

  2. 7 Esempi di comandi Linux df

  3. 8 Esempi di comandi TR Linux

  4. sa Esempi di comandi in Linux

  5. Linux:come misurare il traffico di rete giornaliero/mensile?

Network Manager su Linux con esempi

10 esempi di comando Linux ss per monitorare le connessioni di rete

Esempi di comandi ifconfig di Linux

Esempi utili di tcpdump Linux per l'amministratore di rete

10 Esempi di comandi Linux brctl per bridge di rete Ethernet

Esempi di comandi id in Linux