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

2022-12-18 14:40:21 +08:00
 alicespace

背景:陕西电信,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 年,还没有修复吗?版本也更新了很多了。

2626 次点击
所在节点    宽带症候群
6 条回复
alicespace
2022-12-18 14:41:21 +08:00
解决方案作者 [@LGA1150]( https://www.v2ex.com/member/LGA1150)
alicespace
2022-12-18 15:03:56 +08:00
可能有 VLAN 的原因!我的 WAN 是 VLAN 设备(搞了 iptv 和 wan 的单线复用)
alicespace
2022-12-18 15:24:40 +08:00
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
2022-12-31 14:04:00 +08:00
最终解决方案:找电信师傅开 IPv6
所有不下发前缀的都是本地区没开 IPv6 ,只要开通了 IPv6 都会下发前缀的。
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 注意到了才添加到路由里。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/903292

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX