tcpdump: "pacotes capturados" vs "pacotes recebidos pelo filtro"

11

Temos um script que chama

tcpdump -v src host <IP address> and port <port number> >>out.txt 2>>err.txt -w capture.cap

em vários IPs, enquanto as outras partes do script iniciam algum tráfego em segundo plano. Queremos verificar se os pacotes estão voltando para nós e examinar manualmente apenas esses casos quando recebermos pacotes. A saída de erro do tcpdump parecia boa para isso no começo, mas.

A questão é, como o sujeito sugere, qual é a diferença entre "pacotes capturados" e "pacotes recebidos pelo filtro"? Existem capturas, que não registraram nenhum pacote, mas emitiram "0 pacotes capturados, 2 pacotes recebidos por filtro", o que soa como uma contradição, pois, se nenhum pacote foi capturado, como foram filtrados 2? Inicialmente, procurávamos "0 pacotes recebidos pelo filtro", mas isso nem sempre é gravado na saída de erro, quando não havia pacotes recebidos. Então, o que esses números mostram?

Preciso saber o que procurar se quisermos filtrar os casos em que nenhum pacote de resposta foi recebido.

Alex Biro
fonte

Respostas:

12

Espero que isso lance alguma luz sobre o assunto. Na página de manual :

Quando o tcpdump terminar de capturar pacotes, ele relatará contagens de:

pacotes capturados (este é o número de pacotes que o tcpdump recebeu e processou);

pacotes recebidos pelo filtro (o significado disso depende do sistema operacional no qual você está executando o tcpdump e, possivelmente, da maneira como o sistema operacional foi configurado - se um filtro foi especificado na linha de comando, em alguns sistemas operacionais ele conta pacotes independentemente de se eles foram correspondidos pela expressão de filtro e, mesmo se correspondidos pela expressão de filtro, independentemente de o tcpdump já os tenha lido e processado, em outros sistemas operacionais, ele conta apenas pacotes que foram correspondidos pela expressão de filtro, independentemente de o tcpdump ter lido e os processou ainda e, em outros sistemas operacionais, conta apenas pacotes que foram correspondidos pela expressão de filtro e processados ​​pelo 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).

E há uma entrada na lista de discussão de 2009 explicando:

O número de "pacotes recebidos pelo filtro" é o ps_recvnúmero de uma chamada para pcap_stats(); com BPF , esse é o bs_recvnúmero do BIOCGSTATS ioctl. Essa contagem inclui todos os pacotes que foram entregues ao BPF; esses pacotes ainda podem estar em um buffer que ainda não foi lido pelo libpcap (e, portanto, não foram entregues ao tcpdump) ou podem estar em um buffer que foi lido pelo libpcap, mas ainda não entregue ao tcpdump, para que possa contar pacotes que não são relatados como "capturados".

Talvez o processo seja morto muito rápido? Há também uma -c Nbandeira dizendo ao tcpdump para sair quando os Npacotes foram capturados.

Como o problema parece bastante especializado, você também pode usar libpcapdiretamente ou através de uma das centenas de ligações de idiomas .

Para sua pergunta, já que tudo que você obtém são os pacotes capturados no capture.caparquivo, você pode apenas olhar as execuções onde não estão vazias e examiná-las, ou seja, contar as linhas?

tcpdump -r capture.cap | wc -l

Provavelmente existe uma maneira melhor de usar a libpcap para retornar o número de entradas no arquivo de captura ...

sr_
fonte
1
Além disso, se o manuseio de pacotes for lento, é possível que os pacotes sejam descartados no hardware da NIC antes de serem vistos pelo kernel.
Craig
@ Craig: A caixa executando este script é virtualizada, então eu não sei sobre a velocidade da NIC.
18712 Alex Biro
@sr_: boa idéia com as linhas, muito fácil :) Acho que não precisamos usar a opção -w, mas simplesmente redirecione a saída para um arquivo e conte os números das linhas. Irá verificar o mais rápido possível.
Alex Biro
@ tuareg85: analisar os pacotes capturados, -wé ótimo. Você pode, por exemplo, usar o Wireshark com ele.
sr_
1
Matar o processo muito cedo provavelmente não é o problema, já que esperamos 3s depois de interromper o tráfego, acho que isso deve ser suficiente. Além disso, o tcpdump também tem tempo para terminar a saída de erro, e os pacotes descartados pelo kernel sempre foram 0.
Alex Biro