Eu interrompi tcpdump
com Ctrl+ Ce obtive este resumo total:
579204 packets captured
579346 packets received by filter
142 packets dropped by kernel
O que são os "pacotes descartados pelo kernel"? Por que isso acontece?
Eu interrompi tcpdump
com Ctrl+ Ce obtive este resumo total:
579204 packets captured
579346 packets received by filter
142 packets dropped by kernel
O que são os "pacotes descartados pelo kernel"? Por que isso acontece?
Respostas:
No manual do tcpdump:
pacotes `` descartados pelo kernel '' (este é o número de pacotes que foram descartados, devido à falta de espaço no buffer, pelo mecanismo de captura de pacotes no sistema operacional no qual o tcpdump está sendo executado, se o sistema operacional informar essas informações aos aplicativos; caso contrário, será relatado como 0).
Um pouco de explicação:
A tcpdump
captura de pacotes brutos passando por uma interface de rede. Os pacotes devem ser analisados e filtrados de acordo com as regras especificadas por você na linha de comando, e isso leva algum tempo; portanto, os pacotes recebidos precisam ser armazenados em buffer (em fila) para processamento. Às vezes, existem muitos pacotes, eles são salvos em um buffer, mas são salvos mais rapidamente do que processados; portanto, eventualmente, o buffer fica sem espaço, de modo que o kernel descarta todos os pacotes adicionais até que haja algum espaço livre no buffer.
Você pode aumentar o tamanho do buffer com a opção -B
( --buffer-size
) assim:
tcpdump -B 4096 ....
Observe que o tamanho é especificado em kilobytes; portanto, a linha acima define o tamanho do buffer para 4 MB.
tcpdump -B 4096
.
Mais uma coisa a considerar / tentar é que tcpdump
pode demorar muito tempo fazendo consultas DNS para resolver IPs para nomes de domínio. Se você não precisar deles, tente lançar o -n
sinalizador (sem pesquisas). por exemplo:
tcpdump -n port 80
-nn -B 4096
permissão permitiu-me obter0 packets dropped by kernel
De acordo com man tcpdump
:
pacotes descartados pelo kernel (este é o número de pacotes descartados, devido à falta de espaço no buffer) pelo mecanismo de captura de pacotes no sistema operacional no qual o tcpdump está sendo executado, se o sistema operacional relatar essas informações para os aplicativos; caso contrário, ele será relatado como 0).
O kernel coloca os pacotes capturados em um buffer de captura de tamanho fixo . Se tcpdump
não esvaziar esse buffer com rapidez suficiente, o kernel começará a sobrescrever pacotes antigos no buffer e a aumentar correspondentemente o contador descartado . O valor desse contador é o que você vê como "descartado pelo kernel".
A propósito, você pode redimensionar o buffer de captura : Passe tcpdump
a -B
opção com um tamanho KiB.
Além do que a página de manual diz, parece haver algum motivo adicional pelo qual os pacotes podem ser descartados pelo kernel. Eu estava tendo 100% de queda de pacotes de tcpdump
onde o único tráfego na rede era um pacote de 512B de PRBS por segundo. Claramente, a explicação do espaço no buffer não faz sentido aqui - acho que o kernel pode lidar com 0.5kiB / s.
Algo que veio junto com minha distribuição (Ubuntu 14.04) pode estar fazendo algum tipo de filtragem inteligente na camada de link que não gostou dos meus pacotes de teste. Minha solução alternativa foi criar um novo namespace de rede da seguinte maneira:
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
No netns
shell interno , quaisquer processos do SO que estavam causando problemas antes estão fora de cena e tcpdump
me mostram todos os pacotes que espero ver.