在这篇文章里
iStoreOS (OpenWRT)下校园网无前缀ipv6稳定配置
作者在讲解了如何进行IPv6中继后提出一个问题,但给出的解决方法不是特别清晰,所以我在这补充一下详细步骤。
脚本添加位置
/etc/hotplug.d/
目录用于存放网络接口状态变化时触发的脚本,但直接将脚本添加到 /etc/hotplug.d/ 中似乎不起作用,需要将其添加到下一级目录 /etc/hotplug.d/iface 中(也许其他目录也可以,未测试)。也就是使用以下命令将脚本添加到该目录中,也可使用其他编辑器,脚本名称可自己定。
vim /etc/hotplug.d/iface/ipv6_script
添加脚本内容
如果是使用的是windows的最新终端应用,可以直接Ctrl+V将脚本内容粘贴进去,记得先按 i 键进入插入模式。然后ESC退出插入模式,使用 :wq (记得有冒号)保存并退出。其他编辑器请自行搜索使用方式。
#!/bin/sh
case "$ACTION" in
ifup)
if [ "$INTERFACE" = "wan6" ]; then
ip -6 route add `ip -6 route show default | sed -n -e 's/default from //' -e 's/ via .*$//g' -e '/64$/p'` dev br-lan metric 128
logger -t IPV6 "Route resetting for $INTERFACE up"
fi
;;
esac
给予执行权限
目前该脚本还只是一个文本文件,需要用命令为其添加执行权限
chmod +x /etc/hotplug.d/iface/ipv6_script
脚本内容解释(可不看,方便理解)
/etc/hotplug.d/
目录用于存放网络接口状态变化时触发的脚本,于是当网络接口发生变化时便会执行其目录下的脚本。
case "$ACTION" in
ifup)
if [ "$INTERFACE" = "wan6" ]; then
这段表示在网络接口 wan6 启动时执行下面的内容,wan6 可修改为自己路由器中IPv6接口的实际接入位置,有的教程会新建一个 wwan6 接口用来获取 IPv6,那就要把 wan6 改为 wwan6。可以到路由器的 网络->接口 中查看是哪个接口接入了 IPv6,如果接口下面写着 iIPv6:2xxxx之类的并且后面跟着一个/64,那大概率就是这个接口接入了公网 IPv6。
在路由器的 状态->系统日志 中使用浏览器查找 ifup 应该能看到网络各个接口的启动日志,一般是在路由器开机之后,这也是为什么可以通过重启来让这个脚本执行。
ip -6 route add `ip -6 route show default | sed -n -e 's/default from //' -e 's/ via .*$//g' -e '/64$/p'` dev br-lan metric 128
原本命令应该为
ip -6 route add 2xxx:xxxx:xxx:xx:xxxx:xxxx:xxxx:xxxx dev br-lan metric 128
意为添加一个 IPv6 的路由到 br-lan 这个接口上,跃点数为 128,跃点数越小优先级越高,设成128的原因下面讲。
ip -6 route show default | sed -n -e 's/default from //' -e 's/ via .*$//g' -e '/64$/p'
这是替换掉源代码 IPv6 地址的部分。
ip -6 route show default
命令用来展示默认路由,内容大概是
default from 2xxx:xxxx:xxxx:xxx::/64 via fe80::6e26:36ff:fe6e:33ab dev apclix0 proto static metric 512 pref medium
竖线 | 作为分隔符
后面的
sed -n -e 's/default from //' -e 's/ via .*$//g' -e '/64$/p'
意为使用 sed 这个流编辑器对输出内容做出修改,不打印出默认路由的
default from
和后面的
via fe80::6e26:36ff:fe6e:33ab dev apclix0 proto static metric 512 pref medium
只保留以 /64 结尾的行。如果单独输入这条命令就可以知道打印出了什么,一般是
2xxx:xxxx:xxxx:xxx::/64
这样的格式,这是默认路由用来分配 IPv6 的前缀。
将这个前缀分配到 br-lan 接口上就可以让 br-lan 下的设备也能自动分配到 IPv6。
logger -t IPV6 "Route resetting for $INTERFACE up"
这个命令用来输出日志,可以用来 debug,在 系统日志 中可以查看。
后面就是脚本的结尾部分,无需解释。
Debug(调试)
接下来调试脚本是否能成功运行,可以直接重启路由器,也可以输入以下命令单独关闭并打开 wan6 接口(或者替换成脚本中设定的接口)。
ifdown wan6 && ifup wan6
应该能看到这样的日志
daemon.notice netifd: Interface 'wan6' is now down
daemon.notice netifd: Interface 'wan6' is setting up now
daemon.notice netifd: Interface 'wan6' is now up
user.notice firewall: Reloading firewall due to ifup of wan6 (apclix0)
如果是重启路由器,那么只要要找到这样的日志,必须是新产生的,重启后旧日志不会删除。
user.notice firewall: Reloading firewall due to ifup of wan6 (apclix0)
然后接着的是
user.notice IPV6: Route resetting for wan6 up
这是脚本里设置的输出日志,有这段日志说明脚本成功执行了。
接着到路由器的 状态->路由表 里,找到最下面的 活动的 IPv6 路由。里面应该会多出一个 br-lan 接口的路由,地址是以 /64 结尾的,跃点数是128。这样就算是成功添加了脚本。
记得把接口的 IPv6设置中把 学习路由 关掉,不然分配的地址会被 wan6 挤掉。
测试
到 Windows 的 网络和Internet设置 的 高级网络设置 中先禁用以太网,再重新启用。然后打开 https://6.ipw.cn/ 这个网址查看自己是否获得了 IPv6 地址。也可以通过查看路由表的 IPv6邻居 里有没有本机 mac 地址对应的 IPv6 地址。
备选方案
到这里应该就可以正常自动分配IPv6了,如果还不行还可以试试 Nat6。
以下是其他人写的相关教程
https://sustech.online/service/network/ipv6/
https://zhuanlan.zhihu.com/p/492774540
https://stephenleng.com/cn/openwrt-zhejiang-university/
https://chariri.moe/archives/644/nju-ipv6-openwrt/#toc-head-6
或者写一个开机脚本,每次开机自动 ping 路由器地址,这里给出简单的脚本内容
@echo off
setlocal enabledelayedexpansion
:: 初始化计数器
set /a count=0
:loop1
:: 先执行3次,每隔10秒
if !count! lss 3 (
ping ysltr.v6.navy
timeout /t 10 /nobreak > NUL
set /a count+=1
goto loop1
)
:loop2
:: 执行3次后,开始每隔5分钟ping一次
ping ysltr.v6.navy
timeout /t 300 /nobreak > NUL
goto loop2
先每隔 10 秒 ping 一次路由,连续三次,之后每隔5分钟 ping 一次防止被挤掉。
写到 .bat 文件中,再放进 自启动文件夹 就可以了。可以用 Win+R 输入 shell:start 打开自启动文件夹。
这种方法稳定性不好,为下下之选,其他办法都行不通的情况下才去用它。