Use ip route add para adicionar rotas multicast a várias interfaces

6

TLDR: Existe uma maneira de usar "ip route" para adicionar rotas multicast para várias NICs?

Temos um software que usa dois grupos de multicast para se comunicar com dois grupos diferentes de dispositivos em duas redes físicas separadas. Com exceção deste aplicativo, os dispositivos em uma rede não precisam se comunicar em todo o dispositivo para se comunicar com dispositivos na outra rede.

Parafazerisso,osoftwarecriadoissoquetes.CadauméligadoaoumdosendereçosIPdoNICSseparado.Essesoqueteéentãounidoaogrupomulticastqueexistenessarede,porexemplo,osoquete1éligadoa192.168.0.2eunidoaogrupomulticast233.255.10.1,enquantoosoquete2éligadoa10.57.31.2eunidoaogrupomulticast239.255.100.1.

Nomomento,estamosusandoumscriptbásico(kernelLinux3.14.39)paradefinirrotasmulticastnasduasinterfacesderedeusandorota,porexemplo

routeadd-net224.0.0.0netmask240.0.0.0eth0routeadd-net224.0.0.0netmask240.0.0.0eth1

everificadoviaroute-n

DestinationGatewayGenmaskFlagsMetricRefUseIface224.0.0.00.0.0.0240.0.0.0U000eth0224.0.0.00.0.0.0240.0.0.0U000eth1

Eulirecentementequeessarotaestavaobsoleta/obsoletaequedeveríamosestarusandoiproute,porexemplo

iprouteadd224.0.0.0/4deveth0iprouteadd224.0.0.0/4deveth1

Infelizmente,asegundachamadafalhacom"respostas RTNETLINK: arquivo existe" e, claro, a segunda rota não aparece após essas chamadas.

Existe uma maneira de usar o ip route para adicionar rotas multicast a várias NICs?

Eu posso usar / 8 como máscara de rede? eg

ip route add 233.0.0.0/8 dev eth0

e

ip route add 239.0.0.0/8 dev eth1

mas isso é problemático, pois o script que faz isso não está ciente de qual endereço de multicast está associado a qual dispositivo e nem sempre é garantido que ele seja o mesmo, dependendo da configuração do sistema. Usar meu primeiro exemplo de route add faz com que isso não seja um problema.

ATUALIZAÇÕES Graças a uma discussão extensa com @Ron Maupin, percebi que o erro estava em nosso código. Não estávamos configurando a interface para multicast com IP_MULTICAST_IF. Depois que adicionei a chamada setsockopt para definir IP_MULTICAST_IF, não precisei mais adicionar as tabelas de roteamento.

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));
    
por gnac 10.11.2016 / 18:26

1 resposta

6

O fato de você ter o multicast passando pela sua caixa do Linux usando o roteamento unicast é uma combinação de algumas circunstâncias de sorte.

O roteamento multicast não é o mesmo que o roteamento unicast. O roteamento Unicast é baseado na face em que o tráfego é enviado para um único endereço, mas o tráfego multicast é enviado para um endereço de grupo que representa hosts que desejam se inscrever no grupo multicast.

Os hosts usam o IGMP para informar a um roteador de multidifusão que desejam ingressar em um grupo de multidifusão, e o roteador de multidifusão começará a enviar o tráfego de multidifusão desse grupo para a rede dos hosts que solicitarem isso.

Os switches modernos usarão IGMP Snooping para determinar quais portas de switch têm hosts que solicitam a associação a um grupo de multidifusão específico e só enviarão tráfego para esse grupo de multicast para as portas de switch onde os hosts solicitaram a associação ao grupo de multicast. / p>

O Linux, por si só, não suporta roteamento multicast, e você precisa adicionar algo ao dispositivo Linux para suportar roteamento multicast. Consulte o diagrama abaixo:

Quando a fonte multicast começa a enviar tráfego multicast para um grupo multicast, o switch provavelmente não viu nenhum pedido IGMP para se juntar ao grupo multicast, então o tráfego multicast para esse grupo não leva a lugar nenhum.

Quando um dos PCs no mesmo switch quiser se unir ao grupo multicast, ele enviará uma mensagem IGMP Join, e o switch irá espioná-lo e enviar o tráfego multicast para a porta na qual o PC solicitante está conectado. / p>

Se um PC do outro lado do roteador Linux quiser se unir ao grupo de multicast, fica sem sorte porque o tráfego multicast não está fluindo para esse lado do Roteador Linux. O Roteador Linux nem sequer se juntou ao grupo multicast, então o switch nunca envia o tráfego multicast para ele.

Quando você executa o roteamento multicast em um roteador, o roteador responderá à solicitação IGMP do host, e o switch saberá que é um roteador multicast e enviará o tráfego multicast à porta do switch na qual o roteador multicast está conectado . Simplisticamente, o roteador não enviará o tráfego multicast para outra interface, a menos que haja um receptor ativo em outra interface (isso depende da versão multicast, por exemplo, o PIM-DM começará a enviar, mas desistirá se nenhuma solicitação IGMP for vista) .

Com o roteamento multicast ativado no roteador, um PC conectado à outra interface enviará uma mensagem IGMP Join e o Roteador Linux começará a enviar o tráfego multicast do grupo solicitado para a interface. O switch analisará a solicitação e enviará o tráfego multicast à porta do switch em que o PC que solicitou a associação ao grupo multicast está conectado.

Isso fica mais complicado se você precisar rotear vários roteadores. O IGMP é usado entre os hosts e o roteador de multidifusão local. O PIM (ou algum outro protocolo de roteamento multicast) é usado entre os roteadores multicast.

Isso tudo impede que o tráfego multicast vá aonde não é desejado.

Existem add-ons no Linux para ajudá-lo a lidar adequadamente com roteamento IGMP e multicast.

    
por 10.11.2016 / 21:18