Eu quero escrever um script de shell linux que irá capturar o tráfego multicast específico. Específico como em, 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 visualizar 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á estabelecido. Por exemplo, se eu executar isso em outro console:
mdump 233.54.12.234 22001 10.13.252.51
tcpdump
verá pacotes. Se mdump
não estiver em execução, tcpdump
não vê nada.
Existe uma maneira linux-y padrão para estabelecer essas junções multicast antes de iniciar as capturas? Eu poderia usar mdump
para estabelecer essas junções, mas isso parece um desperdício, já mdump
que processará todos os dados do grupo, mas eu apenas vou jogá-los fora.
Observe que, devido ao meu ambiente específico, fui desencorajado de colocar a interface no modo promíscuo. De fato, pode ser proibido.
fonte
-p
bandeira, em versões padrão do tcpdump, transforma o modo promíscuo off , como é on por padrão. No modo promíscuo, ele deve ver todo o tráfego, incluindo o tráfego multicast, independentemente de você ter a assinatura estabelecida - a menos que você esteja em uma rede comutada e seja necessário que a assinatura seja estabelecida para que o comutador encaminhe o tráfego.mdump
execução em outro console),tcpdump
não vê nada.Respostas:
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 dizia "apenas use
ip maddress add
e termine com isso". O problemaip maddress
afeta apenas os endereços multicast da camada de link e não os endereços multicast do protocolo (man 8 ip-maddress
).Dito isto, usar a
autojoin
bandeira com o verbo endereço faz o truque muito bem.Isso levanta algumas questões subsequentes. Presumo que você estará executando
tcpdump
outshark
que tenha permissão de root. No caso de você não ter 22001, é uma porta com numeração alta e outros utilitários comosocat
também farão as coisas.Mas não aceite minha palavra. Apenas para testar isso, podemos gerar pacotes UDP multicast com
socat
ouncat
(geralmente empacotados vianmap
/nmap-ncat
).Em algum número de hosts, execute uma das duas combinações a seguir:
Opção 1:
Opção 2:
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 rastrear o ID do processo filho e limpá-lo com umtrap
BASH possa ser exatamente o que você está procurando.Uma vez feito isso (mas antes de enlouquecermos testando nosso
tcpdump
/tshark
comando), verifique se o kernel reconhece a interface que ingressou no grupo IGMP correto. Se você está se sentindo super extravagante, pode enlouquecer ao analisar o feitiço/proc/net/igmp
, mas eu sugiro apenas corrernetstat -gn
.Depois de verificar se você vê a interface inscrita no grupo correto, inicie o comando tcpdump:
Como alternativa, se você não quiser seguir completamente a rota do tcpdump (ou se deparou com essa resposta e está curioso para ver a difusão seletiva em ação), use o
socat
comando acima para ingressar e ecoar o conteúdoSTDOUT
substituindo/dev/null
porSTDOUT
:Em outra máquina, use uma das duas opções a seguir para enviar alguns dados de teste simples:
Opção 1:
Opção 2:
Quando você executa um desses comandos, ele espera interativamente a entrada. Basta digitar algumas coisas, pressionar enter para enviar e
CTRL+D
quando terminar de enviar umaEOF
mensagem.Nesse ponto, você deveria ter visto um teste de ponta a ponta e com alguns comandos criados o pior e mais inseguro sistema de bate-papo do mundo.
fonte