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
能够取消旧的地址前缀。
slaac配置
参考1
帖子中
ogo
老哥说如果在设置中定义了 service
为 slaac
,EdgeOS会无视 router-advert
的设置,就无法广播新的v6地址,实测确实如此。
Config Tree 定位到 interfaces / ethernet / eth0 / pppoe / 0 / dhcpv6-pd / pd / 0 / interface / switch0
将 service
留空即可。
参考
1.Solution for client losing IPv6 connectivity after PPPoE re-assign the new prefix