致敬mentohust,路由器使用Socket认证华科校园网

2021年9月7日 2点热度 0条评论 来源: 胡小安

致敬mentohust,路由器使用Socket认证华科校园网

前言:

上一篇文章中,为了解决ESP32华科无线网认证的问题,我成功把网页认证机制用Python+Socket复现。但痛点依然存在,无线网连接数量有限、公用路由可操作性低、有线网口少这些问题只有通过引入路由器才能解决。

我手上有两台洋垃圾网件R6300v2,均刷有梅林固件380.70。折腾它们是为了实现路由器自动校园网认证并提供稳定的网络,为越来越多的联网设备以及后面的项目做准备。

前后两篇文章都是对mentohust开发前辈的致敬,虽然技术层次远不及前辈大佬,只是希望能传递一些精神。本文所用到的一些程序以及华科校园网认证的具体情况在登录华科校园网,我用Socket里有详细描述。不熟悉mentohust软件的朋友可以先浏览文末致敬部分。

目录:

目录

条件分析

有线认证

首先要了解的就是校园网有线认证的可能途径,才好有的放矢。下面是学校网络中心官网截图:

可以看出,在学生区的有线网络仅允许使用认证程序,也就是锐捷认证客户端进行认证。于是在理论准备的时候,我的想法是把mentohust部署到R6300v2上进行锐捷认证,也在网上找到了几篇来自哈工大、浙江理工的同学的文章,甚至联系到一位华科研究生学长,他几个月前将mentohust部署到了小米AC1200路由器上,充分证明了方案的可行性。

在实际使用中我发现,接入有线网络后竟然也会弹出Web认证页面,也就是说虽然在上图中没有标出,但Web认证在学生区是完全可行的。后来,我也通过电话向学校网络中心确认了这种方式将会长期存在。

如上图所示结构,当PC1连接到路由器时,自动弹出认证网页。认证完成后,会显示有路由器PC1两个设备占用了校园网在线名额。此时其他设备比如PC2再连接到路由器也可以获得网络连接,并且不会占用校园网名额。

问题在于,如果PC1断开连接或者主动下线,路由器也随之下线,其他设备自然失去网络连接。所以,进行认证的设备必须时刻在线,而且要具有重连功能以应对突发情况。

路由器平台

如上图,两台R6300v2都已经刷入梅林380.70,右边的一台加装了散热风扇。本次仅用到一台路由器,至于为什么会有两台,那就是另一个有趣的故事了。

R6300v2主要参数如下:

CPU:博通BCM4708 双核800MHz Cortex-A9

内存:256MB

系统:梅林380.70 Linux 2.6

可以说是可玩性非常高了,在网上看到有人为R6300v2编译了Python 2,这样一来之前写的Python版本认证不就可以直接拿来用了吗?但是出于稳定与效率的考虑,并没有继续使用Python。

方案选取

综合有线网络认证与路由器的软硬件情况,思前想后有这么几种方案:

  1. 额外的设备连接到路由器负责登录,这个设备要保持随时在线,比如ESP32,还有树莓派、香橙派等SBC。要具备网络接口能力。
  2. 路由器运行mentohust进行锐捷认证,也是大多数教程的做法。
  3. 将之前的Socket认证程序移植到路由器端,通过Socket进行认证。

不难得出,方案一是曲线救国的下策。对比二和三,方案三由于Socket登录完全自主,会比方案二使用mentohust更加易于调试。但方案三需要把之前Python程序改写成C并为路由器交叉编译,然而这款十年前的32位处理器,资料相当少,交叉编译环境搭建十分费力,具体在后面也会提到。

综上,方案二三我都进行了尝试。部署mentohust之后无法找到认证服务器,我没有在这上面花费太长时间,毕竟mentohust由于认证的复杂程度高所以很难满足稳定这一要求,我就将重点放到方案三上去,也就是:

使用C语言重写Socket认证程序,并为R6300v2平台编译

方案实施

交叉编译工具链与环境

虽然BCM4708本身性能已经与不少单板计算机(树莓派)相差无几,但由于系统缺失了许多构建工具,一般选用上位机交叉编译的方法为其产生可执行程序。交叉编译就需要用到BCM4708这款芯片的工具链以及相应环境,困难在于这款芯片比较古老,需要的工具链和环境在2021年算是比较少见,可考资料寥寥,加之我经验浅薄,在环境搭建上花了不少时间。

我使用的工具链来自:https://github.com/RMerl/am-toolchains,其中的BCM-SDK版本适合于BCM4708。

拿到工具链,我先是在搭载 Ubuntu 20.04 64位的云服务器上尝试使用未果。由于需要32位的运行库,于是在虚拟机中安装了Ubuntu 12.04 32位版,然而12.04发行版的各种支持都已经结束。只能又换为Ubuntu最后一个支持32位的长期维护版16.04。

上位机系统找好,添加了工具链及其动态链接库后,运行arm-linux-gcc hello_world.c得到了a.out,用scp放到路由器上运行,成功打印出了hello world。证明交叉编译环境搭建成功。

认证程序的C语言实现与调试

上一篇文章登录华科校园网,我用Socket中,咱们用Python控制Socket模拟浏览器进行认证,这一次只需要用C完全复现即可。不得不说,还是Python好用。同样这次的代码也并入了之前的GitHub仓库

编码的过程并不让人享受,在Windows下编辑,在CentOS虚拟机下编译测试,Ubuntu虚拟机下交叉编译,再传输到目标机。期间使用GitHub进行同步需要使用全局代理加速,测试为了连接校内认证服务器又需要关闭代理。总而言之,折腾

实际部署

有了登录的可执行文件,只需要在上电开机以及固定时间自动执行即可。

梅林固件虽然是基于Linux,仍有非常多与常用发行版不一样的地方,下面是我的一种部署方法:

使用crontab定时调用,以及开机自动执行的脚本/jffs/scripts/nat-start

#在/jffs/下建立一个文件夹,我起名叫login_by_socket,把编译好的程序(a.out)放到login_by_socket下
#并在login_by_socket下建立一个文本文件crontab_table,内容为:
#*/30 * * * * date >> /jffs/login_by_socket/log;/jffs/login_by_socket/a.out >> /jffs/login_by_socket/log
#意为每隔30分钟自动尝试认证
#再向/jffs/scripts/nat-start添加两句话:
#/jffs/login_by_socket/a.out
#crontab /jffs/login_by_socket/crontab_table
#总结为如下:

chmod a+w /jffs
mkdir /jffs/login_by_socket
#需要手动将a.out放到这里来
echo '*/30 * * * * date >> /jffs/login_by_socket/log;/jffs/login_by_socket/a.out >> /jffs/login_by_socket/log' > /jffs/crontab_table
echo '/jffs/login_by_socket/a.out' >> /jffs/scripts/nat-start
echo 'crontab /jffs/login_by_socket/crontab_table' >> /jffs/scripts/nat-start
#以上这些只需要执行一次,所有的日志可以在/jffs/login_by_socket/log中找到

显然还可以进一步优化,来提高认证的精准度,比如可以主动判断是否连接来尽量减少掉线时间。

致敬mentohust

十多年前,华科的几位前辈开发了一个开源项目,它可以模拟锐捷认证客户端进行上网认证,叫做mentohust。由于其开放源码特性,故可以被编译到各种平台上运行(路由器)。锐捷认证是华科也是很多高校选用的认证方式,因此mentohust也被无数学校的学生进行移植,修改,运用,直到今天。

我探索校园网的认证途径,除了自己的需求以外,也是被前辈这样的精神感召。虽然在技术难度上远不及前辈,亦是想尽一份力,发一点光,正如图片中mentohust化用的华科校训:人到华中大,有甜亦有辣。明德厚学地,求实创新家。

后记

返校后开始着手去做,由于水平一般,实打实地肝了两天才把所有都弄完,又用了一天时间来写这篇文章。其中向学校网络中心咨询时那边的老师问了我的学号,我心里咯噔一下想这怕不是要办我,后来老师叫我不要多想。过程中交叉编译等环境的描述也没能非常详细,毕竟还在用这样古老平台的人的确不多。

代码GitHub地址:https://github.com/HuXioAn/HUST_Wireless_login_by_socket 如果需要文中编译工具链相关具体环境可以公众号直接联系我,发现文中有错误或者其他意见也请一定指出。技术新人,还望各位前辈多指教。

上一篇文章也可以在公众号里找到,来和我聊聊天吧:

欢迎转载!请注明作者与原文地址。

作者:胡小安

原文地址:https://www.cnblogs.com/huxiaoan/p/15235849.html

    原文作者:胡小安
    原文地址: https://www.cnblogs.com/huxiaoan/p/15235849.html
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系管理员进行删除。