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
tcpdump
verra les paquets. Si mdump
ne fonctionne pas, tcpdump
ne 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 mdump
pour établir ces jointures, mais cela semble être du gaspillage car mdump
je 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.
la source
-p
drapeau, 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.mdump
exécution dans une autre console),tcpdump
ne voit rien.Réponses:
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 add
et d'en finir". Le problème concerneip maddress
uniquement 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
autojoin
drapeau 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
tcpdump
outshark
que 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 lesocat
feront également.Mais ne me croyez pas sur parole. Juste pour tester cela, nous pouvons générer des paquets UDP multicast avec
socat
ouncat
(généralement empaqueté vianmap
/nmap-ncat
).Sur un certain nombre d'hôtes, exécutez l' une des deux combinaisons suivantes:
Option 1:
Option 2:
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 untrap
dans 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 courirnetstat -gn
.Une fois que vous avez vérifié que l'interface souscrite au bon groupe déclenche votre commande tcpdump:
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
socat
commande ci-dessus pour rejoindre et faire écho au contenuSTDOUT
en remplaçant/dev/null
parSTDOUT
:Ensuite, à partir d'une autre machine, utilisez l'une des deux options suivantes pour envoyer des données de test simples:
Option 1:
Option 2:
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+D
lorsque vous avez terminé pour envoyer unEOF
message.À 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.
la source