参考文章:让 OpenWrt 尝试用 DHCPv6-client 从 ISP 营运商宽带的 PPPoE 拨号链路上获取 IPv6-PD 固定前缀
家庭网络如果使用openwrt进行拨号,获取到的ipv6地址都是动态的,并且通常都是会在设备重启后改变。事实上有办法是可以获取到固定的IPv6地址的,虽然使用DDNS就完全可以替代公网IPV6地址,但是对于一些只能使用ip地址的程序或者应用的话还是有一定的用途的。另一方面,我们甚至还可以使用这个方法来实现更短的ipv6地址(2409:xxxx:xxxx::1),而不是非常冗长的8组128位地址2409:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx,让你的ipv6地址更加美观
一、必要前提
- 已经使用Openwrt拨号并且获取公网ipv6地址
- 具备和你的openwrt同等架构的docker,用来编译程序
在这里说明一下,如果你是使用x86-64的架构安装的openwrt,只需要获取到ipv6即可,第二点可以忽略。这是因为后续要编译对应架构的程序,对于arm64架构的系统可能需要自己编译对应架构的程序。x86-64架构的也可以自己编译或者直接使用博主自己编译好的程序覆盖即可
二、编译odhcp6c
因为有些系统默认的odhcp6c是有问题的,没办法正常手动请求 IPv6 前缀,故需要重新编译odhcp6c才可以
编译程序需要使用到alpine系统,当然你也可以选择在openwrt本地编译,但是需要拉取对应的依赖项和污染环境,故推荐在docker里面编译好后程序后拿出来覆盖即可
#运行alpine
docker run \
--name odhcp6c-builder \
--rm -it --net=host \
-v /opt:/opt \
alpine:latest \
ash -l
# 在容器内准备编译环境
cd /opt && apk update
apk add alpine-sdk linux-headers cmake git
# 编译 odhcp6c 程序,编译完可通过命令 ./odhcp6c -h 简单测验程序能否基本正常工作
git clone --depth 1 -b prefix-request \
https://github.com/themiron/odhcp6c.git odhcp6c
cd odhcp6c && cmake . -DCMAKE_BUILD_TYPE=Release
make && strip odhcp6c
# 退出并销毁临时编译用的容器环境
exitShellScript编译完成后即可在安装docker的系统下/opt/odhcp6c/odhcp6c找到该文件。将该文件移动到openwrt下的/usr/sbin/odhcp6c(别忘记备份原文件)
x86-64架构的odhcp6c程序,点我下载
三、固定IPv6前缀
1、取消wan接口ipv6使能
在openwrt->网络->接口->wan->编辑->高级设置按照下列参数修改
- 获取 IPv6 地址:已禁用
- IPv6源路由:取消勾选
- 委托IPv6前缀:取消勾选
- IPv6分配长度:已禁用
- IPv6 前缀过滤器:空
- IPv6 后缀:空
- IPv6 优先级:空

这样的话wan接口就完全失去ipv6功能了
2、添加独立ipv6接口
openwrt->网络->接口->新建接口来创建一个独立的ipv6接口,名称填wan6,协议为DHCPv6,设备选@wan

此时,转到高级设置,勾选强制链路,IPv6源路由,委托IPv6前缀,IPv6 分配长度填64,防火墙设置为WAN区域


点击保存并应用即可完成wan6接口的配置,此时你应该就能看到wan6接口存在ipv6地址并且和IPv6-PD委托

3、手动指定ipv6前缀
编辑wan6接口,将请求IPv6前缀改为你现有的IPV6-PD,并且勾选重启时不要发送Release,这样就可以实现每次请求的前缀都是固定的了

最后尝试重启一下路由器,看看新获取到的IPv6前缀是否和之前的一样
4、自定义靓号前缀选择
如果你已经实现了固定运营商分配下来的IPv6前缀,我们可以试试说手动请求特定前缀
在这之前,我们先复习一下IPv6格式
ipv6以8组16字节共128位的定义格式组成(1个字节为2个hex位),其中,第一组定义位哪个运营商,下列是国内常见运营商与前缀的对应关系
| 运营商 | 常见前缀 |
|---|---|
| 电信 | 240e::/16 |
| 联通 | 2408::/16 |
| 移动 | 2409::/16 |
接着第二组代表省份,第三组前一字节(两个hex位)是市/县,后两位随机分配,第四组也是随机分配

因此,我们可以手动指定第四组分配,达到自选靓号的IPV6前缀。只需要修改第四组的值重启/重新拨号即可获取新的IPv6前缀。
最后的两个冒号代表了中间省略n个0,填充到128位为止
但是这并非不是全部靓号都可以选择,和DHCP一样,申请的前缀只能是未被其他用户占有或者回收的前缀才可用,因此如果一个不行的话就换一个再试试,这样你就可以获取了一个自定义固定IPv6前缀的地址,例如2409:xxxx:xxxx:6666::1
5、超短IPv6地址选择
如果你可以自选靓号,就可以尝试着将第三组后一字节(2个hex位)也进行筛选,这一个字节不一定可以自选特定值,一方面这个字节可能与设备相关联,通常不会轻易改变;另一方面这个字节数量比较少,不容易被分配到特定值,因此可以尝试将请求IPv6前缀筛选到第三组的第二字节,但是不一定可以分配到你指派的值。
不过,我们可以将请求IPv6前缀的第四组也删除掉,2409:xxxx:xxxx::/60,只请求3组前缀,如果运气好的话应该是可以获取到只有3组的ipv6前缀的
博主广东移动实测可以分配到三组前缀,大家也可以在评论区留言一下所在地区的IPv6前缀指派的弹性度
如果分配到3组的IPv6前缀,你就可以获取超短的IPv6地址了











