Création d'une jointure multidiffusion pour les captures tcpdump

11

Je veux écrire un script shell linux qui capturera un trafic multicast spécifique. Spécifique comme dans, je veux créer un fichier pcap qui a tout le trafic pour un groupe / port de multidiffusion spécifique.

Voici la ligne de commande que j'utilise pour afficher le trafic:

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

Cela fonctionne bien tant que j'ai un abonnement multicast à ce groupe déjà établi. Par exemple, si je lance ceci dans une autre console:

mdump 233.54.12.234 22001 10.13.252.51

tcpdumpverra les paquets. Si mdumpne fonctionne pas, tcpdumpne voit rien.

Existe-t-il un moyen linux-y standard d'établir ces jointures de multidiffusion avant de démarrer les captures? Je pourrais utiliser mdumppour établir ces jointures, mais cela semble être du gaspillage car mdumpje traiterai toutes ces données sur le groupe, mais je vais juste les jeter.

Notez qu'en raison de mon environnement spécifique, j'ai été découragé de mettre l'interface en mode promiscuous. Elle peut en fait être interdite.

John Dibling
la source
1
À moins que vous utilisez une version non standard de tcpdump, vous êtes mettez l'interface en mode promiscuous - le -pdrapeau, dans les versions standard de tcpdump, tourne le mode promiscuous off , car il est sur par défaut. En mode promiscuous, il devrait voir tout le trafic, y compris le trafic de multidiffusion, que l'abonnement soit établi ou non - sauf si vous êtes sur un réseau commuté et qu'il est nécessaire d'avoir l'abonnement établi pour que le commutateur vous fasse suivre le trafic.
1
@GuyHarris: Merci pour la clarification. Je suis sur un réseau commuté. Sans l'abonnement déjà établi (c'est-à-dire avec l' mdumpexécution dans une autre console), tcpdumpne voit rien.
John Dibling le
Et s'ils ne veulent pas que vous fonctionniez en mode promiscuité, ils ne veulent probablement pas non plus que vous (ou ne vous laissiez même pas ) configurer un "port en miroir" sur le commutateur (en supposant que le commutateur le supporte même) pour obtenir des copies de tout le trafic via le commutateur (ou de tout le trafic via des ports particuliers, si cela est possible).
Alors qu'est-ce qui ne va pas avec ça avec un script? Ce qui importe, c'est de savoir si le travail est fait, et non si quelqu'un le considère "de la manière habituelle" - qu'est-ce qui est "inhabituel" dans le script?
Le mode Promiscious est désactivé car son activation aurait, apparemment, un impact sur les autres VM sur l'hôte. C'est indésirable. Je peux configurer un port en miroir au niveau du commutateur - ce sont des aristas de 40 Go - mais je ne suis pas sûr de voir votre point.
John Dibling

Réponses:

5

TL; DR - Choisissez un:

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


Au début, j'allais dire "il suffit d'utiliser ip maddress addet d'en finir". Le problème concerne ip maddressuniquement les adresses de multidiffusion de couche liaison et non les adresses de multidiffusion de protocole ( man 8 ip-maddress).

Cela étant dit, l'utilisation du autojoindrapeau avec le verbe d' adresse fait très bien l'affaire.

Cela soulève cependant quelques questions subséquentes. Je suppose que vous serez en cours d'exécution tcpdumpou tsharkque vous disposez des droits root. Dans le cas où vous ne le faites pas, le 22001 est un port à numéro élevé et d'autres utilitaires comme le socatferont également.

Mais ne me croyez pas sur parole. Juste pour tester cela, nous pouvons générer des paquets UDP multicast avec socatou ncat(généralement empaqueté via nmap/ nmap-ncat).

Sur un certain nombre d'hôtes, exécutez l' une des deux combinaisons suivantes:

Option 1:

sudo ip addr add 233.54.12.234/32 dev eth1 autojoin

Option 2:

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

La première option nécessitera soit root, soit au moins la capacité CAP_NET_ADMIN . La deuxième option ne nécessite pas de racine, mais prévoit également de s'exécuter au premier plan et peut donc être moins propice à l'écriture de scripts (bien que le suivi de l'ID de processus enfant et le nettoyage avec un trapdans BASH soit exactement ce que vous recherchez.

Une fois que cela est fait (mais avant de passer en test de notre commande tcpdump/ tshark), assurez-vous que le noyau reconnaît l'interface ayant rejoint le bon groupe IGMP. Si vous vous sentez super chic, vous pouvez devenir fou en analysant l'hexagone /proc/net/igmp, mais je suggère de simplement courir netstat -gn.

Une fois que vous avez vérifié que l'interface souscrite au bon groupe déclenche votre commande tcpdump:

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

Alternativement, si vous ne voulez pas suivre complètement la route de tcpdump (ou êtes tombé sur cette réponse et êtes simplement curieux de voir la multidiffusion en action), vous pouvez utiliser la socatcommande ci-dessus pour rejoindre et faire écho au contenu STDOUTen remplaçant /dev/nullpar STDOUT:

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

Ensuite, à partir d'une autre machine, utilisez l'une des deux options suivantes pour envoyer des données de test simples:

Option 1:

socat STDIO UDP-DATAGRAM:233.54.12.234:22001

Option 2:

ncat  -u 233.54.12.234 22001

Lorsque vous exécutez l'une de ces commandes, il attendra alors de manière interactive l'entrée. Tapez simplement certaines choses, appuyez sur Entrée pour envoyer, puis CTRL+Dlorsque vous avez terminé pour envoyer un EOFmessage.

À ce stade, vous devriez avoir vu un test de bout en bout et avec quelques commandes, vous avez créé le pire système de chat le plus insécure au monde.

Brian Redbeard
la source
1
Wow, il a fallu 4 ans pour obtenir une réponse! Je ne fais même plus ça, et je n'ai vraiment aucun moyen de tester, mais j'accepte quand même.
John Dibling, le
1
Vient à portée de main en ce moment! : D Merci Brian :)
quaylar