V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
ggf
V2EX  ›  宽带症候群

关于 pppoe 重拨后 IPV6 prefix 更新问题

  •  
  •   ggf · 2022-01-20 12:40:00 +08:00 · 7697 次点击
    这是一个创建于 1036 天前的主题,其中的信息可能已经有所发展或是发生改变。

    我通过 pppoe 连接外网,然后通过 prefix 获取 ipv6 后,我的终端同时拥有 ipv4 和 ipv6 地址,此时一切正常。
    问题出现在 pppoe 连接断开重连时,前缀获取的 ipv6 会发生变化,但此时终端获取的是新的 ipv6 地址。 问题是旧地址没有自动消失,导致终端 ipv6 连接异常。
    除了终端断开连接,重新连接后可以恢复 ipv6 正常,还有什么办法吗?
    76CZgH.png

    第 1 条附言  ·  2022-01-23 00:21:28 +08:00

    目前通过修改ND中的过期时间来解决该问题
    7hjODH.png

    41 条回复    2023-07-10 09:37:21 +08:00
    smartisan2047
        1
    smartisan2047  
       2022-01-20 12:56:56 +08:00 via iPhone
    ER-X 拨号,同有这个问题。蹲解决方案
    fenghuang
        2
    fenghuang  
       2022-01-20 12:59:06 +08:00 via Android
    我也遇到 wifi 必须重连才行
    ggf
        3
    ggf  
    OP
       2022-01-20 13:09:21 +08:00
    我是 ros 拨号,以下脚本也试过,没有作用
    RouterOS IPv6 实用脚本
    IPv6 地址更新脚本
    用于当 RouterOS IPv6 更新时,主动向客户端广播旧地址过期

    :local poolname "pool6"
    :local ifname "bridge"

    :global oldprefix;
    :local newprefix;

    :set newprefix [/ipv6 pool used get [find info="bridge"] prefix];

    :if ([ :typeof $oldprefix ] = "nothing") do {
    :set $oldprefix $newprefix
    }

    :if ($newprefix != $oldprefix) do {
    :log info "Kill IPv6 prefix, old prefix: $oldprefix, new prefix: $newprefix";
    :ipv6 nd prefix add prefix=$oldprefix interface=$ifname on-link=yes autonomous=yes preferred-lifetime=0s valid-lifetime=0s;
    :delay 5;
    :ipv6 nd prefix remove [/ipv6 nd prefix find prefix=$oldprefix];
    :set $oldprefix $newprefix;
    }
    basncy
        4
    basncy  
       2022-01-20 13:22:33 +08:00
    lovelylain
        5
    lovelylain  
       2022-01-20 13:51:33 +08:00 via Android
    acbot
        6
    acbot  
       2022-01-20 14:08:01 +08:00
    这里的问题主要是短时间内更新了前缀,在上一个前缀和前缀下发后生成的地址的租赁期没到,这个时候更新了前缀那么 RA 通告的时候两个前缀都有,就会产生问题。只要过了这个租赁期你更新新的前缀下面都不会有问题(至少 OP 不会因为他会重启下发服务)。主要问题是在 LAN 这个接口上,这个时候只要你手动删除旧前缀的地址,RA 就只会通告新的前缀,不重启任何设备和服务下面的设备都可以正常。
    noahzh
        7
    noahzh  
       2022-01-20 14:08:34 +08:00
    我还是觉得 dhcp v6 更符合家庭需求.
    acbot
        8
    acbot  
       2022-01-20 14:13:46 +08:00
    @noahzh 安卓好像不支持 dhcp v6 获取 只能 slaac
    ggf
        9
    ggf  
    OP
       2022-01-20 14:44:35 +08:00 via iPhone
    @acbot 确实如此,但是我在 ros 中 /ipv6 address 中并没有发现旧的地址,在 pppoe 重拨后旧地址其实已经被替换成了新地址 想问一下您回复中提到的删除旧地址前缀该如何操作呢
    Autonomous
        10
    Autonomous  
       2022-01-20 14:49:06 +08:00 via Android
    蹲一个解决方案
    tankren
        11
    tankren  
       2022-01-20 14:57:53 +08:00
    路由器没有发送地址释放指令给局端?或者是路由器的 RA 问题
    acbot
        12
    acbot  
       2022-01-20 15:20:22 +08:00
    @ggf ros 没用过,我说的是 OP 的情况,不过大致就是两个地方排查,一个是负责 RA 下发的服务,一个是 LAN 接口的 v6 地址(网关的地址)。
    aMR
        13
    aMR  
       2022-01-20 15:44:38 +08:00
    把 ra 的 lifetime 设短点就好了,er-x 的默认值实在是太久了,不适合 pppoe 拨号

    贴一下我用的值,单位秒
    preferred-lifetime 600
    valid-lifetime 1800
    max-interval 600
    一般几分钟就切过去了,日常使用无感
    noahzh
        14
    noahzh  
       2022-01-20 15:52:23 +08:00
    @acbot 其实我现在更想的是给指定设备分配 ipv6.
    acbot
        15
    acbot  
       2022-01-20 15:58:06 +08:00
    @noahzh 这个需求用 dhcp v6 实现会不会很复杂。
    geekvcn
        16
    geekvcn  
       2022-01-20 16:47:12 +08:00
    修改下租约时间,改最小
    ggf
        17
    ggf  
    OP
       2022-01-20 17:03:33 +08:00
    如图,但是 ND 中的 RA 时间是 1800 想问一下大家这个时间为什么实际上没有效果(就是重拨后的 1800s 后并没有更新)
    [![7cVfKO.png]( https://s4.ax1x.com/2022/01/20/7cVfKO.png)]( https://imgtu.com/i/7cVfKO)
    noahzh
        18
    noahzh  
       2022-01-20 19:08:14 +08:00
    @acbot 没有这个功能
    vtoex0000000002
        19
    vtoex0000000002  
       2022-01-20 19:19:17 +08:00
    来来来,我被这个问题折磨了一天。
    采用了妥协的方法。

    v2ex.com/t/828332
    Sxx1314
        20
    Sxx1314  
       2022-01-20 23:36:08 +08:00 via Android
    涉及租期问题无解。本身 v6 就不应该频繁改前缀,天朝 isp 比较奇葩而已。目前的临时做法是定时重启 dhcp ,当然这时候部分 client 也必须重启网络才能重新更新。
    cwbsw
        21
    cwbsw  
       2022-01-21 12:02:21 +08:00
    这是苹果的实现问题吧,我这里 OpenWrt+Windows ,重拨后秒更新,旧地址被 deprecated ,valid_lft 过后就消失了。valid_lft 默认是与上游运营商下发的前缀一致,也可以自己指定。
    ggf
        22
    ggf  
    OP
       2022-01-21 23:08:49 +08:00
    @cwbsw 不仅仅是 ios windows 上也是如此现象,可能由于我的 valid_lft 都是跟随运营商默认 30d 有关系
    ggf
        23
    ggf  
    OP
       2022-01-21 23:13:22 +08:00
    @Sxx1314 我发现其实不重启 dhcp 其实只需要终端断开网络重新连接即可,应该是终端中的旧地址没有释放导致的,因为重新联网获取到的地址就是新的 不会获取到旧地址
    raysonx
        24
    raysonx  
       2022-01-22 01:03:09 +08:00 via iPhone
    关掉 dhcpv6 。slaac 可以更新前缀。
    cwbsw
        25
    cwbsw  
       2022-01-22 10:20:12 +08:00
    @ggf
    valid lifetime 和 preferred lifetime 用 ROS 都可以改。
    basncy
        26
    basncy  
       2022-01-22 13:23:47 +08:00
    @ggf 4 楼不是已经给答案了吗?
    关闭 dhcp, 用 slaac. 或者缩小 dhcp 租期
    dnsmasq 语法:
    dhcp-range=br0,::,constructor:br0,ra-stateless,ra-names

    PD 用的是 wide-dhcpv6, pppoe 重新拨号后 systemctl restart dhcp6c@ppp0,配合 dnsmasq 配置,该路由下的 v6 自动刷新.
    qbqbqbqb
        27
    qbqbqbqb  
       2022-01-22 14:08:10 +08:00
    @cwbsw 重拨后是否更新是要看路由端实现的。OpenWRT 会主动 deprecate prefix (发一个旧前缀 preferred lifetime=0 的 RA ),这样即使旧地址的 preferred lifetime 没过期也能强制切换。

    但别的路由系统不一定,有的得等前缀自动过期(至少得等旧地址 preferred lifetime 过期,终端才会把新地址设为首选)。
    ggf
        28
    ggf  
    OP
       2022-01-22 19:54:02 +08:00
    @basncy 我用的是 ros 用的就是 slaac 问题依旧在
    ggf
        29
    ggf  
    OP
       2022-01-22 20:14:23 +08:00
    @qbqbqbqb 确实 ros 应该不会主动 deprecate prefix ,目前问题存在
    ggf
        30
    ggf  
    OP
       2022-01-22 20:15:46 +08:00
    @cwbsw 对的我改成了 30min/10min 目前用这个方法解决
    basncy
        31
    basncy  
       2022-01-22 20:50:15 +08:00
    @ggf systemctl restart dhcp6c@ppp0 后 br0 的 ipv6 会变, dnsmasq 监测到变化就会主动发 deprecate prefix.
    basncy
        32
    basncy  
       2022-01-22 20:53:21 +08:00
    @ggf systemctl restart dhcp6c@ppp0 可以写在 pppoe 的 if-up 里, 这样就能秒换了.
    ggf
        33
    ggf  
    OP
       2022-01-22 21:27:50 +08:00
    @basncy 我用的并不是 openwrt 我强调过很多次,请仔细阅读
    basncy
        34
    basncy  
       2022-01-22 21:39:03 +08:00
    @ggf 原理都一样. 我用 archlinux 改造的. https://wiki.archlinux.org/title/IPv6#With_WIDE-DHCPv6
    z5864703
        35
    z5864703  
       2022-01-22 22:46:07 +08:00
    ROS 调整 ND 的参数就好了,根据 ipv6 前缀的过期时间来改,目前没有问题
    Xymmh
        36
    Xymmh  
       2022-01-23 00:14:21 +08:00
    干脆不要用 pd 下发的地址了,直接把上级设备给 wan 口分发的 /64 地址中继给终端,类似教育网下的方法。
    ggf
        37
    ggf  
    OP
       2022-01-23 00:22:25 +08:00
    @z5864703 是的 这个方法目前可行
    zent00
        38
    zent00  
       2022-06-25 09:29:36 +08:00
    没有 VyOS 用户吗?我来贡献一下 VyOS 的设置。

    set service router-advert interface br0 prefix ::/64 preferred-lifetime 300
    set service router-advert interface br0 prefix ::/64 valid-lifetime 900

    由于我的软路由多个 LAN 口都加入了 br0 ,所以这里 interface 是 br0 ,设置时可按实际情况修改为 ethN 。
    test0x01
        39
    test0x01  
       2022-06-28 23:45:33 +08:00 via Android
    看样子只有比 lease time 了
    luodichen
        40
    luodichen  
       2023-05-10 09:48:41 +08:00   ❤️ 1
    RouterOS v7.9 已经解决了此问题:

    *) ipv6 - send out RA packet with "preferred-lifetime" set to "0" when IPv6 address is deactivated;
    zent00
        41
    zent00  
       2023-07-10 09:37:21 +08:00
    VyOS 在 5 月 25 日的 nightly build 中也针对这个问题加入了两个新的配置选项:

    (feature): router-advert: Add deprecate-prefix & decrement-lifetimes options

    看了下 FEATURE REQUEST 的信息,就是 24 楼的 raysonx 兄弟在去年 7 月提交的。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5079 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 44ms · UTC 03:46 · PVG 11:46 · LAX 19:46 · JFK 22:46
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.