和校园网斗智斗勇的日子
生命不息,折腾不止
校园网不息,那还等啥,继续折腾
本文所介绍的技术仅作为技术研究,不得用于网络攻击等违法行为
违反此声明造成的后果与笔者无关
写在前面
现在这个时代,老实说,已经离不开网络了。太过高深的道理先不讲,就是笔者平时上课的时候,都需要到学习通去签到,跟着老师的要求,输入签到码或者扫码或者定位或者画手势,确定你本人在教室里面,这才算是签到成功。
根据璃月上头的规定而言,公共场合提供网络接入的要做到实名制,而且要留存信息一段时间。密码连WIFI涉嫌违反《网络安全法》的风波还没过去(人们对这件事的态度其实很两极分化,这里暂且不谈,毕竟不是本文重点),学校这种『机要』部门肯定是不会随随便便开放网络接入权限的。再说了,网络也不是免费的,上次跟老师唠嗑了两句,大概获得的接入信息是:学校至少有3Gbps的电信 + 10Gbps的移动 + 30Gbps的联通,每个月光是网络接入费就得给御三家上不少贡。综合上面两条信息不难得出,学校给每个学生都建立了账号(和你的学号挂钩),凭此帐号缴费上网。
人嘛,总是有好奇心的。针对校园网的一些研究就有些蠢蠢欲动了....
基本信息
学校内不同区域划分了不同的网段,互相之间二三层不通,目前已知的是宿舍区分配10.240.0.0/16
,教学区分配10.50.0.0/16
在宿舍区(只能观察到自己宿舍的情况,下同)用学生账号,单账号可以拿到250Mbps的下传和70Mbps的上传,IPv4为NAT4(读出来是NAT3,但实际上行为不属于四种NAT行为的任何一种,但是比较靠近NAT4),无IPv6
单账号允许最多两个终端在线(靠MAC地址检测),且支持无感认证(无感认证后面还会继续提到),锐捷网页认证
网络物理接入
入学的时候提到过,学校宿舍一人一个网口,而且有校内WiFi覆盖。入学之后发现,确实是全校WiFi覆盖,不过在宿舍内找不到一人一个网口,只有一个孤零零的光猫扔在地上,PON分光器被光纤吊着(甚至有一段已经没有外皮了,直接裸纤,这都没断是个奇迹)。实在是不忍直视,买来网线和千兆交换机,从这个光猫上面分出线来,给舍友们接通了有线网络
从这段文字其实看得出来,学校分配到宿舍的网络实际上是某种PFTTR(PON-Based Fiber-to-the-Room),毕竟这个校区曾经是一所职业学校,后来才改成目前这个校区,原来当然是没有以太网配置的,只能借这个方案实现覆盖了。
认证上网
认证用的是锐捷的网页认证,在接入网络后,访问任意HTTP网站都会被重定向到网内的认证页面,输入账号密码后认证登录上网。
发现了吗,到这里位置,笔者强调很多次是锐捷『网页』认证。上专业课老师很喜欢提到的一件事是,软件技术发展了很多年,目前的大趋势是从C/S架构转向B/S架构,原因是浏览器的处理能力已经足够强大,可以满足一些系统的需求。
乍一看没什么大不了的,但是有趣也就有趣在这:浏览器可以看作是一个沙箱环境(当然不能和真正的沙箱环境比),他并没有提供过多的底层API。锐捷老早之前用的是客户端认证(现在在另一个校区依然如此),客户端可以操作的空间就大很多了,比如检测你有几张网卡,检测你机器上有没有代理软件,以及最重要的是,检测你网卡的MAC地址。
浏览器的js环境中并没有什么办法检测上面的这些东西,因此只能通过服务器反弹来处理。具体来说是,用户访问HTTP网页后,校内的网关拦截处理,把必须的信息(比如认证点IP,比如MAC地址)塞进去『跳转目标』里面,然后返回给客户端
从上图来看,这些信息都是被加密了的,显然是不想让你随意更改。但是根据笔者的观察来看,实际上同一个登录接口也可以接收非加密的信息。在上面的那串链接中,有一个参数t
,如果是从网页跳转过去,默认会被设置为wireless-v2
,但实际上,这个参数可以设置为wireless-v2-plain
,此时服务器就会把传过去的参数认为是未加密(plain)的。
笔者不知道为啥还要保留这个plain登录方式,猜测可能是兼容旧版浏览器(老领导很喜欢用的IE 6/7/8/9/)或者别的什么情况。而且笔者在撰写本文的时候,又进行了连接测试,在非宿舍区范围内,已经无法取得参数为plain的回调。但是不管怎么说,这个明文的接口本质上还是存在的,可以拿来干些事情。
通过不断地精简参数,笔者最后确定了,在本校,除了用户名密码外,只需要附带上t
和nasip
(编码后写到queryString中)即可登录到网络中。为了可以自动拨号上网,笔者把登录行为写成了一条curl命令:
curl -v -X POST -d 'userId=【ACCOUNT】&password=【PASSWORD】&passwordEncrypt=false&service=&operatorPwd=&operatorUserId=&queryString=nasip%253D【NAS_IP】%2526t%253Dwireless-v2-plain' 'http://【API】/eportal/InterFace.do?method=login'
执行这条命令后,如果返回的JSON状态为success,就代表已经拨号成功了,本机(本MAC)就可以上网了。(2023/11/2更新:这个接口似乎已经有点问题了)
为了进一步方便起见,笔者将其写入到了crontab当中,设定为早上六点半过两分钟就开始拨号,这样一天之内都可以快乐上网了.....
......吗?
网络保活
这玩意是有网络保活机制的,一段时间内无任何网络动作就会被切断连接,需要重新登录。
从扒下来的网页前端js代码可以观察到,还有另一种保活方式是前端页面持续请求一个keepalive接口,保持连接不断开,这也就是为什么有些大学要求认证之后要保持页面开着。
但是在本校中,这个请求间隔始终为零,也就是不会通过这个方式来保活。笔者几经试验发现,实际上他检测网络活动的方式是很粗糙的,有收发包就行了。而笔者日常在用的,有固定收发包间隔的东西,就是用来连回家的WireGuard,只需要那这样的keepalive打开,设定一个相对较短的时间(比如15到25秒)然后后台挂机,就可以避免网络无活动而被断开了。
内网互联
跨网段没办法互联,但是如果是同一个区域(比如宿舍和楼下的食堂)的网络可以互联。
根据其他群友来看,有一些学校的锐捷认证,可以选择『校内免费服务』,也就是不交钱就不访问外网。本校,至少笔者检查了,并没有这个选项,不登陆的话二层内都不通,登录了就可以上外网和访问内网。
但是,和预料中差不多的是,不登录情况下防火墙放行了53/67/68(但依然也不可以跨区访问)。连外网是否放行暂不清楚,但是同区域是可以用的。笔者经过测试,跑在68端口的WireGuard可以正常使用,可以通过中转的方式来上网。
我们也差不多。主要发现就是两个网段,一个是整个校园内的WiFi,一个是宿舍内的WiFi或有线用的。我更喜欢分别称它们为“校园网”和“宿舍网”,校园网可以免费使用,宿舍网要买三大商的宽带服务。而且它们俩还有些不太一样,校园网全校互联,且不登录情况下也能互通,而宿舍网不登录就ping不通了。现在我的配置是这样:
宿舍的猫出来-树莓派(又买了个USB-以太网网卡。做NAT,并在上面每一分钟执行一次登录校园网的curl来做到自动登录永远可用)-交换机-电脑和其他设备
另一边,我在阳台放了个香橙派,wifi连校园网(我们那个校园网在阳台可以连上,到宿舍连不上),以太网口拉根线连到宿舍网。香橙派上配置一下从eth到wlan的端口转发,把宿舍网我的电脑的某一个端口暴露在校园网上监听着。也就是这个香橙派贯通了校园网和宿舍网,这样我就可以直接在教室访问宿舍的电脑了。