通过锐捷认证才能接入网络对于不想铺设路由器、只想简单的刷网页、看视频、使用微信的人群而言,这种方式虽然有些麻烦,但是基本上能接受。因为确实带来了一些便利、比如:WIFI信号覆盖面广、支持多终端接入上网。不过如果你是对于网络有着更高需求的群体而言,这一体验就是灾难般的体验,比如:无线覆盖面虽广,但无线速率太低,偶尔会极其不稳定。每次设备断开WIFI或进行息屏,都要重新认证。也因为必须使用锐捷认证,你也没办法使用有线网络接入个人路由器使用PPPoE协议拨号上网,提供更为稳定的个人WIFI,自然也没办法使用OpenWrt完成我们的一些特殊的需求。
为了实现在自己的路由器上面完成锐捷认证、我们必须得借助MentoHUST来完成
MentoHUST是由华中科技大学学生首先在Linux系统下开发出来,而后扩展到支持Windows、Linux、Mac OS下的锐捷认证的程序(附带支持赛尔认证)、兼容Windows、Linux和Mac OS所有主流版本,完美代替锐捷认证。
MentoHUST是使用C语言进行开发的程序,为了使它能在我们路由器上正确的运行,必须使用交叉编译的方法生成对应路由器平台可执行的程序
所谓交叉编译,简单地说,就是在一个平台上生成另一个平台上的可执行代码。这里需要注意的是所谓 平台,实际上包含两个概念:体系结构 (Architecture) 、操作系统 (Operating System) 。同一个体系结构可以运行不同的操作系统;同样,同一个操作系统也可以在不同的体系结构上运行。 交叉编译通常是不得已而为之,有时是因为目的平台上不允许或不能够安装我们所需要的编译器,而我们又需要这个编译器的某些特征。有时是因为目的平台上的资源贫乏,无法运行我们所需要编译器。有时又是因为目的平台还没有建立,连操作系统都没有,根本谈不上运行什么编译器。
我的设备及OpenWrt版本
- x86架构64位的J1900软路由
- OpenWrt S2020.10.29 Sirpdboy / LuCI Master (git-20.256.12360-1a54222)
准备编译环境及工具
- OpenWrt SDK,选择自己路由器架构和使用对应OpenWrt版本号的SDK进行下载,路径为 / releases / 版本号 / targets / 你的路由器架构 1
- VMWare Workstation虚拟机、MacOS系统推荐使用 Parallels Desktop
- Linux系统镜像、发行版本选择 Debian 或 Ubuntu 都可以
- MentoHUST源代码,可以运行虚拟机后通过命令行进行下载
- 一个可以自由访问互联网的网络环境,因为需要在镜像中下载很多编译所需的工具,如果你使用的没有这样的条件,可能会导致你等待很长的时间,解决方案就是寻找一些国内的镜像源 。2
开始编译
1、使用 root 用户登录 VPS 或者本地虚拟机,新增一个非 root 用户,并赋予和 root 等同权限
useradd newuser #newuser为你的自定义用户名
passwd newuser #为我们刚创建的用户名设置密码
2、密码设置完毕,使用 vi 编辑器修改配置文件赋予刚创建的新用户权限与 root 用户一致
vi /etc/sudoers ,按下键盘上的 i 键 进入编辑模式,找到 root ALL=(ALL:ALL) ALL,并在后面加入一行 newuser ALL=(ALL:ALL) ALL 按下键盘上的 ESC 退出编辑模式,输入 :wq! 进行保存配置文件并退出。
3、切换至创建的新用户:newuser,使用 su newuser
4、升级必要的组件,sudo apt-get update 输入密码完成升级操作。
5、下载编译所依赖的工具
sudo apt-get -y install build-essential asciidoc binutils bzip2 gawk gettext git libncurses5-dev libz-dev patch python3.5 python2.7 unzip zlib1g-dev lib32gcc1 libc6-dev-i386 subversion flex uglifyjs git-core gcc-multilib p7zip p7zip-full msmtp libssl-dev texinfo libglib2.0-dev xmlto qemu-utils upx libelf-dev autoconf automake libtool autopoint device-tree-compiler g++-multilib antlr3 gperf
6、如果你使用的是非 X86 架构的路由器,则需要下载 OpenWrt 的 SDK,对应的命令为
cd /
sudo mkdir openwrt
sudo chmod 777 openwrt
git clone https://git.openwrt.org/openwrt/openwrt.git
cd openwrt/
因我所使用的是 lead 编译的 OpenWrt 固件,使用的命令为
cd /
sudo mkdir lede
sudo chmod 777 lede
git clone https://github.com/coolsnowwolf/lede
cd lede/
7、更新feeds
Feeds,也就是软件包列表,是在OpenWrt中共用位置的包的集合。运行以下命令即可更新内置软件包列表并链接到编译工具中
./scripts/feeds update -a
./scripts/feeds install -a
8、下载MentoHUST源代码至Package文件夹下
git clone https://github.com/KyleRicardo/MentoHUST-OpenWrt-ipk.git package/mentohust
9、配置编译选项
make menuconfig
从MentoHUST源代码的Makefile文件中可以找到当前MentoHUST在菜单中的Network类别中,键盘下键移动至Network点击回车,继续选择Ruijie选项,输入大写的M,表示我们将MentoHUST作为一个模块编译。选择Save保存配置,最后退出菜单。不放心配置是否已经选上可以快速按下ESC键两次,将返回上一级菜单,从上一级菜单再进入本菜单确认配置勾选状态。



10、安装编译工具与编译依赖,这个过程需要一个漫长的等待
make tools/install V=s
make toolchain/install V=s
11、开始编译,等待控制台不再打印编译日志即可
make package/mentohust/compile V=s
12、编译如果完成,并且没有发生错误。将会输出两个 ipk 包将会在 openwrt/bin/packages/ YourArchitecture/base 下,X86架构下分别得到是 libpcap1_1.9.1-2_x86_64.ipk 和 mentohust_0.3.1-1_x86_64.ipk ,只要将他们从我们的VPS上拷贝到OpenWrt上安装即可。libpcap 是 mentohust 所依赖的包,所以在安装之前我们必须先安装 libpcap ,再安装mentohust。关于如何从VPS中拷贝出 ipk 到本地电脑,再上传至OpenWrt下,我这里所使用的 SSH 工具是 FinalShell 。你如果是MacOS也可以在终端中使用SCP功能。上传至OpenWrt也同理,要么通过Web后台选择本地上传,要么通过SCP上传。
13、安装
opkg install your_libpcap.ipk
opkg install your_mentohust.ipk
14、关于如何使用 MentoHUST,你可以在 OpenWrt 终端中输入mentohust -h 打印出如下帮助信息,然后配置好自己的用户名与密码。
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
欢迎使用MentoHUST 版本: 0.3.3
Copyright (C) 2009 HustMoon Studio
人到华中大,有甜亦有辣。明德厚学地,求是创新家。
Bug report to
http://code.google.com/p/mentohust/issues/list
用法: mentohust [-选项][参数]
选项: -h 显示本帮助信息
-k 退出程序
-w 保存参数到配置文件
-u 用户名
-p 密码
-n 网卡名
-i IP[默认本机IP]
-m 子网掩码[默认本机掩码]
-g 网关[默认0.0.0.0]
-s DNS[默认0.0.0.0]
-o Ping主机[默认0.0.0.0,表示关闭该功能]
-t 认证超时(秒)[默认8]
-e 响应间隔(秒)[默认30]
-r 失败等待(秒)[默认15]
-a 组播地址: 0(标准) 1(锐捷) 2(赛尔) [默认0]
-d DHCP方式: 0(不使用) 1(二次认证) 2(认证后) 3(认证前) [默认0]
-b 是否后台运行: 0(否) 1(是,关闭输出) 2(是,保留输出) 3(是,输出到文件) [默认0]
-y 是否显示通知: 0(否) 1~20(是)[默认5]
-f 自定义数据文件[默认不使用]
-c DHCP脚本[默认dhclient]
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
例如:
mentohust -uusername -ppassword -neth0 -i192.168.0.1 -m255.255.255.0 -g0.0.0.0 -s0.0.0.0 -o0.0.0.0 -t8
-e30 -r15 -a0 -d1 -b0 -fdefault.mpf -cdhclient
使用时请确保是以root权限运行!备选方案,OpenWrt 每天定时运行 Shell 脚本实现锐捷认证
如果你所使用的锐捷提供了 Web 认证的方式,我们可以在 OpenWrt 上使用 crul 来模拟一个HTTP请求,达到完成认证的目的。并使用 crontab 来为我们定时执行这样的一个脚本。使用这种方式的原因在于锐捷认证引入了 Service 的参数来提供我们选择电信运营商,而在之前的MentoHUST中是不支持我们提供这样的参数。但是这个过程需要你对 HTTP 的请求进行抓包,保存好我们所需要的参数才行,并且需要替换我提供的 Shell 脚本中的参数。
#!/bin/sh
# 替换成你的用户名
userId=123456
# 替换成你的密码
password=123456
# 这里判断是否已经属于登录状态 如果是则退出脚本
captiveReturnCode=`curl -s -I -m 10 -o /dev/null -s -w %{http_code} http://www.google.cn/generate_204`
if [ "${captiveReturnCode}" = "204" ]; then
echo 'You are already online!'
exit 0
fi
# your_ip_address 替换成自己锐捷认证的ip,例如:192.0.1.128
loginURL='http://your_ip_address/eportal/InterFace.do?method=login'
# service是运营商中文经过两次UrlEncode编码的结果,
# 提供编码网址为https://tool.chinaz.com/tools/urlencode.aspx
# 例如:电信互联服务 这六个中文字符经过两次UrlEncode得到如下结果,如果你使用其他运营商请自行修改
service='%25E7%2594%25B5%25E4%25BF%25A1%25E4%25BA%2592%25E8%2581%2594%25E7%25BD%2591%25E6%259C%258D%25E5%258A%25A1'
# 此处参数已混淆,你需要使用chrome浏览器F12打开控制台
# 复制你成功登录的queryString进行替换即可
# 要是登录太快来不及复制就Network把网络请求速度调至最低的1kb/s
queryString='wlanuserip%253D61c0f75547fe4a0a3%2526wlanacname%253D2001c0ad74c7144b2f1%2526ssid%253D%2526nasip%253Dce99c6cb0838%2526snmpagentip%253D%2526mac%253D162f1d943dbcbb90fe27fad1765b526t%253Dwireless-v2%2526url%253Dfa955daa669c449a163%2526apmac%253D%2526nasid%253D204fb759566634401c0ad74c7144b2f1%2526vid%253D02526port%253Dd%2526nasportid%253Defc04e823eeb5679bfc7a150e5af1c4645eae50c4684744dfdd0d5f9ef5b8b51d174775'
queryString="${queryString//&/%2526}"
queryString="${queryString//=/%253D}"
# 这里无需进行替换
# 看到返回的JSON中包含success代表认证成功
auth=`curl -s -A "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.91 Safari/537.36" -e "${loginURL}" -b "EPORTAL_COOKIE_USERNAME=; EPORTAL_COOKIE_PASSWORD=; EPORTAL_COOKIE_SERVER=; EPORTAL_COOKIE_SERVER_NAME=; EPORTAL_AUTO_LAND=; EPORTAL_USER_GROUP=; EPORTAL_COOKIE_OPERATORPWD=;" -d "userId=${userId}&password=${password}&service=${service}&queryString=${queryString}&operatorPwd=&operatorUserId=&validcode=&passwordEncrypt=false" -H "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8" -H "Content-Type: application/x-www-form-urlencoded; charset=UTF-8" "${loginURL}"`
echo $auth
把脚本保存在设定的文件夹后,就可以开始设定定时任务。下面的配置意思是,每两个小时执行一次脚本。因为锐捷有心跳机制,在你入睡或者长时间未使用这个网络的情况下,会将网络连接断开,这个时候你只能进行重新认证。所以将脚本设定为两小时执行一次可以有效避免掉线的情况,如果你不确定你所配置的是否正确,crontab 会不会定时去运行脚本,可以通过这个网址去验证配置。在表单中提交 0 */2 * * * 关于时间项即可,绝对路径不要添加。
0 */2 * * * /usr/ruijie/ruijie_auth.sh
参考链接
