Wie zum senden von multicast-Paketen über eine spezifisch-Schnittstelle in Linux
Versucht haben, jede mögliche Weise nicht finden konnte, eine Arbeit um für dieses problem. Ich habe ein Rechner mit zwei interfaces eth0 und eth2. Ich möchte, dass alle ff38:40:2001:dead:beef:cafe::/96 Pakete gehen auf eth2. Ich habe versucht, alle folgenden aber wenn ich das mache ping6 ff38:40:2001:dead:beef:cafe::1 Pakete geht immer auf eth0. Dinge, die ich habe versucht und haben nicht funktioniert (d.h., Paket geht noch auf eth0).
$> route add --inet6 ff38:40:2001:dead:beef:cafe::/96 gw 2003::100 dev eth2
$> route add --inet6 ff38:40:2001:dead:beef:cafe::/96 dev eth2
$> route add --inet6 ff38:40:2001:dead:beef:cafe::/96 metric 1 gw 2003::100 dev eth2
Meine routing-Tabelle ist
[root@dev ~]# route --inet6 |grep eth0
fe80::/64 * U 256 0 0 eth0
ff00::/8 * U 256 0 0 eth0
[root@dev ~]# route --inet6 |grep eth2
2003::/64 * U 256 68 0 eth2
fe80::/64 * U 256 0 0 eth2
ff38:40:2001:dead:beef:cafe::/96 2003::100 UG 1 0 0 eth2
*/0 fe80::c671:feff:fe14:e482 UGDA 1024 0 0 eth2
ff00::/8 * U 256 0 0 eth2
Jedoch ping6 ff38:40:2001:dead:beef:cafe::1-I eth2 gut funktionieren. Darüber hinaus sehe ich dieses problem nur auf Linux-Computern (MAC ist in Ordnung).
[root@dev ~]# ping6 ff38:40:2001:dead:beef:cafe::1 -I eth2
PING ff38:40:2001:dead:beef:cafe::1(ff38:40:2001:dead:beef:cafe:0:1) from cal eth2: 56 data bytes
64 bytes from 2012::1: icmp_seq=0 ttl=253 time=19.1 ms
64 bytes from 2012::1: icmp_seq=1 ttl=253 time=2.16 ms
64 bytes from 2012::1: icmp_seq=2 ttl=253 time=2.14 ms
64 bytes from 2012::1: icmp_seq=3 ttl=253 time=2.26 ms
64 bytes from 2012::1: icmp_seq=4 ttl=253 time=2.08 ms
64 bytes from 2012::1: icmp_seq=5 ttl=253 time=2.15 ms
root@dev ~]# uname -a
Linux 2.6.18-194.el5 #1 SMP Tue Mar 16 21:52:39 EDT 2010 x86_64 x86_64 x86_64 GNU/Linux
Vielleicht das problem hat mit der Tatsache zu tun, dass es eine ff00::/8 für eth0. Wie kann ich mich überstimmen, die route. Ich bin nicht in der Lage zu löschen ff00::/8 route als gut.
- Wenn die Anwendung ist ausgefeilt genug, um IPv6 zu nutzen, warum nicht Fortgeschritten genug, um wählen Sie die ausgehende Schnittstelle.
- Denn zumindest traditionell, das ist es, was die routing-Tabellen sind für. IPv6 ändert die Dinge etwas mit seinem Konzept von scoped-Adressen, aber sicher wird die routing-Tabelle das routing der Adressen, die die Website-Bereich oder höher?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich bin nicht ganz überzeugt, dass meine Lösung richtig ist, aber ich kann zumindest werfen ein wenig mehr Licht auf, was Los ist.
Hintergrund
Linux hat eigentlich mehrere routing-Tabellen, und Sie durchsucht werden nacheinander in einer bestimmten Reihenfolge Ihrer Priorität, bis ein Tisch mit einem passenden route gefunden wird. Optional können Sie suchen einige der routing-Tabellen basierend auf der Quell-Adresse oder Protokoll; siehe
ip-rule(8)
man-Seite.Das Problem ist die "local" - routing-Tabelle, die hat die Priorität 0, die höchste möglich. Die "local" - Tabelle wird aufgefüllt, automatisch vom kernel und hält die "Hand" - Schnittstelle und broadcast-Routen. Für IPv6 unter Linux, das anscheinend die gesamte multicast-block.
Das Problem
Werde ich mit dem iproute2 tool eher als die traditionellen
route
, denn es zeigt mir alles was ich wissen muss.Auf meiner Linux-box:
...Und meine multicast-Pakete für ff15::1 (5==site-local, >link-local) am Ende auf eth0, weil die "local" - routing-Tabelle entspricht der ersten und überschreibt die "Haupt" - Tabelle, obwohl die "Haupt" - Tabelle hat eine bestimmte route. Dieses übergeordnete Verhalten ist korrekt in das größere Schema der policy-routing, aber die Wahl der auto-hinzufügen ff00::/8 auf dem lokalen Tabelle, ist fraglich für mich.
Meine Lösung
Ich habe nicht genug Erfahrung, um zu wissen, ob das eine gute Idee, aber:
und jetzt meine ff15::1 Pakete geroutet über eth1.
Dieser stimmt etwas mit der Semantik der lokalen Tabelle, in, dass es direkt weitergeleitet, durch ein Gerät. Es fühlt sich nicht genau gleich (wenn man die automatische Verwaltung und "Sie sollten nicht haben, dies zu betrachten Tisch"), aber es ist die beste Lösung, die ich gefunden habe.
Multicast ist von Natur aus eine lokale link "broadcast". Wie Sie muss immer auf die zone oder das Netzwerk-interface gesendet wird. Es ist kein routing.
Wenn Sie mehrere interfaces verwenden, sollten Sie senden Sie es an mehrere Schnittstellen.
Die Art und Weise, es zu tun ist: ping(6) ip% - zone .
Jetzt am gleichen Netz kann ein router, der die Pakete erhält und vielleicht leitet es an eine andere zone, iff einige Knoten auf der anderen zone abonniert hat, die Adresse und die TTL für das Paket > 1. Es sind keine routing-Tabellen beteiligt multicast-routing, außer an den multicast-Router.
Da diese ursprüngliche Frage war aus 2012, die um diese Zeit in die, user kernel-space wurde behoben, um es illegal zu senden, die ein multicast-Paket ohne eine zone-id.
So ping6 in der ursprünglichen Frage, würde auch nicht funktionieren.
Die situation für IPv4 ist schrecklich, da ist es schwer zu binden, an eine bestimmte Schnittstelle für den ausgehenden multicast, es sei denn, die verwendete software wurde korrekt umgesetzt.