tcpdump espera um segundo antes de exibir pacotes

3

No Linux Mint (17 ou 17.1) estou usando o tcpdump para capturar alguns pacotes com este comando:

tcpdump -UnvXSs 4096 -B 1024 -i eth0

Apesar da opção -U, não produz pacotes imediatamente. Em vez disso, eles são salvos e produzidos quase exatamente uma vez por segundo, a única exceção é que, se eu causar muita atividade de rede, eles serão exibidos com mais frequência. Eu também tentei a opção -l, não faz diferença. Usar um buffer menor (o argumento -B) faz com que menos tráfego possa causar saída mais frequente, mas o menor possível é 128, o que ainda é grande o suficiente para que o tráfego que eu quero ver seja gerado apenas uma vez por segundo. >

Eu corri strace no tcpdump. Faz repetidamente pausa na seguinte linha:

poll([{fd=3, events=POLLIN}], 1, 1000)  = 1 ([{fd=3, revents=POLLIN}])

Ele permanece lá por 1 segundo, depois retoma, gera mais pacotes e retorna para a chamada poll ().

A última chamada do sistema a retornar um 3 antes dessas chamadas poll () ocorrerem é esta:

socket(PF_PACKET, SOCK_RAW, 768)        = 3

Entre as chamadas para poll (), não há nada além de chamadas write (), por isso não está sendo atrasado por pesquisas de DNS ou qualquer coisa.

Então, resta concluir que o motivo pelo qual o tcpdump está exibindo apenas pacotes uma vez por segundo é porque é mais frequente que o kernel os distribua.

Como posso obtê-lo para enviar os pacotes assim que eles são recebidos pelo kernel?

Linux version 3.13.0-24-generic (buildd@batsu) (gcc version 4.8.2 (Ubuntu 4.8.2-19ubuntu1) ) #47-Ubuntu SMP Fri May 2 23:30:00 UTC 2014
    
por Moosfet 23.08.2015 / 07:47

1 resposta

3

So I'm left to conclude that the reason tcpdump is only displaying packets once per second is because that's as often that the kernel is delivering them.

Sim - quando o tcpdump abre um dispositivo para capturar com pcap_open_live() ou com pcap_create() e pcap_activate() , ele especifica um tempo limite de 1 segundo. Isto significa que, em muitos SOs (incluindo distribuições Linux com versões mais recentes do kernel e da libpcap, assim como * BSD, OS X e Solaris), o kernel armazenará pacotes em buffer até que seu buffer seja preenchido ou 1 segundo tenha decorrido e entregará todo o buffer de pacotes, para eficiência.

As versões mais recentes do tcpdump desativarão esse buffer ao imprimir pacotes, em vez de salvá-los em formato binário em um arquivo.

How I can get it to output the packets as soon as they are received by the kernel?

Execute uma versão mais nova do tcpdump ou modifique o tcpdump para especificar um tempo limite mais curto ou para desativar completamente o tempo limite.

    
por 23.08.2015 / 10:10

Tags