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

电信 IPv6 无前缀(IPv6-PD)下发内网 IPv6 问题讨论

  •  
  •   alicespace · 2022-12-18 14:40:21 +08:00 · 3136 次点击
    这是一个创建于 707 天前的主题,其中的信息可能已经有所发展或是发生改变。

    背景:陕西电信,OpenWrt 拨号,光猫桥接

    OpenWrt 22.03.2
    odhcpd-ipv6only 2022-03-22-860ca900-1
    odhcp6c 2022-08-05-7d21e8d8-18 
    

    起因是某天半夜 pppoe 突然断线重播,起来一看下发的 IPv6-PD 前缀没了,只剩了一个 /64 地址分配给路由器,下面的设备全部没有 IPv6 地址

    换用 relay 方法尝试之后,能分配到地址了,但是 OpenWrt 日志一直报错,内网设备无法访问 v6 网站 报错:

    odhcpd[1605]: Failed to send to 240e:xxx%wan@pppoe-wan (Bad file descriptor)
    

    配置

    config dhcp 'lan'
    	option interface 'lan'
    	option start '100'
    	option limit '150'
    	option leasetime '12h'
    	option dhcpv4 'server'
    	option ra 'relay'
    	option ndp 'relay'
    	option dhcpv6 'relay'
    
    config dhcp 'wan'
    	option interface 'wan'
    	option ignore '1'
    	option master '1'
    	option ra 'relay'
    	option ndp 'relay'
    	option dhcpv6 'relay'
    

    参考 v2ex LGA1150 的回复链接 发现用内网设备 ping 了一下路由器就好了???最后通过手动加路由表解决。

    之前说是 odhcpd 的 bug 但是已经过了 4 年,还没有修复吗?版本也更新了很多了。

    第 1 条附言  ·  2022-12-31 14:04:26 +08:00
    最终解决方案:找电信师傅开 IPv6
    所有不下发前缀的都是本地区没开 IPv6 ,只要开通了 IPv6 都会下发前缀的。
    6 条回复    2023-01-13 01:14:34 +08:00
    alicespace
        1
    alicespace  
    OP
       2022-12-18 14:41:21 +08:00
    解决方案作者 [@LGA1150]( https://www.v2ex.com/member/LGA1150)
    alicespace
        2
    alicespace  
    OP
       2022-12-18 15:03:56 +08:00
    可能有 VLAN 的原因!我的 WAN 是 VLAN 设备(搞了 iptv 和 wan 的单线复用)
    alicespace
        3
    alicespace  
    OP
       2022-12-18 15:24:40 +08:00
    Xymmh
        4
    Xymmh  
       2022-12-18 22:23:19 +08:00
    电信那边的配置问题,可以试试这个方法:

    实际上,上游节点直接绑定端口和上游直接分配了一个 /64 的 PD 效果是一样的。因此我们也可以伪造成获取了一个 PD 前缀来让 netifd 进行后续的配置。该方法的优点是 LAN 接口也可以获得一个全局路由地址,并且可以配合 LAN 侧的 DHCPv6 Server 进行更自由的内网配置。为此我们需要关闭 odhcpd 的中继模式,关闭后重启 odhcpd , 然后编辑 /etc/odhcp6c.user 文件:

    #!/bin/sh

    log() {
    logger -t "odhcp6c[fake-ipv6pd]" "$@"
    }

    reset_envs() {
    local entry

    local raroutes=""
    local userprefix=""
    for entry in $RA_ROUTES; do
    local route="$entry"
    local addr="${entry%%/*}"
    entry="${entry#*/}"
    local mask="${entry%%,*}"
    entry="${entry#*,}"
    local gw="${entry%%,*}"
    entry="${entry#*,}"
    local valid="${entry%%,*}"
    entry="${entry#*,}"
    local metric="${entry%%,*}"

    if [ "$addr" != "::" ]; then
    local prefix="$addr/$mask"
    log "found ipv6 prefix $prefix"
    userprefix="$userprefix $prefix"
    continue
    fi
    log "preserve ra route $route"
    raroutes="$raroutes $route"
    done

    RA_ROUTES="$raroutes"
    USERPREFIX="$userprefix"
    }

    fake_ipv6pd() {
    local device="$1"
    local action="$2"

    [ "$action" != "ra-updated" ] && return
    [ -n "$PREFIXES$USERPREFIX" ] && return
    [ -z "$ADDRESSES$RA_ADDRESSES" ] && return

    reset_envs

    [ -n "$ADDRESSES$RA_ADDRESSES$PREFIXES$USERPREFIX" ] && setup_interface "$device"
    }

    fake_ipv6pd "$@"

    原文: https://blog.icpz.dev/articles/notes/odhcpd-relay-mode-discuss/
    alicespace
        5
    alicespace  
    OP
       2022-12-31 14:04:00 +08:00
    最终解决方案:找电信师傅开 IPv6
    所有不下发前缀的都是本地区没开 IPv6 ,只要开通了 IPv6 都会下发前缀的。
    zbinlin
        6
    zbinlin  
       2023-01-13 01:14:34 +08:00
    这应该是 odhcpd 的 bug 来的,我抓包看了下,在客户端获取到 ipv6 地址时,openwrt 这边没有通过 `Learn routes(ndproxy_routing)` 把客户端的 ipv6 路由加上,这时你在客户端 ping 外网的 ipv6 地址时,openwrt 由于没有路由会把 reply 丢掉。如果你这时在客户端 ping 一个 wan6 的 ipv6 地址,客户端会先发一个 NS 找这个 ipv6 地址,这时 openwrt 注意到了才添加到路由里。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2898 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 52ms · UTC 14:25 · PVG 22:25 · LAX 06:25 · JFK 09:25
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.