EdgeOS在PPPoE下正确处理IPv6地址变动

目录

PPPoE重播会导致IPv6地址变动,EdgeOS自带设置会造成断网问题,需要施加一些特技…

前期配置IPv6可以参照这篇(记得设置eth0-pppoe-0-ipv6-enable): https://blog.ich8.com/post/6023

PPPoE重播会导致IPv6地址变动,EdgeOS(EdgeRouter X v2.0.9-hotfix.7)对于这块的支持有点问题,搜索了一圈,发现官方community有几个帖子讨论过这个问题。

原因

当PPPoE断开连接时,switch0仍然保留旧的IPv6地址。同时,radvd继续基于绑定在switch0上的地址广播IPv6前缀。这使得客户端认为两个IPv6前缀都是有效的,并且只要旧的IPv6地址仍然在AdvPreferredLifetime时间段内,将选择继续使用旧的IPv6地址,导致IPv6不通。

解决思路

断开PPPoE连接时从switch0中移除旧的IPv6地址。当PPPoE连接再次建立/连接时,新的IPv6地址和前缀将绑定到switch0上。由于radvd仅会广播绑定在switch0上的IPv6地址,不再广播旧的IPv6前缀。从客户端来看,当它接收到一个没有现有前缀但有新前缀的新路由器通告(RA)时,它会将旧的IPv6地址视为“已分离”,并根据RA设置新的IPv6地址。旧地址仍将保留在系统中,但没有影响(当“有效生存时间”到达时,操作系统将删除它)。

具体操作

新建脚本

/etc/ppp/ip-down.d/下新建脚本,PPPoE断开时会自动执行。

sudo vi /etc/ppp/ip-down.d/remove_invalidv6.sh

#!/bin/sh

/sbin/ifconfig switch0 | grep -ivE 'fe80' | grep 'inet6' | awk '{print $2}' | while read -r ipv6addr ; do
    echo "Removing $ipv6addr from switch0" >> /tmp/ipv6_remove.log
    echo $ipv6addr
    /sbin/ip -6 addr del $ipv6addr/64 dev switch0
done
/etc/init.d/radvd restart

添加执行权限。

sudo chmod +x /etc/ppp/ip-down.d/remove_invalidv6.sh

修改 radvd配置。

sudo vi /opt/vyatta/sbin/vyatta_gen_radvd.pl

定位至248行,在 print $FD_WR " };\n";前插入一行 print $FD_WR " DeprecatePrefix on;\n";

这一步目的是让 radvd能够取消旧的地址前缀。

img
img

slaac配置

参考1 帖子中 ogo 老哥说如果在设置中定义了 serviceslaac,EdgeOS会无视 router-advert的设置,就无法广播新的v6地址,实测确实如此。

Config Tree 定位到 interfaces / ethernet / eth0 / pppoe / 0 / dhcpv6-pd / pd / 0 / interface / switch0service留空即可。

img
img

参考

1.Solution for client losing IPv6 connectivity after PPPoE re-assign the new prefix