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

这个 ipv6 问题真折磨,大佬帮我分析下

  •  
  •   FaiChou · 2023-12-22 18:58:18 +08:00 · 3904 次点击
    这是一个创建于 369 天前的主题,其中的信息可能已经有所发展或是发生改变。

    上一个帖子IPv6 没问题,但夜间看不了 ipv6 源的电视

    今天查看了一下问题,应该是 OpenWRT ipv6 的问题。具体表现在,每天凌晨一点多 OpenWRT 会执行自动重启,到白天 ipv6 都是 work 的,到了晚上连接它的客户端就无法访问 ipv6 地址了。研究了一会,发现重新连接一下 WAN6 这个网口(DHCPv6)后,就可以恢复正常,也就是用命令 (ifdown WAN6 && ifup WAN6)。

    在出问题的时候,客户端(手机)无法观看 IPV6 源的电视,电脑( macOS )使用命令执行ping6 2409:8087:1e03:21::2 无响应; 但是 ssh 进 OpenWRT 后执行 ping6 都是正常的。使用 traceroute6 命令也是一样,客户端(macOS)执行后只有一条 1 2408:8224:f27:cc71::1 4.568 ms 4.953 ms 3.863 ms, 但在 OW 内部则是正常有跳转的。

    即使出问题的时候,macOS 也是有 ipv6 地址的:

    en0: flags=8863<UP,BROADCAST,SMART,RUNNING,SIMPLEX,MULTICAST> mtu 1500
    	options=6460<TSO4,TSO6,CHANNEL_IO,PARTIAL_CSUM,ZEROINVERT_CSUM>
    	ether 51:ed:3d:03:02:0c
    	inet6 fe80::1c00:7578:921:68c1%en0 prefixlen 64 secured scopeid 0xc
    	inet6 2408:8224:f27:cc71:cfd:83f:84d8:2748 prefixlen 64 autoconf secured
    	inet6 2408:8224:f27:cc71:740e:450:7753:f472 prefixlen 64 autoconf temporary
    	inet 192.168.11.109 netmask 0xffffff00 broadcast 192.168.11.255
    	inet6 2408:8224:f27:cc71::ea1 prefixlen 64 dynamic
    	inet6 fd72:53a3:521f:4e91:1003:46e:4ce2:710a prefixlen 64 autoconf secured
    

    使用 netstat -nr -f inet6 查看路由表也是没有用信息。

    仅仅重启了 WAN6 这个网口,没有重启 ipv4 的网口,防火墙也没有改变,所以应该不是防火墙问题。

    重启过路由器,也是没有影响。开关过 OpenClash ,也没影响。

    难道是租约到期了?但我不知道如何排查租约问题。不能每次挂掉后再登录 OW 重新连接 WAN6 吧。

    第 1 条附言  ·  2023-12-24 17:38:07 +08:00

    各位,我放弃了,不想研究了,生活明明那么多美好的事,非要花时间研究这个。

    写个 corn 任务 0 12,18 * * * ifdown WAN6 && ifup WAN6 解决问题。

    33 条回复    2024-04-17 08:37:55 +08:00
    sangmingming
        1
    sangmingming  
       2023-12-22 19:03:38 +08:00
    开启 ipv6 之后还怎么作为网关,给家里的设备翻墙啊,我这开了 v6 之后,翻墙感觉就废了。
    FaiChou
        2
    FaiChou  
    OP
       2023-12-22 19:40:25 +08:00
    @sangmingming v6 和 fq 没太大关系吧。我这没影响。
    ac169
        3
    ac169  
       2023-12-22 20:54:35 +08:00
    正常情况你应该删除系统自带的 wan6 接口, 正常情况应该让系统在拨号以后自动协商并创建一个 wan_6 虚接口, uci get network.wan.ipv6 检查一下这个值是否为空或 'auto', 如果不是设置值为 auto 即可. 然后 局域网尽量使用 slaac 分配管理 ipv6 地址 uci get dhcp.lan.ra 查看 结果值 最好是 server, 是否是 OP 官方系统, 是否修改过 v6 防火墙 特别是 icmpv6 的那几个
    galwen
        4
    galwen  
       2023-12-22 21:14:32 +08:00 via Android
    不懂……
    lcdtyph
        5
    lcdtyph  
       2023-12-22 21:25:55 +08:00 via iPhone
    可能是 ra 过期了,出问题的时候电脑上 ipv6 的 default 路由还在吗
    FaiChou
        6
    FaiChou  
    OP
       2023-12-23 08:54:19 +08:00
    @lcdtyph default 路由正常情况是这样的,很奇怪,并没有路由到正确地址:

    ```
    Destination Gateway Flags Netif Expire
    default fe80::56f6:c5ff:fe18:11a1%en0 UGcg en0
    default fe80::%utun0 UGcIg utun0
    default fe80::%utun1 UGcIg utun1
    default fe80::%utun2 UGcIg utun2
    default fe80::%utun3 UGcIg utun3
    default fe80::%utun4 UGcIg utun4
    default fe80::%utun5 UGcIg utun5
    default fe80::%utun7 UGcIg utun7
    default fe80::%utun8 UGcIg utun8
    default fe80::%utun9 UGcIg utun9
    default fe80::%utun10 UGcIg utun10
    default fd7a:115c:a1e0:: UGcIg utun6
    default fd3c:88df:2ffd:: UGcIg utun11
    ::1 ::1 UHL lo0
    ```
    FaiChou
        7
    FaiChou  
    OP
       2023-12-23 08:54:53 +08:00
    @FaiChou #6 这个情况下 `ping6 2409:8087:1e03:21::2` 是有正常的返回的。
    FaiChou
        8
    FaiChou  
    OP
       2023-12-23 08:57:24 +08:00
    @ac169 我的网络: cat /etc/config/network:

    ```
    config interface 'loopback'
    option ifname 'lo'
    option proto 'static'
    option ipaddr '127.0.0.1'
    option netmask '255.0.0.0'

    config interface 'lan'
    option type 'bridge'
    option ifname 'eth0'
    option proto 'static'
    option ipaddr '192.168.11.1'
    option netmask '255.255.255.0'
    option delegate '0'
    option ip6assign '64'

    config interface 'wan'
    option ifname 'eth1'
    option _orig_ifname 'eth1'
    option _orig_bridge 'false'
    option proto 'dhcp'

    config interface 'WAN6'
    option proto 'dhcpv6'
    option ifname 'eth1'
    option reqaddress 'try'
    option reqprefix 'auto'

    ```

    执行 `uci get dhcp.lan.ra` 也是 server
    lcdtyph
        9
    lcdtyph  
       2023-12-23 09:13:16 +08:00 via iPhone
    @FaiChou
    第一条 via en0 的 link-local 地址就是路由器,是正确的,问题是出问题的时候还有这条路由吗
    如果届时这条路由消失了,那去路由器上看看 odhcpd 的进程还在不在
    fengchen0vr
        10
    fengchen0vr  
       2023-12-23 11:11:11 +08:00 via iPhone
    前几年版本的 openwrt 好像是有 ipv6 问题,这两年的没问题了,就是楼上说的 odhcpd 问题
    pagxir
        11
    pagxir  
       2023-12-23 13:36:56 +08:00
    openwrt 的 wan 口走 relay 还是 prefix delegate , 是不是 dhcpv6 实现有问题,导致前缀失效没有及时刷新。
    pagxir
        12
    pagxir  
       2023-12-23 13:41:28 +08:00
    @sangmingming 修改一下 dns 配置,或者改一下/etc/gai.conf
    FaiChou
        13
    FaiChou  
    OP
       2023-12-23 13:58:06 +08:00
    @lcdtyph #5
    @fengchen0vr
    @pagxir #11

    不工作的时候,odhcpd 进程还在,并且路由也正常, fe80::56f6:c5ff:fe18:11a1 就是 OW 的 br-lan:

    ```
    ~ netstat -nr | grep default
    default 192.168.11.1 UGScg en0
    default link#26 UCSIg utun6
    default fe80::56f6:c5ff:fe18:11a1%en0 UGcg en0
    ```

    但我发现每次失效前都会有这样的日志:


    ```
    Sat Dec 23 13:16:49 2023 daemon.info netdata[12304]: Initializing file /var/cache/netdata/ipv6.icmpechos/main.db.
    Sat Dec 23 13:16:49 2023 daemon.info netdata[12304]: Initializing file /var/cache/netdata/ipv6.icmpechos/InEchos.db.
    Sat Dec 23 13:16:49 2023 daemon.info netdata[12304]: Initializing file /var/cache/netdata/ipv6.icmpechos/OutEchos.db.
    Sat Dec 23 13:16:49 2023 daemon.info netdata[12304]: Initializing file /var/cache/netdata/ipv6.icmpechos/InEchoReplies.db.
    Sat Dec 23 13:16:49 2023 daemon.info netdata[12304]: Initializing file /var/cache/netdata/ipv6.icmpechos/OutEchoReplies.db
    ```
    FaiChou
        14
    FaiChou  
    OP
       2023-12-23 15:06:24 +08:00
    大概率还是 dhcp 续租问题,我的 OW 设置的凌晨 1 点重启,租期是 12 小时,查看日志在 13 点的时候有:

    Sat Dec 23 13:01:11 2023 daemon.notice netifd: wan (6047): udhcpc: sending renew to server 192.168.1.1
    Sat Dec 23 13:01:11 2023 daemon.notice netifd: wan (6047): udhcpc: lease of 192.168.1.2 obtained from 192.168.1.1, lease time 86400

    但并没有 odhcp6c 的续租日志。

    @pagxir @lcdtyph
    ac169
        15
    ac169  
       2023-12-23 16:21:45 +08:00
    @FaiChou

    1. 系统版本是否是有点低,就是 18 左右的版本?

    2. 系统防火墙默认规则:Allow-ICMPv6-Input Allow-ICMPv6-Forward Allow-MLD 这三条是否存在和启用

    3.

    config interface 'WAN6'
    option proto 'dhcpv6'
    option ifname 'eth1'
    option reqaddress 'try'
    option reqprefix 'auto'

    曾经遇到过系统自带的这个接口与 pppoe 连接不同步的情况 ,所以这一段你可以删除然后拨号试试,正常情况拨号之后系统会自动创建一个 wan_6 的虚拟 dhcpv6 接口,断开拨号自动删除。但是不知道你系统的版本所以说只能试试。或者说如果 network.wan.ipv6 这个值为空或 'auto' 的情况下 你拨号之后没有产生一个 wan_6 的虚拟 dhcpv6 接口 那么就说明你的版本有不同(要不太老 要不不是官方的)
    FaiChou
        16
    FaiChou  
    OP
       2023-12-23 16:57:58 +08:00
    @ac169 #15 谢谢回复。我的版本是 R23.3.3 (2023-03-05),并且 3 条防火墙规则都在。一开始好用,12 小时后不工作,大概率说明租约问题,我已经改成 24 小时,看看明天是否有效吧。我看了下,这个系统的 dhcp 服务器是 dnsmasq(v4)+odhcpd(v6)。折腾这么多(对我小白来讲)真不如拿掉 OW 。
    ac169
        17
    ac169  
       2023-12-23 17:26:05 +08:00
    @FaiChou 没想到你版本还很新,但看之前你给的配置文件有很多参数是移除的,比较疑惑! 个人认为是 IPv6 地址 / 路由 / 邻居 后续维护过程有问题,并不是租期的问题,因为出问题的时候你地址还在! 也就是可以在局域网抓包 看看是否能收到和相应网关 icmpv6:134 (RA) 135 (NS) 136 (NA) 三种类型消息,很有可能是你只收到过一次 RA 消息(就是你说 WAN6 接口重播的时候) 当然这个只是思路,其实 OP 从 18 版本(官方)开始用 v6 一点问题都没有!
    lcdtyph
        18
    lcdtyph  
       2023-12-23 18:27:40 +08:00 via iPhone
    @FaiChou
    那可能是 wan 的 ipv6 pd 没有续租,导致 odhcp 不在 lan 侧广播 ra 了
    linuxyz
        19
    linuxyz  
       2023-12-23 20:27:08 +08:00
    `ip neigh` 看一下,如果不是 WAN 的 PD/DHCPv6 到期了,就是 neigh 失效了
    FaiChou
        20
    FaiChou  
    OP
       2023-12-23 22:25:29 +08:00
    @linuxyz
    @lcdtyph #18
    @ac169 #17

    我的理解是,光猫拨号后,给 OpenWrt 分配了 PD 前缀,有了前缀,OpenWrt 作为 DHCPv6 服务器向下 RA 广播,这样连接它的客户端就有了 v6 地址(不管是 SLAAC 还是 DHCPv6 )。如果是 PD 到期了,OpenWrt 需要提前检测并重新向光猫续租。我的问题大概是续租出了问题,所以现在要查看租约文件。我查了一下,找不到 DHCPv6 客户端的租约文件在什么地方。`ip neigh` 是查看 ARP 表的吧?需要等下次 v6 宕机时候再验证了。而抓包 `icmpv6:134 (RA) 135 (NS) 136 (NA) ` 对我更陌生。所以我上面的分析是正确的吧?没问题的话,我下次遇到再按照这个逻辑查找问题。
    keegan
        21
    keegan  
       2023-12-23 23:38:07 +08:00
    试试这个?打开通告,感觉可能有用
    ```
    echo "net.ipv6.conf.default.accept_ra=2" >> /etc/sysctl.conf
    echo "net.ipv6.conf.all.accept_ra=2" >> /etc/sysctl.conf
    ```
    ac169
        22
    ac169  
       2023-12-24 08:30:13 +08:00
    @FaiChou 你说的仅仅是 DHCPv6 流程, SLAAC 不是这样的!

    SLAAC 是系统根据 RA 消息中的前缀 和 各种 lefttime 参数 自己生成和维护地址(包括阴私扩展的临时地址), 生成之后地址是否可用 (比如: 是否重复) 路由是否可用等维护都是通过一定周期不断的收发 icmpv6 包来维护的.

    当最大 lefttime 快到期了,又没有收到新 ra 消息,现在地址就会失效 (直接变没) 这个操作都是系统自己完成的

    当重新拨号或者是上游更新了网关(或者说 slaac 服务端)会发送一个上一个前缀和 各种 lefttime 为零 RA 消息, 系统收到后就会让旧地址失效.


    另外,在 3# 中提到 uci get dhcp.lan.ra 这里说的并不严谨, 因为他不代表 dhcpv6 是关闭的,个人建议只使用 slaac 模式禁用掉 dhcpv6 ( uci get dhcp.lan.dhcpv6 值是否为空或 disable)


    这个就是我的经验了,后续的只能你自己研究,实际环境还是有差别.
    xpn282
        23
    xpn282  
       2023-12-24 16:43:45 +08:00
    @sangmingming
    你给设备开了 v6 ,你就要用代理工具接管 v6 ,不然代理工具只处理 v4 而不处理 v6 ,那你翻墙绝对会出问题

    另:旁路由(旁网关)好像不会处理设备的 v6 ,因为设备只是把 v4 的网关指向旁路由而已,v6 好像没过旁,所以开了旁,设备又使用 v6 的话,大概率翻墙有问题
    sangmingming
        24
    sangmingming  
       2023-12-25 10:11:03 +08:00
    @xpn282    现在就是旁路由,还没找到怎么设置 v6 的网关。
    pagxir
        25
    pagxir  
       2023-12-25 15:47:32 +08:00
    @sangmingming 修改一下旁路由的 radvd.conf 配置,将路由的 priority 修改成 high 。不过如果你主路由广播 ipv6 的 DNS 估计解析还会有问题,不过如果是 android 机器的话,可以在你旁路由打开 DOT 支持,并将手机的 private DNS 设置成自动。 至于 ios ,怎么打开自动 DOT ,就不清楚了,因为我没有 ios 设备。
    xdzhang
        26
    xdzhang  
       2023-12-26 11:13:41 +08:00
    v6 开了之后不要分配 v6 的 dns 给局域网的设备,或者把 v6 的解析劫持到你自己用来防污染的 dns 上,要不大概率代理不了,直接给你返回 AAAA ,到时候 v4 的代理用不了的。
    veSir
        27
    veSir  
       2023-12-27 03:32:12 +08:00
    之前也有同样问题, 更新 OpenWrt 版本后已解决.
    Franzx
        28
    Franzx  
       361 天前 via Android
    同样的问题,同时观察到 WAN6 在正常的时候是有一个/ 128 的 ipv6 和一个/ 60 的 ipv6-PD ,LAN 口会使用这个 PD 给下游设备。当运营商玄学更换 ipv6 (或者手动重启光猫)后 WAN6 口新获取到的是/ 64 的 ipv6 ,同时旧的/ 128 和/ 60PD 也还在,结果就是下游设备 ipv6 全部失效断网。WAN6 口新获取 ipv6 时甚至获取到的 ipv6 的 DNS 都会和旧的一起重复显示,哪怕新旧 DNS 是一样的。
    shomaru
        29
    shomaru  
       357 天前
    接口-全局-IPv6 ULA 前缀 删掉
    yyysuo
        30
    yyysuo  
       356 天前   ❤️ 1
    这题目我会啊,最近刚刚解决的,楼主的猜想是正确的,就是租期的问题,是临时 ipv6 地址租期的问题。解决的办法就是用 SLAAC ,不用 dhcpv6 ,同时取消 ipv6 格式的 dns 的下发,解决步骤如下:
    1:lan 口 dhcp 服务器设置中,路由通告服务-服务器模式,dhcpv6-已禁用,NDP 代理-已禁用,取消通告的 dns 服务器。
    2:删除 ipv6 ula 前缀。
    3:删除所有固定 IP 地址分配的租期(如果之前有指定),dhcp 中的 ipv4 租期默认为 30m
    4:修改/etc/config/dhcp 文件,在 lan 部分,添加或者修改如下项目,自己删除#及注释
    option ra_dns '0' #不下发 ipv6 格式 dns
    option ra_useleasetime '1' #ipv6 地址使用 ipv4 的租期
    option preferred_lifetime '30m' #preferred lifetime30 分钟
    option leasetime '30m' #租期 30 分钟

    完整的 lan 参考:
    config dhcp 'lan'
    option interface 'lan'
    option start '100'
    option limit '150'
    option force '1'
    option ra 'server'
    option ra_dns '0'
    list dhcp_option '6,10.10.10.1'
    option ra_default '1'
    option ra_useleasetime '1'
    option preferred_lifetime '30m'
    option leasetime '30m'
    FaiChou
        31
    FaiChou  
    OP
       356 天前
    @shomaru 是空的。
    yyysuo
        32
    yyysuo  
       356 天前
    再补充一下,如果不改路由配置,连接不上的时候,重启一下 ap 或者断开重连一下 wifi ,一般就能连接了。我猜想你用的 ipv6 源是网上流行的那个吧,高峰时候,有时候也是卡。
    yjzll
        33
    yjzll  
       253 天前
    ip6tables -I zone_lan_input -p udp --sport 546 --dport 547 -j ACCEPT

    解决 DHCPv6 续约的 icmpv6 通讯,lan 侧到路由器本身。此消息经过中继后再传到上级光猫。
    过程:Solicit---Advertise---Request---Reply
    PC 端口 546 ,发送请求 Solicit 至,路由器本身[ff02::1:2]:547 端口
    路由器本身 546 端口,中继到,光猫 547 端口
    光猫 547 端口,回应一个 Advertise 给,路由器 546 端口
    路由器本身 547 端口,中继到,PC 端口 546
    PC 端口 546 ,回应一个 Request 给路由器 547 端口
    路由器本身 546 端口,中继到,光猫 547 端口
    光猫 547 端口,回应一个 Reply 给,路由器 546 端口结束。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5627 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 03:22 · PVG 11:22 · LAX 19:22 · JFK 22:22
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.