Por que o kernel descartaria pacotes?

50

Eu interrompi tcpdumpcom 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?

rɑːdʒɑ
fonte
No meu caso, eu estava usando a opção -s0, alterando-a para -s1600 (logo acima do MTU) a resolveu para mim.
LatinSuD

Respostas:

50

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 tcpdumpcaptura 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.

Dmitry Vasilyanov
fonte
11
Também mudei intencionalmente kibi- / mebi- para kilo- / mega- e omiti uma palavra sobre libpcap para não confundir as pessoas.
Dmitry Vasilyanov
4
Observe também que o suporte para "opções longas" no tcpdump é relativamente novo; em versões mais antigas (exceto em versões muito mais antigas, que não suportam a configuração do tamanho do buffer), você pode fazer tcpdump -B 4096.
Outra observação, leva tempo para configurar buffers grandes. Se você definir os buffers como algo louco, poderá perder pacotes (o tcpdump os informa como "pacotes descartados pelo kernel") durante esse tempo de inicialização.
dgreene
27

Mais uma coisa a considerar / tentar é que tcpdumppode demorar muito tempo fazendo consultas DNS para resolver IPs para nomes de domínio. Se você não precisar deles, tente lançar o -nsinalizador (sem pesquisas). por exemplo:

tcpdump -n port 80
KJH
fonte
2
Este foi um salvador. Não sabia que o tcpdump reverteu a resolução ao despejar em um arquivo !! O uso de -nn -B 4096permissão permitiu-me obter0 packets dropped by kernel
Blanka
11

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 tcpdumpnã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 tcpdumpa -Bopção com um tamanho KiB.

Anko
fonte
2

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 tcpdumponde 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 netnsshell interno , quaisquer processos do SO que estavam causando problemas antes estão fora de cena e tcpdumpme mostram todos os pacotes que espero ver.

Lombard
fonte
1

Acho útil usar a tcpdump -copção Dessa forma, você pode definir o número de pacotes e, em seguida, parar e não pode preencher o buffer.

Por exemplo, este captura as solicitações TCP no host local.

tcpdump -ni lo tcp -c 20
prosti
fonte