Crear uniones de multidifusión para capturas de tcpdump

11

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

tcpdumpVerá los paquetes. Si mdumpno se está ejecutando, tcpdumpno ve nada.

¿Existe una forma estándar de Linux para establecer estas uniones de multidifusión antes de comenzar las capturas? Podría usar mdumppara establecer estas uniones, pero parece un desperdicio ya mdumpque 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.

John Dibling
fuente
1
A no ser que se está ejecutando una versión no estándar de tcpdump, que está poniendo la interfaz en modo promiscuo - la -pbandera, 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.
1
@GuyHarris: Gracias por la aclaración. Estoy en una red conmutada. Sin la suscripción ya establecida (es decir, con la mdumpejecución en otra consola), tcpdumpno ve nada.
John Dibling
Y si no quieren que se ejecute en modo promiscuo, probablemente tampoco quieran que usted (o ni siquiera lo permita ) configure un "puerto reflejado" en el conmutador (suponiendo que el conmutador incluso lo soporte) para obtener copias de todo el tráfico a través del conmutador (o todo el tráfico a través de puertos particulares, si es posible).
Entonces, ¿qué hay de malo en hacer esto con un script? Lo que importa es si hace el trabajo, no si alguien lo considera "de la manera habitual": ¿qué tiene de inusual el guión?
El modo prometedor está deshabilitado porque habilitarlo aparentemente afectaría a las otras máquinas virtuales en el host. Esto no es deseado. Yo puedo configurar un puerto duplicado en el interruptor - estos son aristas de 40GB - pero no estoy seguro de que su punto.
John Dibling

Respuestas:

5

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 addy listo". El problema ip maddresssolo 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 autojoinbandera con el verbo de dirección funciona muy bien.

Sin embargo, esto plantea algunas preguntas posteriores. Supongo que ya se ejecutará tcpdumpo tsharkque tiene permiso de root. En el caso de que no lo haga, 22001 es un puerto con un número alto y otras utilidades como socattambién harán las cosas.

Sin embargo, no confíes en mi palabra. Solo para probar esto podemos generar paquetes UDP multicast con socato ncat(generalmente empaquetados a través de nmap/ nmap-ncat).

En algunos hosts, ejecute una de las siguientes dos combinaciones:

Opción 1:

sudo ip addr add 233.54.12.234/32 dev eth1 autojoin

Opcion 2:

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

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 con trapBASH puede ser justo lo que está buscando).

Una vez hecho esto (pero antes de volvernos locos probando nuestro tcpdump/ tsharkcomando) 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 corras netstat -gn.

Una vez que haya verificado que ve la interfaz suscrita al grupo correcto, inicie su comando tcpdump:

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

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 socatcomando anterior para unirse y hacer eco del contenido STDOUTreemplazándolo /dev/nullcon STDOUT:

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

Luego, desde otra máquina, use una de las siguientes dos opciones para enviar algunos datos de prueba simples:

Opción 1:

socat STDIO UDP-DATAGRAM:233.54.12.234:22001

Opcion 2:

ncat  -u 233.54.12.234 22001

Cuando ejecuta cualquiera de esos comandos, esperará interactivamente la entrada. Simplemente escriba algunas cosas, presione enter para enviar, luego CTRL+Dcuando haya terminado de enviar un EOFmensaje.

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.

Brian Barba Roja
fuente
1
¡Guau, tomó 4 años obtener una respuesta! Ya ni siquiera estoy haciendo esto, y realmente no tengo forma de probarlo, pero no obstante lo aceptaré.
John Dibling
1
¡Es útil ahora mismo! : D Gracias Brian :)
Quaylar