路由器重新拨号之后,ipv6前缀会变,导致无法使用ipv6(几年了,也没解决)

一般3天后会重新分配一个新的ipv6前缀,此时基于旧的前缀分配的ipv6地址,将无法使用且还存在于各客户端的端口中,直接导致客户端仍优先使用旧地址做为网络地址。必须是通过重启或禁用接口后,再可以去掉这些旧地址,这个问题如何解决。

好几年了,都没得解决,官方也不说话。

openwrt 推送新地址会推送到第一位,er-x推送的地址是排第二,导致新地址推送之后无法使用,只能重启网卡。

linksys 有一个废弃功能,之前老地址在windows 下会先显示(受到抨击),

我也不知道你们这样的公司,到底有没有技术人员?
无视 推诿,

https://bbs.ui.com.cn/t/ipv6-ip-ipv6/51365

以前我就反馈过,

让我去国外论坛反馈:
https://community.ui.com/questions/Ipv6-cannot-get-connected-after-stateful-IP-re-dial/923d6df5-6670-4b78-9cdc-bc7e1b15fe5f

也反馈了,还是没人鸟,
特么也是服了。

好像偶尔也会遇到这个问题;我刚刚erx重新拨号,得到新前缀,不影响ipv6网络
红框及以下的是旧前缀,系统ubuntu 20.04

虽然确实有两个非deprecated的 temporary dynamic 地址…但系统正确的选择了新的地址

erx用的是radvd作为RA分发,我确认过,重拨号,radvd服务不重启

这个 comment看,需要配置 DeprecatePrefix on; 然后重拨号后,重启一下radvd服务。可以试试,我刚刚拨到了一个不错的IPv4地址,不想试了…

当然,整套让erx自动做,还不知道怎么搞呢;

我一年多以前在国外论坛提供了br0上pppoe拨号+dhcpv6 PD的补丁(补丁哦,还不是问问题)都没进到他们代码里,也不知道他们想怎么样。

关键怎么做呢?
能否提供详细的操作方法?
@fuid

以最新的版本为例

====
有的区域重新拨号之后,前缀会变,
导致之前的ip无法使用,
有的区域重新拨号,前缀不变,
之前的ip还是可以使用,这样就会忽略这个,

提供一个思路吧,我也没验证过,毕竟ui也不给我开工资,我只是业余玩玩。等我有空了,会把整套试试的。

  1. radvd
    先修改/etc/radvd.conf ,我觉得它应该是从/var/run/pd-radvd-*.conf拼出来的,但我还没找到正确的方法,让这些/var/run的文件内容是我希望的加过 DeprecatePrefix on; 的。
    就是在每个prefix里加,如下图
    image
    因为是改的/etc/radvd.conf,我很怀疑重新拨号后,内容会变回去,这个我暂时没什么想法…估计是改 /opt/vyatta/sbin/vyatta_gen_radvd.pl ,我前阵子改了不生效,不知道怎么回事。

  2. 处理重新拨号后,重启radvd服务
    这个比较简单,在 /config/scripts/ppp/ip-up.d/ 下建一个文件,比如radvd.sh,下面提供个脚本,以root用户贴到ssh的终端里就行:
    mkdir -p /config/scripts/ppp/ip-up.d/
    cat > /config/scripts/ppp/ip-up.d/radvd.sh << \EOF
    #!/bin/sh
    systemctl restart radvd
    EOF
    chmod +x /config/scripts/ppp/ip-up.d/radvd.sh

    这个修改是持久化的,除非恢复出厂,升级固件应该也不会影响,不想要了,就把这个文件删了即可。但是内容不一定合适,因为没试过,所以不知道当这个脚本被执行到的时候,是否新的前缀已经下发了。如果太早执行重启,就没用,晚一点倒是没太大问题,比如加个sleep什么的。

非常感谢,过两天我测试下,最近设备不在身边。如果可以,你就让我省几百块钱换设备了。

看来改 /opt/vyatta/sbin/vyatta_gen_radvd.pl 生效了;
image

按要求搞了一下,但是并没有解决问题。
重启路由器之后,推送的ipv6还是排在第二位,依然无法上网。

if ($type eq ‘slaac’) {
print $FD_WR " AdvManagedFlag off;\n";
print $FD_WR " AdvOtherConfigFlag off;\n";
print $FD_WR " prefix ■■■■■ {\n";
print $FD_WR " AdvOnLink on;\n";
print $FD_WR " AdvAutonomous on;\n";
print $FD_WR " DeprecatePrefix on;\n";
print $FD_WR " };\n";
} elsif ($type eq ‘dhcpv6-stateless’) {
print $FD_WR " AdvManagedFlag off;\n";
print $FD_WR " AdvOtherConfigFlag on;\n";
print $FD_WR " prefix ■■■■■ {\n";
print $FD_WR " AdvOnLink on;\n";
print $FD_WR " AdvAutonomous on;\n";
print $FD_WR " DeprecatePrefix on;\n";
print $FD_WR " };\n";
} elsif ($type eq ‘dhcpv6-stateful’) {
print $FD_WR " AdvManagedFlag on;\n";
print $FD_WR " AdvOtherConfigFlag on;\n";
print $FD_WR " prefix ■■■■■ {\n";
print $FD_WR " AdvOnLink on;\n";
print $FD_WR " AdvAutonomous off;\n";
print $FD_WR " DeprecatePrefix on;\n";
print $FD_WR " };\n";
}

肯定有个推送参数,会把新推送的ipv6排在第一位,
但是目前默认排在了第二,导致无法上网。必须重启网卡。

理论上 DeprecatePrefix on; 可以让旧的前缀消失

多久消失,消失间隔是多久?
研究研究怎么推送ip,把新的ipv6推送在第一位。
这样重启路由器之后,什么也不用操作,也不用等待,ipv6就可以正常上网。

好吧,今天详细测试了下, DeprecatePrefix 不太合适,因为radvd.conf里没有把旧prefix填上去,重启的时候虽然发了preferlifetime 0的RA,但是紧接着又发了正常lifetime的包,等于没效果。

另外,似乎找到我自己IPv6网络偶尔不通的原因了,因为开了unifi的无线配置里的ARP代理;
在IPv6网络不通的时候,发现是路由器获取不到我电脑的MAC,抓包发现erx发的ns报文都没有到达电脑。当然,关掉ARP代理还需要再观察一段时间,才能确定这个问题解决了。

用的Ubuntu似乎不会选错发包的IP,即使正确的IP不是第一个(ip -6 addr show的结果感觉是从大到小排列)。确实还没搞明白,prefix改变后,有多个v6地址的时候,系统是怎么挑IP的,反正不是按显示的顺序。

当然,今天也遇到一次选错IP的情况(重新拨号了二十几次做测试,就一次不正常)…也是奇怪的,只得到新的mgmt IP,没拿到新的temporary IP,所以在用旧的temporary IP在发包。

你用ubuntu测试意义不大,因为家庭用户大多数都是windows,
即使你用ubuntu测试可以用,但是不能让家庭用户都换成ubuntu吧

很简单,使用windows,然后er-x重启,看看第二次播的ip能否排在第一位就好了,
windows下只会使用排在第一位的ipv6

兄台研究研究怎么下拨的ipv6排第一,
可用的话省我几百块钱换设备,我给你个红包,表示下。

找到个比较理想的方案

  1. DeprecatePrefix 的修改,还是类似上面帖子改,改好后重新拨号才生产新的/etc/radvd.conf
  2. 断线时停止radvd,让客户端废弃(deprecate)当前v6地址脚本
    然后增加 /etc/ppp/ip-down.d/0000stop-radvd 文件(文件名重要,保证IPv6地址删除前被执行到),粘帖:
    cat > /etc/ppp/ip-down.d/0000stop-radvd << \EOF
    #!/bin/sh
    systemctl stop radvd || true
    EOF
    chmod +x /etc/ppp/ip-down.d/0000stop-radvd
    注意,这个因为要在V6地址删除前执行,因此只能放/etc/ppp/ip-down.d目录
    前两部分改动升级固件后应该会丢失
  3. 上线后启动radvd脚本
    这个类似我前面写的,有点小优化,粘帖:
    mkdir -p /config/scripts/ppp/ip-up.d/
    cat > /config/scripts/ppp/ip-up.d/radvd.sh << \EOF
    #!/bin/sh
    systemctl is-active radvd || systemctl start radvd || true
    EOF
    chmod +x /config/scripts/ppp/ip-up.d/radvd.sh

这样再次重新拨号,旧的IP两个小时后会删除,但是立刻失效,不影响新IP使用。

1赞

这个什么意思?
旧的ip两个小时后会删除?
这两个小时之内还是无法使用第一个ipv6联网?

你试试吧,因为这个是RA协议规定,废弃的IP要2小时后删除

你测试过windows吗?
er-x重启之后,windows 什么都不用操作,
就可用使用ipv6访问?

间隔太久呀,意义不大,
windows默认只认第一个ip的,
如果第一个不能用,
第二个释放需要2个小时,那么意义不大呀。

重启…我没试…理论上可以吧,因为会停止所有服务,然后再重启,这样满足发送RA的要求

如果这样windows都不行,那只能说windows太锉了…不遵守标准,因为v6地址是有个lifetime的,废弃后是0,应该不用才对。当然没有我这些改动,erx是不会主动帮你废弃旧IP的。