Nejsem zcela přesvědčen, že mé řešení je správné, ale mohu alespoň trochu více osvětlit, co se děje.
Pozadí
Linux má ve skutečnosti několik směrovacích tabulek a jsou prohledávány jedna po druhé v určitém pořadí priority, dokud není nalezena tabulka s odpovídající cestou. Volitelně můžete prohledávat některé ze směrovacích tabulek na základě zdrojové adresy nebo protokolu; viz ip-rule(8)
manuálová stránka.
Problémem je "místní" směrovací tabulka, která má prioritu 0, nejvyšší možnou. "Místní" tabulka je naplněna automaticky jádrem a obsahuje "zřejmé" rozhraní a přenosové cesty. Pro IPv6 pod Linuxem to zjevně zahrnuje celý blok vícesměrového vysílání.
Problém
Budu používat iproute2 namísto tradičnějšího nástroje route
, protože mi ukáže vše, co potřebuji vědět.
Na mém Linuxovém boxu:
$ 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
...A mé multicastové pakety pro ff15::1 (5==site-local,>link-local) skončí na eth0, protože "místní" směrovací tabulka se shoduje jako první a přepíše "hlavní" tabulku, i když "hlavní" tabulka má konkrétnější trasu. Toto převažující chování je správné ve větším schématu směrování politik, ale volba automatického přidávání ff00::/8 do místní tabulky je pro mě sporná.
Moje řešení
Nemám dost zkušeností, abych věděl, jestli je to dobrý nápad, ale:
# ip -6 route add ff15::/16 dev eth1 table local
a teď jsou mé pakety ff15::1 směrovány přes eth1.
To do jisté míry souhlasí se sémantikou místní tabulky v tom, že je směrována přímo přes zařízení. Nezdá se mi to úplně správné (vzhledem k automatické správě a „neměli byste se dívat na tuto tabulku“), ale je to nejlepší řešení, které jsem našel.