致敬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

致敬mentohust,路由器使用Socket认证华科校园网的更多相关文章

  1. 登录华科校园网,我用Socket

    登录华科校园网,我用Socket 导语: 找一个华科学生问一问,学校的网络怎么样?得到的大多数是负面回答.其实不论是从覆盖区域.网络稳定性.还是速度来说,华科做的都还是可以的(24:00断网除外).可 ...

  2. Xubuntu下Mentohust认证(校园网用户)

    对于路由器上网到用户来说,自动分配IP上网。 对于校园网用户,首先下载mentohust_0.3.4-1_i386.deb,双击安装程序 然后在命令窗口中输入sudo -s 密码:user来获得roo ...

  3. 华为HG255D路由器使用OH3C进行中大校园网认证

    之前用的上海贝尔RG100A-AA路由器,被我无情地摧残了,电源按钮挂了,只能换个路由器.由于在校内,使用OP还是比较方便的,网上淘了这款华为HG255D,店主已刷好OP,无线速率300M,想想也是值 ...

  4. socket认证客户端链接合法性

    服务器端: #_*_coding:utf-8_*_ __author__ = 'Linhaifeng' from socket import * import hmac,os secret_key=b ...

  5. Windows7 + Ubuntu双系统安装过程记录

    本文为在已安装Windows7系统的前提下安装Ubuntu Kylin 14.10系统的过程以及期间出现的各种问题的记录. Ubuntu系统下载 Ubuntu Kylin中文官方网站:http://w ...

  6. 小记——GTMD校园网

    前言 学校一年前开通了校园网,然鹅信号未覆盖我们住的公寓,又多忍受了一年的小破宽带(10M带宽,100块300个小时) 上个星期,架设了一年的校园网终于通了,然后我们发现——校园网69元一个月,一个用 ...

  7. 基于HTTP 协议认证介绍与实现

    导言 一直对http 的头认证有兴趣,就是路由器的那种弹出对话框输入账号密码怎么实现一直不明白,最近,翻了一下http 协议,发现这是一个RFC 2617的实现,所以写篇文章介绍一下吧. Http基本 ...

  8. HttpClient三种不同的服务器认证客户端方案

    http://blog.csdn.net/i_lovefish/article/details/9816783 HttpClient三种不同的认证方案: Basic, Digest and NTLM. ...

  9. 西南大学网络实现路由器WIFI共享方案(一号多用户共享)

    背景: 学校更换网页认证,限制多台设备的登录,后台记录发现会将账号封30min禁止登陆,于是想办法冲破这个限制.看到马丁大神的博客知道了学校的检测机制,只需要定时对账号进行认证下线即可实现,不被学校检 ...

随机推荐

  1. python中的生成器,迭代器及列表生成式

    列表生成器:  即List Comprehensions. 在python中,可通过内置的强大有简单的生成式来创建列表.例如创建一个1到10的列表list [1, 2, 3, 4, 5, 6, 7, ...

  2. Spring Cloud分区发布实践(6)--灰度服务-根据Header选择实例区域

    此文是一个完整的例子, 包含可运行起来的源码. 此例子包含以下部分: 网关层实现自定义LoadBalancer, 根据Header选取实例 服务中的Feign使用拦截器, 读取Header Feign ...

  3. 计算机网络笔记Part1 概述

    总目录 1.计算机网络的功能.组成.分类 1.1功能 数据通信 资源共享 分布式处理 提高可靠性 负载均衡 1.2组成部分 硬件 软件 协议 1.3分类 按分布范围 广域网 WAN 城域网 MAN 局 ...

  4. Java方法01——什么是方法

    例子 package method;public class Demon02 { //main 方法 public static void main(String[] args) { //实际参数:实 ...

  5. 从门外汉到腾讯Android高级研发——一个半路出家菜鸟的艰难逆袭之路

    我是在去年3月份加入腾讯公司,目前是腾讯公司某技术部门里面的一个小负责人,年薪月薪大税后概30K,谈不上多么厉害,但在回想自己半路出家学习编程,从一个销售到现在终于进入中国互联网顶尖公司,还是有些许感 ...

  6. 【死磕 Java 基础】 — 谈谈那个写时拷贝技术(copy-on-write)

    copy-on-write,即写时复制技术,这是小编在学习 Redis 持久化时看到的一个概念,当然在这个概念很早就碰到过(Java 容器并发有这个概念),但是一直都没有深入研究过,所以趁着这次机会对 ...

  7. Java工具包之-Guava

    https://blog.csdn.net/zmx729618/article/details/78540026 https://my.oschina.net/realfighter/blog/349 ...

  8. MySQL 不完全入门指南

    由于 MySQL 的整个体系太过于庞大,文章的篇幅有限,不能够完全的覆盖所有的方面.所以我会尽可能的从更加贴进我们日常使用的方式来进行解释. 小白眼中的 MySQL 首先,对于我们来说,MySQL 是 ...

  9. 【笔记】Stacking方法

    Stacking 先前学习的集成学习 先前的思路很简单,假设有三个算法,每个算法都对数据进行一个预测,最后综合这三个结果得出一个最终结果,对于分类问题可以进行少数服从多数,对于回归问题可以简单地取平均 ...

  10. 提取网页的markdown表格利器

    在线Markdown表格转换器 markdown表格转换器,蛮好用的.偶然发现的开源工具,推荐一波. 这是目标链接:https://docs.locust.io/en/stable/configura ...