背景:陕西电信,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
alicespace OP 解决方案作者 [@LGA1150]( https://www.v2ex.com/member/LGA1150)
|
2
alicespace OP 可能有 VLAN 的原因!我的 WAN 是 VLAN 设备(搞了 iptv 和 wan 的单线复用)
|
3
alicespace OP |
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/ |
5
alicespace OP 最终解决方案:找电信师傅开 IPv6
所有不下发前缀的都是本地区没开 IPv6 ,只要开通了 IPv6 都会下发前缀的。 |
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 注意到了才添加到路由里。
|