Ho interrotto tcpdump
con Ctrl+ Ce ho ottenuto questo riepilogo totale:
579204 packets captured
579346 packets received by filter
142 packets dropped by kernel
Quali sono i "pacchetti rilasciati dal kernel"? Perché succede?
Ho interrotto tcpdump
con Ctrl+ Ce ho ottenuto questo riepilogo totale:
579204 packets captured
579346 packets received by filter
142 packets dropped by kernel
Quali sono i "pacchetti rilasciati dal kernel"? Perché succede?
Risposte:
Dal manuale di tcpdump:
pacchetti `` rilasciati dal kernel '' (questo è il numero di pacchetti che sono stati eliminati, a causa della mancanza di spazio nel buffer, dal meccanismo di acquisizione dei pacchetti nel sistema operativo in cui tcpdump è in esecuzione, se il sistema operativo riporta tali informazioni alle applicazioni; in caso contrario, verrà segnalato come 0).
Un po 'di spiegazione:
Le tcpdump
cattura i pacchetti grezzi che passano attraverso un'interfaccia di rete. I pacchetti devono essere analizzati e filtrati secondo le regole da te specificate nella riga di comando, e ciò richiede del tempo, quindi i pacchetti in arrivo devono essere bufferizzati (messi in coda) per l'elaborazione. A volte ci sono troppi pacchetti, vengono salvati in un buffer, ma vengono salvati più velocemente rispetto all'elaborazione, quindi alla fine il buffer esaurisce lo spazio, quindi il kernel rilascia tutti i pacchetti successivi fino a quando non c'è spazio libero nel buffer.
È possibile aumentare la dimensione del buffer con l' opzione -B
( --buffer-size
) in questo modo:
tcpdump -B 4096 ....
Si noti che la dimensione è specificata in kilobyte, quindi la riga sopra imposta la dimensione del buffer su 4 MB.
tcpdump -B 4096
.
Un'altra cosa da considerare / provare è che tcpdump
potrebbe passare molto tempo a fare query DNS per risolvere gli IP in nomi di dominio. Se non ti servono, prova a lanciare la -n
bandiera (nessuna ricerca). per esempio:
tcpdump -n port 80
-nn -B 4096
mi ha permesso di ottenere0 packets dropped by kernel
Secondo man tcpdump
:
pacchetti rilasciati dal kernel (questo è il numero di pacchetti che sono stati eliminati, a causa della mancanza di spazio nel buffer, dal meccanismo di acquisizione dei pacchetti nel sistema operativo su cui è in esecuzione tcpdump, se il sistema operativo riporta tali informazioni alle applicazioni; in caso contrario, esso verrà segnalato come 0).
Il kernel inserisce i pacchetti acquisiti in un buffer di acquisizione di dimensioni fisse . Se tcpdump
questo buffer non viene svuotato abbastanza rapidamente, il kernel inizierà a sovrascrivere i vecchi pacchetti nel buffer e incrementare di conseguenza il contatore eliminato . Il valore di quel contatore è quello che vedi come "rilasciato dal kernel".
A proposito, puoi ridimensionare il buffer di acquisizione : passa tcpdump
l' -B
opzione con una dimensione KiB.
Oltre a ciò che dice la pagina man, sembra esserci qualche motivo in più per cui i pacchetti potrebbero essere eliminati dal kernel. Stavo riscontrando un calo dei pacchetti del 100% da tcpdump
cui l'unico traffico sulla rete era un pacchetto da 512 B di PRBS al secondo. Chiaramente la spiegazione dello spazio del buffer non ha senso qui - penso che il kernel sia in grado di gestire 0,5 kB / s.
Qualcosa che è venuto con la mia distro (Ubuntu 14.04) potrebbe aver fatto una sorta di filtro intelligente a livello di collegamento a cui non piacevano i miei pacchetti di test. La mia soluzione alternativa era quella di creare un nuovo spazio dei nomi di rete come segue:
sudo -i
ip netns add debug
ip link set dev eth0 netns debug
ip netns exec debug bash
ifconfig eth0 1.2.3.4 up
Nella netns
shell interna , qualsiasi processo del sistema operativo che stava causando problemi in precedenza è fuori dal quadro e tcpdump
mi mostra tutti i pacchetti che mi aspetto di vedere.