Я не совсем уверен, что мое решение верное, но я могу хотя бы пролить немного света на происходящее.
Фон
На самом деле в Linux есть несколько таблиц маршрутизации, и они ищутся по одной в определенном порядке приоритетов, пока не будет найдена таблица с соответствующим маршрутом. При желании вы можете искать в некоторых таблицах маршрутизации на основе адреса источника или протокола; см. справочную страницу ip-rule(8)
.
Проблема в том, что «локальная» таблица маршрутизации имеет приоритет 0, максимально возможный. «Локальная» таблица заполняется ядром автоматически и содержит «очевидный» интерфейс и широковещательные маршруты. Для IPv6 под Linux это, очевидно, включает весь многоадресный блок.
Проблема
Я собираюсь использовать инструмент iproute2 , а не более традиционный route
, потому что он покажет мне все, что мне нужно знать.
На моем компьютере с Linux:
$ 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
... И мои многоадресные пакеты для ff15 :: 1 (5 == site-local,> link-local) заканчиваются на eth0, потому что "локальная" таблица маршрутизации соответствует первой и переопределяет "главную" таблицу, хотя «главная» таблица имеет более конкретный маршрут. Такое поведение переопределения является правильным в большей схеме маршрутизации политики, но выбор автоматического добавления ff00 :: / 8 в локальную таблицу вызывает у меня сомнения.
Мое решение
У меня недостаточно опыта, чтобы понять, хорошая ли это идея, но:
# ip -6 route add ff15::/16 dev eth1 table local
и теперь мои пакеты ff15 :: 1 маршрутизируются через eth1.
Это в некоторой степени согласуется с семантикой локальной таблицы в том смысле, что она направляется непосредственно через устройство. Это не совсем правильно (учитывая автоматическое управление и «вам не нужно смотреть на эту таблицу»), но это лучшее решение, которое я нашел.