Mam router IPv6 zrobiony na Raspberry Pi (mało istotne) na Arch Linuksie (bardziej istotne). RPi ma tylko jeden interfejs sieciowy, eth0, co jest tutaj dość istotne.
Mam zestawiany tunel do hurricaneelectric w prostym skrypcie, coś w stylu:
ip tunnel add $if_name mode sit remote $server_ipv4 local $client_ipv4 ttl $tunnel_ttl
ip link set $if_name up mtu $link_mtu
ip addr add $client_ipv6 dev $if_name
ip route add ::/0 dev $if_name
I ten skrypt pięknie, prosto ustawia, że ::/0 ma iść na urządzenie $if_name (czyli ip6tunnel, typu sit).
Do tego mam rzecz jasna radvd i dhcp6. I mam problem z radvd. Jego konfiguracja wygląda następująco:
interface eth0
{
AdvSendAdvert on;
AdvManagedFlag on;
AdvOtherConfigFlag on;
AdvLinkMTU 1480;
prefix 2001:470:71:23a::/64
{
AdvOnLink on;
AdvAutonomous on;
};
route ::/0
{
};
};
Problem polega na tym, że radvd rozgłasza, że oferuje routing ::/0, więc eth0 samo się konfiguruje i używa routingu ::/0… i w gruncie rzeczy wychodzi na to, że urządzenie uważa, że routing ::/0 powinien iść na adres fe80::ba27:ebff:fe92:d62b (adres link-local karty eth0) przez urządzenie eth0, podczas gdy powinien iść na urządzenie ip6tunnel. Czyli robi się pętla i rzecz jasna ze względu na to, że to samo RPi jest routerem, to routing IPv6 od razu leży w całej sieci.
Wszystko kiedyś było ok, ale problem pojawił się wiele aktualizacji temu. Nie naprawiłem go jeszcze, a opieram się na uruchamianiu (ręcznym) co każdy restart (na szczęście rzadko) prostego polecenia w stylu:
sudo route -6 del ::/0 gw fe80::ba27:ebff:fe92:d62b metric 204 dev eth0
W jaki sposób można temu zaradzić?
Próbowałem w sysctl dodać brak akceptacji dla komunikatów RA na urządzeniu eth0 przez:
net.ipv6.conf.eth0.accept_ra = 0
Ale niestety, nie działa.