fragen stichworte

Verwenden Sie ip route add, um Multicast-Routen zu mehreren Schnittstellen hinzuzufügen

TLDR: Gibt es eine Möglichkeit, mit "ip route" Multicast-Routen für mehrere NICs hinzuzufügen?

Wir verfügen über Software, die zwei Multicast-Gruppen verwendet, um mit zwei unterschiedlichen Gerätegruppen in zwei separaten physischen Netzwerken zu kommunizieren. Mit Ausnahme dieser Anwendung müssen Geräte in einem Netzwerk nicht über unser Gerät kommunizieren, um mit Geräten im anderen Netzwerk zu kommunizieren.

Multicast groups

Dazu erstellt die Software zwei Sockets. Jeder ist an eine der IP-Adressen der separaten NICS gebunden. Dieser Socket wird dann mit der Multicast-Gruppe verbunden, die in diesem Netzwerk vorhanden ist, z. B. Socket 1 ist an 192.168.0.2 gebunden und an Multicast-Gruppe 233.255.10.1 angeschlossen, während Socket 2 an 10.57.31.2 gebunden und an Multicast-Gruppe 239.255.100.1 gebunden ist.

Wir verwenden derzeit ein Bash-Skript (Linux-Kernel 3.14.39), um Multicast-Routen auf den beiden Netzwerkschnittstellen mithilfe von route festzulegen, z. B.

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

und über die Route -n

überprüft
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

Ich habe kürzlich gelesen, dass die Route veraltet/veraltet ist und wir stattdessen ip route verwenden sollten, z. B.

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

Leider schlägt der zweite Anruf mit "RTNETLINK antwortet: Datei ist vorhanden" fehl und die zweite Route wird nach diesen Aufrufen natürlich nicht angezeigt.

Gibt es eine Möglichkeit, die IP-Route zum Hinzufügen von Multicast-Routen zu mehreren Netzwerkkarten zu verwenden?

kann ich/8 als Netzmaske verwenden? zB

ip route add 233.0.0.0/8 dev eth0

und

ip route add 239.0.0.0/8 dev eth1

Dies ist jedoch problematisch, da das Skript, das dies ausführt, nicht weiß, welche Multicast-Adresse welchem ​​Gerät zugeordnet ist, und es ist nicht immer garantiert, dass es abhängig von der Systemkonfiguration dieselbe ist. Wenn ich mein erstes Beispiel für route add verwende, ist dies kein Problem.

UPDATES Dank einer ausführlichen Diskussion mit @Ron Maupin wurde mir klar, dass der Fehler in unserem Code lag. Die Schnittstelle für das Multicasting mit IP_MULTICAST_IF wurde nicht festgelegt. Nachdem ich den Satz setsockopt hinzugefügt habe, um IP_MULTICAST_IF festzulegen, musste ich die Routingtabellen nicht mehr hinzufügen.

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));

antworten

Dass Sie Multicast mit Unicast-Routing durch Ihre Linux-Box laufen lassen, ist eine Kombination aus einigen glücklichen Umständen.

Multicast-Routing ist nicht dasselbe wie Unicast-Routing. Unicast-Routing basiert auf dem Gesicht, dass der Verkehr an eine einzelne Adresse gesendet wird, der Multicast-Verkehr wird jedoch an eine Gruppenadresse gesendet, die Hosts darstellt, die die Multicast-Gruppe abonnieren möchten.

Hosts verwenden IGMP, um einem Multicast-Router mitzuteilen, dass sie einer Multicast-Gruppe beitreten möchten. Der Multicast-Router sendet dann Multicast-Datenverkehr für diese Gruppe an das Netzwerk der Hosts, die dies anfordern.

Moderne Switches verwenden IGMP-Snooping, um zu bestimmen, welche Switch-Ports Hosts anfragen, einer bestimmten Multicast-Gruppe beizutreten. Sie werden nur den Verkehr für diese Multicast-Gruppe an die Switch-Ports senden, an denen die Hosts angefordert haben, der Multicast-Gruppe beizutreten.

Linux unterstützt kein Multicast-Routing, und Sie müssen dem Linux-Gerät etwas hinzufügen, um Multicast-Routing zu unterstützen. Siehe folgendes Diagramm:

enter image description here

Wenn die Multicast-Quelle mit dem Senden von Multicast-Verkehr für eine Multicast-Gruppe beginnt, hat der Switch wahrscheinlich keine IGMP-Anforderungen zum Beitritt zur Multicast-Gruppe gesehen, sodass der Multicast-Verkehr für diese Gruppe nirgendwo hingeht.

Wenn einer der PCs auf demselben Switch der Multicast-Gruppe beitreten möchte, sendet er eine IGMP-Join-Nachricht. Der Switch kann darauf zugreifen und den Multicast-Verkehr an den Port senden, an den der anfragende PC angeschlossen ist.

Wenn sich ein PC auf der anderen Seite des Linux-Routers der Multicast-Gruppe anschließen möchte, ist dies kein Zufall, da der Multicast-Verkehr nicht zu dieser Seite des Linux-Routers fließt. Der Linux-Router ist nicht einmal der Multicast-Gruppe beigetreten, sodass der Switch niemals den Multicast-Verkehr an ihn sendet.

Wenn Sie Multicast-Routing auf einem Router ausführen, antwortet der Router auf die IGMP-Anforderung des Hosts. Der Switch weiß, dass es sich um einen Multicast-Router handelt, und sendet Multicast-Verkehr an den Switch-Port, an dem der Multicast-Router angeschlossen ist . Vereinfacht ausgedrückt, sendet der Router den Multicast-Verkehr nicht an eine andere Schnittstelle, es sei denn, es ist ein aktiver Empfänger an einer anderen Schnittstelle vorhanden (dies hängt von der Multicast-Version ab, z. B. PIM-DM beginnt mit dem Senden, wird jedoch zurückgesetzt, wenn keine IGMP-Anforderungen angezeigt werden.) .

Wenn Multicast-Routing auf dem Router aktiviert ist, sendet ein an die andere Schnittstelle angeschlossener PC eine IGMP-Join-Nachricht, und der Linux-Router beginnt mit dem Senden des Multicast-Verkehrs für die angeforderte Gruppe an die Schnittstelle. Der Switch greift die Anfrage ab und sendet Multicast-Verkehr an den Switch-Port, an dem der PC angeschlossen ist, der den Beitritt zur Multicast-Gruppe angefordert hat.

Es wird komplizierter, wenn Sie mehrere Router routen müssen. IGMP wird zwischen den Hosts und dem lokalen Multicast-Router verwendet. PIM (oder ein anderes Multicast-Routing-Protokoll) wird zwischen Multicast-Routern verwendet.

All dies verhindert, dass Multicast-Verkehr dorthin geht, wo er nicht gewünscht ist.

Es gibt Add-Ons für Linux, die das korrekte Handling von IGMP und Multicast-Routing unterstützen.