Skip to content

关于校园网中继ipv6无法正常下发IP的解决方案

Updated: at 21:16

在这篇文章里
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 打开自启动文件夹。

这种方法稳定性不好,为下下之选,其他办法都行不通的情况下才去用它。


Previous Post
数位板上手