Criando junção multicast para capturas tcpdump

8

Eu quero escrever um script de shell linux que irá capturar tráfego multicast específico. Especificamente como, eu quero criar um arquivo pcap que tenha todo o tráfego para um grupo / porta multicast específico.

Aqui está a linha de comando que estou usando para ver o tráfego:

tcpdump -nnXs 0 -i eth1 udp port 22001 and dst 233.54.12.234

Isso funciona bem, desde que eu tenha uma assinatura multicast para esse grupo já estabelecida. Por exemplo, se eu executar isso em outro console:

mdump 233.54.12.234 22001 10.13.252.51

tcpdump verá os pacotes. Se mdump não estiver em execução, tcpdump não verá nada.

Existe uma maneira padrão do Linux de estabelecer essas junções de multicast antes de iniciar as capturas? Eu poderia usar mdump para estabelecer essas junções, mas isso parece um desperdício, pois mdump processará todos esses dados no grupo, mas eu vou apenas jogar fora isso.

Note que, devido ao meu ambiente específico, tenho sido desencorajado de colocar a interface no modo promíscuo. Pode, de fato, ser proibido.

    
por John Dibling 02.07.2014 / 16:24

1 resposta

2

TL; DR - Escolha um:

sudo ip addr add 233.54.12.234/32 dev eth1 autojoin

socat STDIO UDP4-RECV:22001,ip-add-membership=233.54.12.234:eth1 > /dev/null

No começo eu ia dizer "use ip maddress add e termine com isso". O problema é que ip maddress afeta apenas os endereços multicast camada de enlace dos endereços multicast protocolo ( man 8 ip-maddress ).

Dito isto, o uso do sinal autojoin com o endereço faz o truque bem.

Isso levanta algumas questões subseqüentes. Eu suponho que você estará executando tcpdump ou tshark que você tem permissão de root. No caso em que você não 22001 é uma porta numerada alta e outros utilitários como socat também farão as coisas.

Não acredite na minha palavra. Apenas para testar isso, podemos gerar pacotes UDP multicast com socat ou ncat (geralmente empacotados via nmap / nmap-ncat ).

Em alguns hosts, execute um das duas combinações a seguir:

Opção 1:

sudo ip addr add 233.54.12.234/32 dev eth1 autojoin

Opção 2:

socat -u UDP4-RECV:22001,ip-add-membership=233.54.12.234:eth1 /dev/null &

A primeira opção exigirá raiz, ou pelo menos a capacidade CAP_NET_ADMIN . A segunda opção não requer raiz, mas também espera ser executada em primeiro plano e, portanto, pode ser menos propícia a scripts (embora rastreie o ID do processo filho e limpe-o com um trap no BASH pode ser exatamente o que você está procurando.

Uma vez feito isso (mas antes de testar o nosso comando tcpdump / tshark ) certifique-se de que o kernel reconheça a interface tendo ingressado no grupo IGMP correto. Se você está se sentindo super chique, você pode enlouquecer o hex em /proc/net/igmp , mas eu sugiro apenas executar netstat -gn .

Depois de verificar se você vê a interface inscrita no grupo correto, acione seu comando tcpdump:

tcpdump -nnXs 0 -i eth1 udp port 22001 and dst 233.54.12.234

Alternativamente, se você não quer seguir completamente a rota do tcpdump (ou tropeçou nesta resposta e está curioso para ver o multicast em ação) você pode usar o comando socat acima para unir e fazer eco do conteúdo para STDOUT substituindo /dev/null por STDOUT :

socat -u UDP4-RECV:22001,ip-add-membership=233.54.12.234:eth1

Em seguida, em outra máquina, use uma das duas opções a seguir para enviar alguns dados de teste simples:

Opção 1:

socat STDIO UDP-DATAGRAM:233.54.12.234:22001

Opção 2:

ncat  -u 233.54.12.234 22001

Quando você executa um desses comandos, ele espera interativamente pela entrada. Basta digitar algumas coisas, aperte enter para enviar e, em seguida, CTRL+D quando terminar de enviar uma mensagem EOF .

Neste ponto, você deve ter visto um teste de fim de fim e, com alguns comandos, construir o pior e mais inseguro sistema de bate-papo do mundo.

    
por 08.09.2018 / 09:53