Usar ip route add para agregar routes de multidifusión a múltiples interfaces

TLDR: ¿Hay una manera de usar "ruta ip" para agregar routes de multidifusión para NIC múltiples?

Tenemos un software que utiliza dos grupos de multidifusión para comunicarse con dos grupos diferentes de dispositivos en dos networkinges físicas separadas. Con la exception de esta aplicación, los dispositivos de una networking no necesitan comunicarse a través de nuestro dispositivo para comunicarse con los dispositivos de la otra networking.

Grupos multicast

Para ello, el software crea dos sockets. Cada uno está enlazado a una de las direcciones IP de las NICS separadas. Ese socket es entonces unido al grupo de multidifusión que existe en esa networking, por ejemplo el socket 1 está enlazado a 192.168.0.2 y unido al grupo de multidifusión 233.255.10.1 mientras que el socket 2 está enlazado a 10.57.31.2 y unido al grupo de multidifusión 239.255.100.1.

Actualmente estamos usando un script bash (Linux kernel 3.14.39) para establecer routes de multidifusión en las dos interfaces de networking usando ruta, por ejemplo

route add -net 224.0.0.0 netmask 240.0.0.0 eth0 route add -net 224.0.0.0 netmask 240.0.0.0 eth1 

y verificado vía ruta -n

 Destination Gateway Genmask Flags Metric Ref Use Iface 224.0.0.0 0.0.0.0 240.0.0.0 U 0 0 0 eth0 224.0.0.0 0.0.0.0 240.0.0.0 U 0 0 0 eth1 

Hace poco leí que la ruta estaba obsoleta y obsoleta y que deberíamos usar ip route en su lugar, por ejemplo

 ip route add 224.0.0.0/4 dev eth0 ip route add 224.0.0.0/4 dev eth1 

Desafortunadamente, la segunda llamada falla con "respuestas RTNETLINK: existe file" y, por supuesto, la segunda ruta no aparece después de estas llamadas.

¿Hay una manera de utilizar ip route para agregar routes de multidifusión a varias NIC?

Puedo usar / 8 como una máscara de networking? p.ej

 ip route add 233.0.0.0/8 dev eth0 

y

 ip route add 239.0.0.0/8 dev eth1 

pero esto es problemático como el script que hace esto no es consciente de qué dirección de multidifusión se asocia con qué dispositivo y no siempre se garantiza que sea el mismo dependiendo de la configuration del sistema. El uso de mi primer ejemplo de ruta agrega hace que esto no sea un problema.

ACTUALIZACIONES Gracias a una extensa discusión con @Ron Maupin, me di count de que el error estaba en nuestro código. No estábamos configurando la interfaz a utilizar para la multidifusión con IP_MULTICAST_IF. Una vez que agregué la llamada setsockopt para establecer IP_MULTICAST_IF, ya no necesité agregar las tablas de routing.

 struct in_addr multicastInterface = {}; multicastInterface.s_addr = interfaceAddressNetworkOrder; // Set which outgoing interface to use int result = setsockopt(m_socket, IPPROTO_IP, IP_MULTICAST_IF, (char*)&multicastInterface, sizeof(struct in_addr)); 

One Solution collect form web for “Usar ip route add para agregar routes de multidifusión a múltiples interfaces”

Que usted tiene multicast que va a través de su caja de Linux usando el routing unicast es una combinación de un par de circunstancias afortunadas.

El routing de multidifusión no es lo mismo que el routing unidifusión. El routing unicast se basa en la cara que el tráfico se envía a una dirección única, pero el tráfico de multidifusión se envía a una dirección de grupo que representa los hosts que desean suscribirse al grupo de multidifusión.

Los hosts utilizan IGMP para indicar a un enrutador de multidifusión que quieren join a un grupo de multidifusión y el enrutador de multidifusión comenzará a enviar tráfico de multidifusión para ese grupo a la networking de los hosts que lo soliciten.

Los conmutadores modernos utilizarán IGMP Snooping para determinar qué puertos de conmutación tienen hosts que solicitan join a un grupo de multidifusión en particular y sólo enviarán tráfico para ese grupo de multidifusión a los puertos de conmutación en los que los hosts han solicitado join al grupo de multidifusión.

Linux, por sí solo, no admite routing de multidifusión, y necesita agregar algo al dispositivo Linux para admitir el routing de multidifusión. Consulte el siguiente diagtwig:

introduzca la descripción de la imagen aquí

Cuando la fuente de multidifusión empieza a enviar tráfico de multidifusión a un grupo de multidifusión, el conmutador probablemente no ha visto peticiones IGMP para join al grupo de multidifusión, por lo que el tráfico de multidifusión para ese grupo no va a ninguna parte.

Cuando uno de los orderadores del mismo conmutador desea join al grupo de multidifusión, enviará un post IGMP Join, y el conmutador fisgará y enviará el tráfico de multidifusión al puerto donde está conectada la PC solicitante.

Si un PC al otro lado del enrutador de Linux desea join al grupo de multidifusión, no tiene suerte porque el tráfico de multidifusión no fluye hacia ese lado del enrutador de Linux. El router Linux no se ha unido al grupo de multidifusión, por lo que el switch nunca envía el tráfico de multidifusión a él.

Cuando ejecuta el routing de multidifusión en un enrutador, el enrutador responderá a la petición IGMP del host y el conmutador sabrá que es un enrutador de multidifusión y enviará tráfico de multidifusión al puerto del conmutador donde está conectado el enrutador de multidifusión. De forma simplist, el enrutador no enviará el tráfico de multidifusión a otra interfaz a less que haya un receptor activo en otra interfaz (esto depende de la versión de multidifusión, por ejemplo, PIM-DM comenzará a enviar, pero retrocederá si no se ven peticiones IGMP) .

Con el routing multicast habilitado en el enrutador, una PC conectada a la otra interfaz enviará un post IGMP Join y el enrutador Linux comenzará a enviar el tráfico multicast para el grupo solicitado a la interfaz. El conmutador fisgará en la request y enviará tráfico de multidifusión al puerto del conmutador en el que está conectada la PC que solicitó join al grupo de multidifusión.

Se vuelve más complicado si necesita enrutar múltiples routers de throgh. IGMP se utiliza entre los hosts y el enrutador de multidifusión local. PIM (o algún otro protocolo de routing multicast) se utiliza entre routers de multidifusión.

Todo esto evita que el tráfico de multidifusión llegue a donde no se desea.

Hay complementos a Linux para ayudarlo a manejar adecuadamente el routing IGMP y multicast.

  • Cómo hacer sysctl configuración de puente de red persisten después de un reinicio?
  • Enrutamiento de multidifusión a través de dos subnetworkinges con FreeBSD 9 (Bonjour entre subnetworkinges)?
  • Enrutamiento IGMP / Multicast en Linux
  • altnet parámetro en file pimd.conf
  • OpenVPN - OpenVZ - Multicast y cómo habilitarlo
  • ¿Tiene que conectar el buscador IGMP a la fuente multicast?
  • Captura de datos de multidifusión con Wireshark con IGMP Snooping Habilitado en el switch
  • hay una manera de "multicast" una request con haproxy?
  • multicast tcpdump y suscripciones
  • Los packages STP cayeron (1 package cada 2 segundos) cuando el grupo multicast irrelevante se unió en la interfaz
  • ¿Cómo puedo enrutar Multicast entre interfaces segregadas en Sonicwall?
  • El linux y los temas del servidor de Windows, como ubuntu, centos, apache, nginx, debian y consejos de red.