Quiero escribir un script de shell de Linux que capturará tráfico de multidifusión específico. Específico como en, quiero crear un archivo pcap que tenga todo el tráfico para un grupo / puerto de multidifusión específico.
Aquí está la línea de comando que estoy usando para ver el tráfico:
tcpdump -nnXs 0 -i eth1 udp port 22001 and dst 233.54.12.234
Esto funciona bien siempre que tenga una suscripción de multidifusión a ese grupo ya establecida. Por ejemplo, si ejecuto esto en otra consola:
mdump 233.54.12.234 22001 10.13.252.51
tcpdump
Verá los paquetes. Si mdump
no se está ejecutando, tcpdump
no ve nada.
¿Existe una forma estándar de Linux para establecer estas uniones de multidifusión antes de comenzar las capturas? Podría usar mdump
para establecer estas uniones, pero parece un desperdicio ya mdump
que procesará todos esos datos en el grupo, pero voy a tirarlos.
Tenga en cuenta que debido a mi entorno específico, se me ha desanimado de poner la interfaz en modo promiscuo. De hecho, puede estar prohibido.
fuente
-p
bandera, en versiones estándar de tcpdump, resulta modo promiscuo fuera , ya que es el por defecto. En el modo promiscuo, debería ver todo el tráfico, incluido el tráfico de multidifusión, independientemente de si tiene la suscripción establecida, a menos que esté en una red conmutada y es necesario tener la suscripción establecida para que el conmutador le envíe el tráfico.mdump
ejecución en otra consola),tcpdump
no ve nada.Respuestas:
TL; DR - Elija uno:
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
Al principio iba a decir "solo utilízalo
ip maddress add
y listo". El problemaip maddress
solo afecta a las direcciones de multidifusión de capa de enlace, no a las direcciones de multidifusión de protocolo (man 8 ip-maddress
).Dicho esto, el uso de la
autojoin
bandera con el verbo de dirección funciona muy bien.Sin embargo, esto plantea algunas preguntas posteriores. Supongo que ya se ejecutará
tcpdump
otshark
que tiene permiso de root. En el caso de que no lo haga, 22001 es un puerto con un número alto y otras utilidades comosocat
también harán las cosas.Sin embargo, no confíes en mi palabra. Solo para probar esto podemos generar paquetes UDP multicast con
socat
oncat
(generalmente empaquetados a través denmap
/nmap-ncat
).En algunos hosts, ejecute una de las siguientes dos combinaciones:
Opción 1:
Opcion 2:
La primera opción requerirá root, o al menos la capacidad
CAP_NET_ADMIN
. La segunda opción no requiere root, pero también espera ejecutarse en primer plano y, por lo tanto, puede ser menos propicio para las secuencias de comandos (aunque rastrear la ID del proceso secundario y limpiarlo contrap
BASH puede ser justo lo que está buscando).Una vez hecho esto (pero antes de volvernos locos probando nuestro
tcpdump
/tshark
comando) asegúrese de que el kernel reconozca que la interfaz se ha unido al grupo IGMP correcto. Si te sientes súper elegante, puedes volverte loco analizando el hechizo/proc/net/igmp
, pero te sugiero que solo corrasnetstat -gn
.Una vez que haya verificado que ve la interfaz suscrita al grupo correcto, inicie su comando tcpdump:
Alternativamente, si no desea seguir completamente la ruta de tcpdump (o tropezó con esta respuesta y siente curiosidad por ver la multidifusión en acción), puede usar el
socat
comando anterior para unirse y hacer eco del contenidoSTDOUT
reemplazándolo/dev/null
conSTDOUT
:Luego, desde otra máquina, use una de las siguientes dos opciones para enviar algunos datos de prueba simples:
Opción 1:
Opcion 2:
Cuando ejecuta cualquiera de esos comandos, esperará interactivamente la entrada. Simplemente escriba algunas cosas, presione enter para enviar, luego
CTRL+D
cuando haya terminado de enviar unEOF
mensaje.En este punto, debería haber visto una prueba de extremo a extremo y con unos pocos comandos creó el peor sistema de chat más inseguro del mundo.
fuente