Ich bin nicht ganz davon überzeugt, dass meine Lösung richtig ist, aber ich kann zumindest etwas mehr Licht ins Dunkel bringen.
Hintergrund
Linux hat tatsächlich mehrere Routing-Tabellen, und sie werden nacheinander in einer bestimmten Prioritätsreihenfolge durchsucht, bis eine Tabelle mit einer passenden Route gefunden wird. Sie können optional einige der Routing-Tabellen basierend auf der Quelladresse oder dem Protokoll durchsuchen; siehe ip-rule(8)
Manpage.
Das Problem ist die "lokale" Routing-Tabelle, die die höchstmögliche Priorität 0 hat. Die "lokale" Tabelle wird automatisch vom Kernel gefüllt und enthält "offensichtliche" Schnittstellen- und Broadcast-Routen. Für IPv6 unter Linux umfasst dies anscheinend den gesamten Multicast-Block.
Das Problem
Ich werde die iproute2 verwenden statt des traditionelleren route
, weil es mir alles zeigen wird, was ich wissen muss.
Auf meiner Linux-Box:
$ ip -6 route show table local
local ::1 via :: dev lo proto none metric 0
local fe80::213:a9ff:fe91:5bcb via :: dev lo proto none metric 0
local fe80::250:b6ff:fe44:37d1 via :: dev lo proto none metric 0
ff00::/8 dev eth0 metric 256
ff00::/8 dev eth1 metric 256
$ ip -6 route show table main
fe80::/64 dev eth0 proto kernel metric 256
fe80::/64 dev eth1 proto kernel metric 256
ff15::/16 dev eth1 metric 1024
ff00::/8 dev eth1 metric 1024
$ ip -6 rule show
0: from all lookup local
32766: from all lookup main
...Und meine Multicast-Pakete für ff15::1 (5==site-local,>link-local) landen auf eth0, weil die "lokale" Routing-Tabelle zuerst passt und die "Haupt"-Tabelle überschreibt, obwohl die "Haupt"-Tabelle hat eine spezifischere Route. Dieses überschreibende Verhalten ist im größeren Schema des Policy-Routing korrekt, aber die Entscheidung, ff00::/8 automatisch zur lokalen Tabelle hinzuzufügen, ist für mich fragwürdig.
Meine Lösung
Ich habe nicht genug Erfahrung, um zu wissen, ob das eine gute Idee ist, aber:
# ip -6 route add ff15::/16 dev eth1 table local
und jetzt werden meine ff15::1-Pakete durch eth1 geleitet.
Dies stimmt in gewisser Weise mit der Semantik der lokalen Tabelle überein, da sie direkt durch ein Gerät geleitet wird. Es fühlt sich nicht ganz richtig an (in Anbetracht der automatischen Verwaltung und "Sie sollten sich diese Tabelle nicht ansehen müssen"), aber es ist die beste Lösung, die ich gefunden habe.