|
本帖最后由 zt406600 于 2024-8-2 00:58 编辑
一、背景
本人一直希望PPPoe拨号能获得固定的IPv6前缀,好处还是有的。
一是DDNS的频率变少,能有效避免更新后域名头几次仍解析出上一次更新的地址,体验不佳的问题。
二是可以小范围的自编前缀,方便记忆,也很酷。
三是可以方便防火墙的设置。以前也在恩山发贴求助过,但是没有大佬指点,无果,需求太偏门了。
最近看到odhcp6c的源码更新的IA-PD的选项,可以自编PPPoE-ipv6前缀的希望来了。
二、网络环境
坐标贵阳,1000M联通宽带,光猫型号记不得了,已改桥接,路由器为红米AX6000,官方固件1.0.67版本,已根据论坛教程解锁SSH,正常PPPoe是能获取到ipv6前缀委派。
三、原理
1、openwrt ipv4拨号成功后会进行ipv6协调,通过读取/etc/config/network配置文件,最终解析的参数会传递给odhcp6c,所以odhcp6c这个程序才是关键。
2、根据openwrt官方论坛大佬描述,原来的odhcp6c 无论如何,它始终在IA-PD请求消息中使用空前缀地址,也就是说,以前是不能自编前缀的。现在源码更新后,修改了原来的-P选项,可以向上游服务器发送自编前缀。
3、对应openwrt的配置选项为/etc/config/network wan6 接口的option reqprefix。
看github上[color=var(--fgColor-muted,var(--color-fg-muted,#656d76))]/odhcp6c.c修改后源码usage()函数的描述。
4、那么我们修改/etc/config/network wan6该选项即可,如可以把前缀自编为:option reqprefix 2400:8:8:8::/64。
5、这样修改后,odhcp6c会在IA-PD中携带我们自编的前缀,请求上游服务器把这个前缀分配给我们,如果在上游服务器的地址池中这个前缀可以,那它就会分配给我们。
6、最终传递给odhcp6c 的命令行为:odhcp6c -s /lib/netifd/dhcpv6.script -Ntry -P2400:8:8:8::/64 -k -t120 pppoe-wan
7、当然这个前缀自定义要根据各地运营商的分配范围来,超出分配范围了肯定是不能成功的。
四、操作步骤
由于我的是小米官方固件,限制太多,相对较繁琐,我把我的步骤写出来,欢迎讨论。
如果已刷过机的,那就简单多了,替换掉系统的odhcp6c即可。
第一步:
编译最新的odhcp6c源码,得到aarch64架构的odhcp6c,并上传到ax6000的/data目录中。可以cd /data目录 后,执行./odhcp6c -h看看能不能看到 -P <[pfx/]len> ,能看到说明没问题。
第二步:
1、把/lib/netifd/proto/dhcpv6.sh和/usr/sbin/enable_ipv6这两个文件复制到/data目录中来。
2、修改/usr/sbin/enable_ipv6的大概125行,在## for pppoe ipv6, must set ipv6=auto注释的后面,EOF之间的代码修改为
- if [ "$proto_type" = "pppoe" ]; then
- uci -q batch <<EOF
- delete network.lan.ip6addr
- del_list network.lan.ip6class=${iface}_6
- set network.${iface}.ipv6='1'
- set network.${iface}_6.proto='dhcpv6'
- set network.${iface}_6.reqaddress='none'
- set network.${iface}_6.ifname='@wan'
- set network.${iface}_6.peerdns='0'
- set network.${iface}_6.norelease='1'
- set network.lan.ip6assign=${ip6assign}
- commit network
- EOF
复制代码
3、修改lib/netifd/proto/dhcpv6.sh文件大概第7行proto_dhcpv6_init_config()函数的reqprefix这行的属性域为ip6addr。
proto_config_add_string 'reqprefix:ip6addr'
第三步:
在/data新建 miwifi_ipv6文件,加上可执行权限,并把这个文件加入启动项/data/auto_ssh/auto_ssh.sh中,让文件能开机启动,当然修改firewall文件添加单独开机启动也可以。文件内容如下:
- #!/bin/sh
- /bin/mount --bind /data/dhcpv6.sh /lib/netifd/proto/dhcpv6.sh 2>&-
- /bin/mount --bind /data/odhcp6c /usr/sbin/odhcp6c 2>&-
- /bin/mount --bind /data/enable_ipv6 /usr/sbin/enable_ipv6 2>&-
- touch /tmp/replace_sys_odhcp6c_ok
- return 0
复制代码
第四步:
修改/etc/config/network文件,结合实际情况,添加自编前缀。
第五步:
重启路由即可。
五、当前尝试的效果和存在问题
1、效果:一般情况下上游服务器基本可以分配自编前缀。
2、发现的问题:
重启后能加载mount --bind替换的文件,但是通过ps w|grep odhcp6c发现odhcp6c的命令行为
odhcp6c -s /lib/netifd/dhcpv6.script -Ntry -P2400:8:8:8::/64 -k -t120 eth1.5,
而不是预期的
odhcp6c -s /lib/netifd/dhcpv6.script -Ntry -P2400:8:8:8::/64 -k -t120 pppoe-wan
——也就是说,接口被识别为L2接口,而不是预期的L3接口,导致重启不能与上游服务器协调ipv6。
——/etc/config/network文件 wan6口的option ifname会被修改为wan口的ifname的值,我的是eth1.5。
每次重启路由器后可以通过手动执行/etc/init.d/ipv6 restart 重启ipv6解决。
最后,肯请懂的大佬指点下这个问题,也欢迎大家交流,交流才能进步呀。
由于文档体积超了,传不了截图,将就看看了。
|
|