广西大学学生宿舍晚上12点不断网指南封面图

广西大学学生宿舍晚上12点不断网指南

本人在广西某211也待了好几年了,基本上已经摸透了校园网的情况。虽然学校规定周一至周五晚上过了12点断网,第二天6点恢复,但是实际上有办法绕过,而且是两个办法绕过。自己已经爽玩了几年,独乐乐不如众乐乐,我打算把广西大学学生宿舍晚上过了12点不断网的解决方案分享出来,供大家进行参考。

广西某211校园网情况概述

这个学校的校园网目前看,整体质量是下降了,大概2023-2024这两年是比较好用,大概是2025年底,到2026年初,开始出现了奇奇怪怪的限制,会阻断一些连接的类型。就目前的情况,可以确认会阻断的应用是EasyTier,说实话,我也不知道为什么要阻断这个东西。另外,Cloudflare的控制面板dash.cloudflare.com这个域名是被DNS污染的,无法正确解析到IP,需要手动设置Hosts文件指定到Cloudflare的IP,域名没有被SNI阻断,配置Hosts即可正常访问。当然,如果你不是经常维护网站什么的,这个问题和你没什么关系就是了。比较影响使用体验的是校园网Web认证稳定性下降,相比于前两年更容易掉登录。
关于游戏方面,目前打游戏没有太大问题,玩国际服的CS2延迟也很低,其他网络游戏不清楚,我不玩。
学校的校园网是有四种网络聚合而成:教育网,中国联通,中国电信,中国移动。出口是负载均衡的,但是似乎对于不同的访问目标IP会切换到不同的运营商。校园网连接Cloudflare相关的站点速度比较快,应该是走了教育网的线路出口。
关于宿舍的网络接口,大部分宿舍的网络接口都是百兆,但是少部分是千兆,取决于你宿舍网口接的交换机,如果网口接的是上游千兆交换机,则为千兆;若接的是下游百兆交换机,则为百兆。可以骚扰校园网工作人员让他给你换成千兆,如果你宿舍交换机有千兆的话。
关于运营商宽带,在2023年的时候还是有运营商宽带可以办理的,比如可以办理联通的手机卡加宽带套餐,那时候好像是39块钱一个月,200M宽带外加325G流量,或者59块钱一个月,300M宽带。电信和移动也有。但是我个人感觉联通性价比最高。但是2024年开始,学校就不允许新办理运营商宽带了,而是统一校园网。而之前的用户可以继续用。学校之前的要求是要把宽带账户绑定到校园网账户,学校网络中心代拨,但是如果是这样就没有任何意义了:校园网波动你也掉线,校园网断网你也断网,而且更过分的是还会锁速度,只有100M。不过好消息是,之前原有的拨号上网依然可用。
总体来说,虽然校园网客观上是变烂了,但是对于正常上网影响不是很大,但是想玩技术的可能就蛋疼了。

不断网方法一:运营商宽带拨号上网

这个是我最推荐的办法,但是目前看门槛有点高,主要的原因就是前文所述,学校不允许办理运营商宽带了。但是,如果有路子,多问问,能办理到,你就是人上人:晚上过了12点不断网,跑满宽带网速(前提是你能争取到千兆网口),还有一个更王炸的,那就是——你能获得公网IP!这意味着,配合DDNS,你可以在宿舍直接搭建NAS,开MC服务器,搭建网站等等,只需要你有一台7x24小时运行的电脑当服务器就可以,云服务器可以做的事情,这电脑基本上都能做。问就是我这样玩了好几年,也锻炼了不少服务器运维能力。
下面我来详细说一下宽带拨号的相关的设置。

设备准备

你需要一个可被程序控制的路由器,至少支持WAN口重新拨号,具体为什么我后面会说。这里有两个解决思路:

  • 找一个能刷OpenWrt的路由器,刷OpenWrt,这样就可以直接控制了,甚至连第二个电脑都省了,程序直接运行在路由器上面。
  • 自己逆向路由器设置的前端网页,写一个程序能够模拟用户登录,进行相关的操作,比如断开WAN口重连。

对于第二个选择,建议逆向完成后使用HTTP请求对路由器进行操作,而不是无头浏览器,这样最节省资源,速度也最快。大部分路由器的管理界面登录逻辑都是加密你输入的登录凭据,然后进行加密发送给路由器管理页面服务器,服务器返回Token,你的请求带上Token就可以进行操作了。一般来说,比较难处理的是登录后获取凭据这一步,有一些路由器会利用时间戳进行凭据的加密来防止重放攻击,这种情况比较棘手,大部分主流路由器都是这样。但是,有一个例外,TP-Link的路由器(老款管理界面的),这个每次发送的加密登录凭据是一样的,直接进行重放就能获取到Token,后续就畅通无阻了。要注意的是,TP-Link是著名的缩水王,路由器性能不咋样。
不过现在已经是AI时代了,我感觉把路由器的登录页面和JS拿下来问问GPT应该不难解决了,我当年做这些的时候真的是被弄得焦头烂额。
哦,对,别忘了,如果是选择这个方法,你还需要一台额外的电脑来进行事件的处理,而且这台电脑需要不间断运行。性能要求不高,主要是需要一直进行网络连通性检测,并且在网络被阻断后进行相关的操作。像DELL Wyse 3040 这种小主机就比较合适。

路由器拨号

在进行这步操作之前,你需要确保你已经拿到了运营商宽带的账号和密码,一般来说除非是特定说明宽带账号,不然宽带账号就是手机号,宽带密码办理的时候应该会给你,拿到了宽带账号和密码才能进行下面的操作。
校园网的拨号情况比较特殊,需要填写服务名/服务器名(不同的路由器写法不一样),具体填写情况是这样的:

  • 联通宽带填写:lt
  • 电信宽带填写:dx
  • 移动宽带填写:yd

对的,就是运营商拼音缩写,我用的是联通宽带,就这样子配置:
1.png
填写完成后尝试让路由器拨号,正常来说过一会就会拨号成功,如果一直不行的话,打电话给运营商客服,要求解绑宽带,不同的运营商称呼可能会不同,具体问客服,相当于重新绑定拨号设备,不过一般情况新办理的宽带首次拨号不会出现这种情况。
拨号成功后会拿到公网IP(联通和电信可以,移动不知道),应该是这样的:
2.png
这时候应该就可以正常上网了,如果使用半个月没有遇到下一个章节说的问题,那恭喜你,你那个片区检测不严格或者你多设备共享上网的痕迹不明显,可以不用准备挂机的电脑了。但是,如果你上网上着上着弹出这个界面并且网络全部被阻断:
3.png
那你就要看下一个小节了。
哦,对了,我提醒一下,在广西某211的校园网,只有使用运营商宽带拨号上网会出现这种情况,而正常的校园网是可以用路由器共享上网的,不会封禁。

解除共享网络封禁状态

这个部分的操作强烈建议后续使用程序自动化完成,不然你的上网体验会相当糟糕。
首先,解除封禁有两种方式:重新拨号和退出AC账号
重新拨号这个很好理解,就是在路由器操作断开WAN口连接后重新连接,那退出AC账号是怎么回事呢?
广西某211的校园网运营商宽带是设置了多设备共享检测设备的,就是臭名昭著的深信服,当检测到你的宽带账号超过2个设备使用后,会给你强行断网30分钟作为惩罚。说白了,就是不希望你买一个宽带账号然后分享给宿舍8个人一起用,好把每个人的钱都赚一遍。其实我也是想骂人的,我的电脑都不止两台了,我宿舍有三台电脑,而且经常是一起用,加上手机就是四个联网设备了,这就很扯了。不过,有一个好消息,疑似是运营商配置疏忽,又或许是必须这样配置,这个断网封禁是绑定在宽带账号上面的,并且由深信服进行操作。但是有一个神奇特性,那就是在AC的用户登录界面,点击注销会解除这一层绑定关系,解除网络封禁!这就给了我们操作的空间。不过需要注意的是,退出一次后,无法再次执行退出操作,退出后仍然可能会被共享网络封禁,这时只能断开连接重新拨号。并且,由于封禁和宽带账号绑定,如果没有过封禁时间的话,重连后也是封禁的,需要再次执行AC账号登出的操作。


至于上面是怎么发现的呢?因为封禁后给我重定向到的IP是1.1.1.2,有点上网常识的都会直接去掉URL后面的东西直接访问根目录看看是什么东西,结果出来了这个:
4.png
我乱点尝试,没想到点击注销后,网络恢复了,就发现了这个歪门邪道。
简单F12看个网络请求:
5.png
可以看到就是简单的一个get,URL长这样:http://1.1.1.2/ajaxlogout?_t=1788443433313,后面的那串数字每次都会不一样,查阅资料得知这是时间戳,在Python中可以用下面的方法获得同款:

ttt = int(round(time.time() * 1000))

拼接到基础URLhttp://1.1.1.2/ajaxlogout?_t=后面,利用requests模块发送get请求,轻松秒杀。

另外,默认访问是http而不是https,出于好奇,我尝试了https访问,结果出来了AC的管理登录界面:
6.png
哦,哑巴里,深信服!臭名昭著的深信服!!!


回到正题,既然已经了解了网络存在的特性,那利用特性就可以不断网了,具体的操作思路如下:

  • 利用Captive Portal检测网络是否被封禁,向产生响应204代码的HTTP接口(例如http://connect.rom.miui.com/generate_204)持续发送请求,如果请求的状态码从204变成了200或者302/301,说明被封禁断网。因为这个断网提示就是靠Captive Portal展示封禁信息的,需要劫持Captive Portal的HTTP请求进行重定向。我们可以利用这个特性判断网络是否被封禁。
  • 当检测到被封禁后,马上将AC账号退出,解除封禁,然后继续进行网络连通性检测。
  • 再次被封禁后,重新拨号连接,继续进行网络连通性检测,下一次封禁就按照上一点的方式处理。

说白了就是如果遇到网络被封禁的问题,后面这两点按顺序进行循环执行即可。
下面是我实际使用的程序,还是当年没有AI的时候纯手搓的:

import requests
import time
import datetime
import os

def test():
    headers = {
    'Host': 'connect.rom.miui.com',
    'User-Agent':'Mozilla/5.0 (Windows NT 6.3; Win64; x64; rv:91.0) Gecko/20100101 Firefox/91.0',
    'Accept': '*/*',
    'Accept-Language': 'zh-CN,en-US;q=0.7,en;q=0.3',
    'Accept-Encoding': 'gzip, deflate',
    'Connection': 'keep-alive',
    }
    try:
        res=requests.get('http://connect.rom.miui.com/generate_204',headers=headers)
    except:
        res='<Response [204]>'
    return res

def disconnect():
    data = {
    "wanid":"WAN1",
        "statu":"0"
        }
    resp = requests.post('http://172.16.0.1/router/wan_status_set.cgi', data=data,auth=('Chocola','www.nekopara.uk'))
    print(resp)
    print(resp.text)

def acout():
    ttt = int(round(time.time() * 1000))
    headers = {
    'Host': '1.1.1.2',
    'User-Agent':'Mozilla/5.0 (Windows NT 6.3; Win64; x64; rv:91.0) Gecko/20100101 Firefox/91.0',
    'Accept': '*/*',
    'Accept-Language': 'zh-CN,en-US;q=0.7,en;q=0.3',
    'Accept-Encoding': 'gzip, deflate',
    'Connection': 'keep-alive',
    'Referer':'http://1.1.1.2/index.htm'
    }
    logout='http://1.1.1.2/ajaxlogout?_t={}'.format(ttt)
    repp = requests.get(logout,headers=headers)
    print(repp)
    print(repp.text)


def getip():
    data={
    "uiname": "WAN1"
    }
    res=requests.post('http://172.16.0.1/router/interface_parame_show.cgi', data=data,auth=('Chocola','www.nekopara.uk'))
    backinfo=eval(res.text)
    return backinfo['ip']

count=0
ccc=0
current_IP=str(getip())#add

print("Programme start! IP Address:",current_IP)

while True:
    time.sleep(0.1)
    TTT=[datetime.datetime.now().weekday()+1,datetime.datetime.now().hour]
    
    if str(test()) != '<Response [204]>':
        ccc+=1
        print("At {}:{}:{} Lost Connect{}".format(datetime.datetime.now().hour,datetime.datetime.now().minute,datetime.datetime.now().second,ccc))
        if ccc==2:
            ccc=0
            
            if current_IP != str(getip()):
                current_IP = str(getip())
                count=0
                
            if count==0:
                count=1
                print("At {}:{}:{} Internet disconnect! Try logout AC".format(datetime.datetime.now().hour,datetime.datetime.now().minute,datetime.datetime.now().second))
                acout()
                time.sleep(10)
            else:
                count=0
                print("At {}:{}:{} Internet disconnect! Try reconnect".format(datetime.datetime.now().hour,datetime.datetime.now().minute,datetime.datetime.now().second))
                disconnect()
                time.sleep(1)
                while getip()=='0.0.0.0':
                    time.sleep(1)
                current_IP = str(getip())
                print('At {}:{}:{} Get PPPOE IP: {}'.format(datetime.datetime.now().hour,datetime.datetime.now().minute,datetime.datetime.now().second,getip()))

    else:
        ccc=0

如果要拿去用的话,重点要重新实现路由器重连的功能,另外还要适配实际的路由器内网地址。

避免封禁/减少封禁的方法

关于路由器共享设备上网检测相关的技术,已经有不少人有所研究,主要就是几个方式:

  • 设备时间戳检测:因为不同的电脑时间可能会存在一些差异,有一些连接协议通过时间戳来加密数据,当在目标IP的连接中检测到有两个以上时间戳,则可以断定为多设备共享上网。这个的解决方式比较简单,在路由器开启NTP授时服务器,并且让局域网内的设备NTP服务器设置为路由器,然后同步一次时间即可解决问题。这个我实测下来比较有效。
  • TTL检测:数据包的TTL每经过一个路由器,值都会减1,但是由于局域网内没有二级路由,所有设备经过路由器TTL都是-1,虽然Linux的TTL是64,Windows的是128,但是由于设置的阈值是超过两个设备封禁,一个设备是Linux系统一个设备是Windows系统也完全合理,检测端是分辨不出来的。这个可以忽略掉。
  • UA检测:这个是最棘手的,因为不同的设备,UA是不一样的。而且UA这个主要是出现在一些不使用TLS加密通信的软件上,例如QQ,而大部分的网站使用了HTTPS的,检测端是看不到UA的,因为被加密了。解决这个的办法有两个思路:1.让流量全部加密,就检测不出来了。最简单粗暴的方法是,就近买一个云服务器确保低延迟,然后把出口流量全部通过隧道转发到服务器上进行访问。但是这样会引入额外的网络延迟,而且云服务器的IP因为IP被标记为IDC的IP容易被各种风控针对。2.路由器端修改UA统一,但是可能会造成一些网页打开异常:因为有一些服务器是根据UA返回特定内容的。另外,这个实现的成本比较高,需要消耗路由器的大量算力,普通路由器撑不住。

我实际上只是落实了第一点,平时会存在封禁情况,但是问题不大,配合解封程序几乎可以做到第一次封禁解封无感知(当然,断开重连那次就有影响了),而且封禁的频率其实也不算高,有时候一周都看不到一次封禁。当然也有过一天封十几次的情况,但是很少。

另外,还有一个歪门邪道,是我自己实测验证过的:把上行带宽跑满或者接近跑满,反而会降低被封禁的概率。
推测其原理是,深信服的共享检测虽然会持续监控,但深度包检测和流量特征分析是比较消耗性能的。当你的账号持续产生大量加密的P2P上传流量,比如用qBittorrent做种热门资源时,检测系统可能会因为负载过高而降低对该账号的采样频率,或者被大量合法的上传流量“淹没”了多设备混合的特征,从而让你其他设备的上网流量“蒙混过关”。
当然,这么玩的前提是要在路由器上做好QoS限速,把做种机器的优先级拉到最低,并且在qBittorrent里设置好全局上传限速,保证日常上网的带宽余量充足。如果你平时需要大量上传带宽,比如传网盘、开直播,暂停一下做种就行,基本不影响正常体验。

不断网方法二:找老师的校园网账号

这个方法就很吃人情世故了,或者观察能力。
对比拨号上网,这个方法有一个优势,不需要和网络共享检测斗智斗勇,劣势是会和校园网一起波动,而且没有公网IP。
老师的校园网账号是不会断网的,而且根据学校校园网的说明,老师是可以登录三个设备的,这个是可以确定的,但是你能不能拿到老师的校园网账号就是一个问题了,获取的思路分两种:

  • 和老师搞好关系,大学的老师普遍都比较开放,特别是专业课老师,可以和老师混熟后借老师的校园网账号去用。
  • 在公共课老师上课的时候,想办法瞄到账号和密码,账号相对来说好瞄到,甚至可以光明正大看到,因为上课会开投影仪,重点是密码。这个取决于运气和观察能力,首先,不是每一次上课老师都会在教室电脑登录校园网账号;其次,这个手法成功的前提是老师没有更改过校园网账号的默认密码,默认密码是身份证后6位,和学生的做法是一样的。如果老师更改为复杂的密码,就算你上课坐到第一排最靠近老师的位置,也很难推断输入的密码是什么。但是,如果是没改过密码的纯数字,而且还是用小键盘输入的话,能推断出密码的可行性会比较高。而且,校园网登录是没有多次试错冷却或者锁定的,你可以推断多个可能的密码组合一个一个去尝试。

这个方法我感觉可行性比较低,特别是第二个方法,本身就是不太好的操作,我个人并不推荐。


以上就是广西大学宿舍校园网不断网的办法了,也不知道这篇文章发出去的话特性什么时候会被修,目前这个方法还是可以爽玩网络的,且玩且珍惜吧。不过都放在个人网站了,小破站应该是没人看的吧。。。

评论区 (0)