Есть локальная сеть, в ней есть два роутера, оба раздают адреса с помощью SLAAC (Адреса упрощены для читаемости):
- Роутер1, fe80::1111, подсеть 2002:0:0:aaaa::/64, маршрут ::/0 в интернет
- Роутер2, fe80::2222, подсеть 300:0:0:bbbb::/64, маршрут 200::/7 в yggdrasilСоответственно клиент в сети получает разных 2 адреса (+1 link-local) и соответствующие мршруты:
$ ip addr show dev wlp1s0
3: wlp1s0:
inet6 300:0:0:bbbb::cccc/64 scope global dynamic noprefixroute
inet6 2002:0:0:aaaa::dddd/64 scope global dynamic noprefixroute
inet6 fe80::0123:4567:9abc:def0/64 scope link noprefixroute
$ ip -6 route
300:0:0:bbbb::/64 dev wlp1s0 proto ra metric 600 pref medium
200::/7 via fe80::2222 dev wlp1s0 proto ra metric 600 pref medium
2002:0:0:aaaa::/64 dev wlp1s0 proto ra metric 600 pref medium
fe80::/64 dev wlp1s0 proto kernel metric 600 pref medium
default via fe80::1111 dev wlp1s0 proto ra metric 20600 pref low
Проблема же заключается в том, для большинства исходящих пакетов по default маршруту SRC адрес выбирается 300:0:0:bbbb::cccc, с которым очевидно ничего работать не будет, а должен бы 2002:0:0:aaaa::dddd. Например:
$ ip route get 2001:4860:4860::8888
2001:4860:4860::8888 from :: via fe80::1111 dev wlp1s0 proto ra src 300:0:0:bbbb::dddd metric 20600 pref low
Т.е. пакет уходит в интернет через роутер1, но с адресом из подсети роутера2 (как я понял).
В виде одноразового костыля подходит ручное и явное указание SRC для default маршрута, но тогда SLAAC перестаёт быть stateless и теряет смысл, да и не на всех устройствах это сделать можно. Собственно вопрос такой: как эту ситуацию разрулить не вмешиваясь в настройки клиентов?