和校园网斗智斗勇的日子(第十辑)

刚来到学校的时候,初步探了探校园网,把网络整通,就写下了这个系列的第九辑。然而在过去一个月里面,校园网反复无常地变化,逐渐积累了一批问题。不得已,只能开个第十辑,继续写下来,作为记录。

该说不说,这校园网真的不仅仅能用垃圾二字来形容,倘若只是慢也就罢了,收费还贵,有些协议还不通,内网间歇性100%丢包,延迟抖动下不来,晚高峰更是卡顿到爆,开学一个月有半个月都在吐槽校园网,绝了。

黑线校园网,黄线去电脑,白线连AP,应该有朋友能猜到为什么这样接黑线校园网,黄线去电脑,白线连AP,应该有朋友能猜到为什么这样接

1. 前言

第十辑了,好耶。

其实也没好多少,既然标题写的是『斗智斗勇』,就说明每多一辑,校园网就多了一批糟心事,不论是内部的,外部的,还是玄学的,都算。既然上网已经成了现代人生活中不可或缺的一部分,那么当然,遇到问题了,还是先解决掉比较好。

2. 糟心的网

正式开始之前,先花点时间吐槽一下这个校园网到底有多垃圾。

2.1 超高价格,超低速度

校园网收费是包月30块钱,不限流量,也不断网。这个价格听起来还算可以,但问题在于,正如在第九辑里面所说的,速度只有60Mbps下行,15Mbps上行,即使是校内网互联,也只有200Mbps下,50Mbps上,这个速度就有些对不起他的价格了。遥想当年大专生活,有线接入,一样的价格,最后拿到的是400Mbps下100Mbps上,内网则是全时双向千兆,更别提三网分流做得还算好(不算完美,但还行),连接质量还是很不错的,怎么到了这个本科院校就成了这样呢?

此外就是老生常谈的话题了:没有IPv6。和之前大专一样,都是拿到了广东省IPv6部署优秀单位奖,名声响当当挂出来了,结果校内任何一个地方联网都无法访问IPv6(IPv6 NAT/NPT都没有),实在是令人笑掉大牙,也不知道这个奖是不是买来的。又或许网管中心那边也是一群老登导致的?反正到学校官网的网管中心分页查看,上面的资料内容还挂着老学校(目前这个学校在几年前曾经换过一次名字)的域名,点进去啥都看不到。

这个速度显然是人为地设置了非常低的限速,因为不论是通过无线还是有线接入,不论是我自己的电脑还是同学的电脑,基本上都是这个速度,导致要下载点什么(比如本地大模型,游戏更新)就要花上很长时间,以前在家里十分钟下完的,现在得下一个小时。也许学校想让我们在这段时间里面可以去参与一点别的社交,促进『线下感情』?那就不知道了。

2.2 抽象的认证系统

认证系统是Dr.COM(哆点)的,这个上次讲过。但问题在于,上个月25号,也就是中秋节,学校升级了一次认证系统,地址变了,这就导致原来的认证脚本完全失效,幸好只需要重新去浏览器里抓个包,抓成curl格式的,放入脚本,下次登录时重放一下就好了。

然而,那天下午,脚本重放的时候提示『参数不合法』,以为是脚本出了什么问题,尝试使用浏览器Web认证,结果提示信息也是一样的,都是『参数不合法』。更扯的是,Web端似乎没有针对这种情况做预备,点击登录按钮之后就直接卡死了,也不输出提示,再点就没有响应,需要自己去控制台里面抓包看结果,才知道到底发生了什么。

由于那天是中秋节,办公人员都放假了,因此网上自助报修平台肯定是没人处理的。幸好学校在登录认证界面留下了工程师的电话,挨个打过去问问吧。前两个打过去,电话铃响了很久都没人接,最后第三个才接通。沟通之后加上微信,把症状发过去,结果工程师也不知道怎么回事,只能先按规矩重置一下密码看看。说来也巧,将密码重置为身份证后六位(纯数字)之后,校园网就能登上去了,也能进自助平台改密码了。

为什么会出来参数不合法,具体原因笔者并不清楚,但有个很有趣的猜想,已知:

  • 升级后的认证系统,仍然是通过GET(JSONP)来发登录请求
  • 请求参数被HmacMD5处理,后端可能拿着明文
  • 自助修改密码界面,提示需要特殊符号,但禁用?、&符号
  • 笔者的密码使用密码管理器生成,包含其他特殊符号

也就是说,可能是因为密码里面有特殊符号,导致被系统误判为攻击,因而被拦截了。

算了,懒得和这个系统过多争斗,登上之后进去自助平台改密码吧。结果更抽象的事情还在后头:笔者因为用的是密码管理器,习惯性使用长密码,比如20位的。第一次修改是从身份证尾数后六位改成20位新密码,正常,但如果想进行第二次修改,那就不行了,因为旧密码最长只能输入16位!至于这个限制是单纯只有前端限制,还是前后端都有,那就不清楚了。跟工程师提了一嘴,他表示收到,但到现在都还没改。

翻阅校园墙,上面对于这个认证系统的抱怨似乎还不少,经常有说莫名其妙掉线的,校园墙上还有人(按他说法是,他不在校内)开发了校园网自动登录的软件。这个情况笔者这边倒是没有观察过,登录一次保底都能用十几二十天不掉线的(最近几次都是自己这边的问题导致下线,比如学校维修电路要停电,比如下面第4大节要说的网卡问题),所以笔者猜测,可能是因为终端设备在闲置状态下(或进入休眠状态后)发包数量太少甚至完全停发,导致被认证系统判定为设备已脱网,因而注销登录态。

2.3 内网丢包

如果说上面的都是人为因素为主,下面这个我就不能理解了。

校内网,两端有线,一侧还是学校上课的机房,这个情况下还能丢包,你敢信?而且他还不是均匀丢包,比如说ping校内设备,100个包丢十几个,这种还可以通过补偿算法什么的补回来。学校的丢包是这样的:畅通无阻一段时间,延迟1-2ms没啥毛病,突然间开始给你100%全量丢包,持续几秒到十几秒不等,不管你什么应用,什么协议,TCP还是UDP,只要是IP包,全丢。

这个现象根据上课机房的不同而有所不同,有的机房特别严重,有的机房偶尔出现,但基本上就没有不丢的。因为笔者在上课的时候习惯通过内网远程连接到自己的主机上,包括做作业和写报告都是用自己电脑来处理,像这样的丢包,轻则鼠标画面卡死,重则远程桌面断开,还得重新连接。通过控制变量法(有些老师上课也是用远程连接到他电脑)可以排查出来,这不是我自己设备的问题,而是这个校园网就这么垃圾。

而且,我不好说这丢包是怎么回事。远程桌面(Sunshine/Moonlight)用的是UDP,上下行可以看做是分离的,每次丢包都是鼠标先卡住(机房侧上行断开),画面过几秒才会卡住(机房侧下行断开)。于是当在教室里码字的时候,就有概率碰到一个很神奇的情况:按下键盘上的某个键,结果此时开始丢包,『松开按键』的包被丢了,视频流还在跑,于是你看见屏幕里迅速打出来很长的一串字符(他认为你按住没松开),直到彻底卡死,主机端的Sunshine才会松开按键。

具体的原因,不知道,怎么修,不清楚,凑合着用吧。

2.4 神秘出海质量

学校,是一个比较特殊的场景。一方面他体量很大,有一群人要上网,因此如果是拉线到校园网机房再认证分给学生,运营商一般不会选择在自己机房做CGNAT,而是直接划分多少多少个公网IPv4给你,你自己做地址池,再去NAT给人上网。这样一个IP能扛五位数的会话,不会受限于运营商的CGNAT设备,后者一般只给四位数,比如五六千左右。

一般情况下,包括在网络小故逝的第二集也提到,传统意义上带固定公网IP的,我们会把他叫做『专线』,价格肯定会比普通家用宽带贵,毕竟你有充足的上行带宽和更好的网络连接质量。然而对于学校的场景来说,学校里的学生显然也只是普通的互联网用户,日常上网流量特征是符合『大下行小上行』的特点的,此时如果就因为可以提供固定IP而去选择大带宽(却也大上行)的专线,那就不值当了。

基于此,笔者合理怀疑,学校采购的实际上是某种介于二者之间的SKU。我们都知道,对于to B产品来说,一切都是可以谈的,包括提供服务类型和具体细节(多大带宽,多少个IP,等等),甚至也包括价格(标价只是目录价),所以学校完全有能力和运营商谈,通过招标等方式,采购对应的大带宽非对称接入服务,比如定制10G下行,1G上行的口子,给你十几二十个IP,对端给你插城域网或者别的什么汇聚层。然而这里有个问题:这种定制的产品,理论上来说QoS等级也是可以定制的,比如说优先保证省内带宽,然后骨干带宽怎么怎么保证,国际带宽怎么怎么保证,可以另外谈。因此从理论上来说,最后采购到手的完全可以是『大号家宽』,也就是就带宽大了,IP多了,实际接入质量和家宽没有区别。

回到本节话题,之所以怀疑学校买的是这种线,原因就是,晚高峰出海质量差到爆炸。追踪发现,出口默认走的是电信,而跟同样是用省城电信的朋友交流后发现,这样的晚高峰质量很符合家庭宽带的表现,而不是一根专线该有的样子。因此每每到了晚上,看网页就是卡的,更别提看视频了,只能反复切换节点,试图规避掉单次会话流量累积之类可能存在的QoS统计手段。然而,正如笔者在跨网比赛那篇博文里提到的,这种事情除了加钱,很难完全避免。

2.5 HTTP 滚一边去

最近观察到一个很有趣的现象。在路由器上执行:


# curl -x "" -v a.b.c.d:22
# .....中间省略.....
< HTTP/1.0 302 Moved Temporarily
< Location: http://1.1.1.3/proxytool/remind.htm?url=http://a.b.c.d:22

很显然,22端口提供的是SSH服务,而非HTTP服务。然而此时curl收到了标准的302响应,指向了一个IP地址,展示一个网页。在浏览器里打开这个网页,可以看到如下内容:

这个网页样式,应该很多人都很熟悉这个网页样式,应该很多人都很熟悉

我们知道,1.1.1.3这个IP属于Cloudflare,却经常被用于各类非标内网的虚拟IP中。很显然,这是校内网的设备拦截了对外发起的任意HTTP通信,只要对方有TCP回包(即使不是合法HTTP响应),就可以劫持连接,并注入自己的内容。

这里的『使用代理工具访问网络』,具体指的是什么,就不清楚了,有可能是因为笔者插了小路由器来让自己的手机与电脑共享上网,也有可能指的是加密代理(大概率指的是前者),但只要是访问任意HTTP内容,都会弹出来这个界面。不过在6202年的今天来说,这个问题其实不太大了。他不阻断HTTPS,而主流站点基本上都支持了HTTPS,很少有HTTP的存在了,所以不影响正常上网。即使是Steam下载(笔者不玩Steam上的游戏)那种,通过明文HTTP+应用层加密的方式传输的,应该也有相应的回落措施。所以他弹他的,我上我的。

3. 动手折腾

上面的吐槽更多的是自己改变不了的事情。对于自己能改变的事情,这里单开一节。

3.1 连不上的 WireGuard

某日回到宿舍,发现上网极其缓慢,点击链接之后要等很久,网页才加载出来。同时,回家的链路也中断了,访问不了家里的任何服务。这两项业务的共同点是:他们都用到了WireGuard。回家的链路自然不用说,Tailscale就是基于WireGuard的,而普通的上网链路主要是DNS,通过WireGuard连接到广州的一台VPS上做远端解析,这样本地DNS审计就无法发现上了什么网站。

打开控制台,反复测试确定:学校定向屏蔽了WireGuard。不知道原因是什么,有可能是要管控VPN连接?其他常见VPN协议暂未测试,反正WireGuard肯定是连不上了,只能寻找替代品。

针对这两个不同的场景,自然是需要不同的解决方案。回家链路最好说,换用别的软件就好,于是笔者选择换成EasyTier,选他是因为能利用上他的QUIC/KCP模式,有效补偿学校的垃圾校园网链路质量,以及晚高峰时期电信-移动的跨网质量。至于上网DNS,一方面是往ADGuard Home里面添加了两个基于IP的DoH作为备份,另一方面,通过wg-obfuscator这个项目,给现成的WireGuard连接外面套了一层混淆——有一点就行了,不用太多,学校的屏蔽还是比较弱的。

反正以上两个措施做完,连接就恢复正常了。

3.2 网管~ USB网卡死机啦~

第九辑里面提到,连接校园网的上联口eth1,是直通进去VM的一个USB网卡。当时一切都好,然而前几天,在教室里愉快地远程连接电脑时,却忽然连接全断。一开始还以为是又丢包了,但等了很久也没见回复。后来又怀疑宿舍是不是又停电了(前几天停过一次),或者校园网账号是不是被封了,一番求证之后发现都没有,这才怀疑是不是路由器的锅。

下课后回到宿舍,打开路由器VM的控制台,敲dmesg,果然发现了问题:

# dmesg
.....
[410915.314481] ax88179_178a 10-1:1.0 eth1: NETDEV WATCHDOG: CPU: 0: transmit queue 0 timed out 5004 ms
[411072.355688] ax88179_178a 10-1:1.0 eth1: NETDEV WATCHDOG: CPU: 0: transmit queue 0 timed out 5728 ms
[411156.290050] ax88179_178a 10-1:1.0 eth1: NETDEV WATCHDOG: CPU: 0: transmit queue 0 timed out 5184 ms
.....

出现这样的消息,说明驱动在向网卡发送帧的时候,网卡超时未响应,说人话就是网卡死机了。尝试手动执行ifdown && ifup之后,网卡能重新上线。但显然,不知道下一次出故障是什么时候,会不会刚上课就又死机了,因此必须要换一个更加稳定的方案。

跑PVE的NUC只有一个板载千兆口,稳定性很好,但数量肯定不够。想要实现路由器功能,一个比较好的方法就是配合网管交换机的VLAN功能来开逻辑接口,也就是俗称的单臂路由。关于单臂路由,网上很多朋友都做过,其实也是一个很不错的折衷方案,因为现在常见的千兆网口都是全双工模式,在双向上都可以跑满千兆,所以日常上网场景,最高速度并不会对半砍(当然肯定是没办法一边大量上传一边大量下载了,不过对普通上网用户来说无妨)。

传统的方案下,交换机上的某一个口(例如5号口)会设置为Trunk模式,其他接口(例如1-4口)设置为Access模式,再把5号口连接到路由器上,里面开逻辑接口,就可以区分各个物理接口的流量了。然而这种玩法有个缺点:在拔掉网管交换机的情况下,如果物理接口没有配置IP(而是把IP配在了某个VLAN接口上),那么通常就不能敲IP连上设备了,因为终端设备一般发出的是无标签(Untagged)流量,无法匹配VLAN接口,自然也就无法访问到对应IP。

因此,笔者对其略作修改,换成了一个更稳健的做法。具体来说,需要一台支持单独给端口配置Tagged/Untagged的交换机(低端Mercury/TP-Link一般都支持),或者支持Hybrid接口的应该也行,笔者这里选用的是水星SG105 Pro。假设我们将1口作为WAN口,2-3口作为其他用途,4口作为LAN口,5口连接PVE小主机,就可以进入交换机设置页面,将其设置成类似这样的模式:

请根据交换机说明书来设置请根据交换机说明书来设置

注意,作为LAN的4号口与连接PVE的5号口共享一个PVID 40,且此时5号口同时跑了Tagged和Untagged流量,也就是处于Hybrid模式。

这样配置后,当WAN口的未打标签流量从1号口进入时,就会被交换机打上VLAN 10,带着标签从5号口原封不动送出;而当LAN的未打标签流量从4号口送入时,交换机虽然也会打上VLAN 40标签,但在从5号口送出前,因为5号口配置了Untagged,因此标签会被剥离,PVE收到的实际上就是原来的未打标签流量,其效果和直接插网线/通过傻瓜交换机访问PVE是一样的。与此同时,当带有VLAN 10标签的流量从PVE送出时,交换机会将其转发到1号口,剥离标签后送出到上游校园网;而当未打标签流量从PVE送出时,就会被打上5号口的PVID 40,然后匹配转发到4号口,剥离标签后送出到LAN设备。

这样一来就实现了我们的目标:在网管交换机故障等场景下,直接通过傻瓜交换机或者直插网线,即使不配置终端发出Tagged流量,都可以保证与PVE(以及里面的路由器VM的LAN口)不断连。至于这种情况下不能上网那都是小事了,可以慢慢修。

除了交换机要配置好之外,PVE也需要略微调整。电脑插入交换机4号口,访问管理IP,进入PVE WebUI,导航到节点的系统——网络标签页。默认情况下,PVE有一个主网桥vmbr0,点击编辑,打开里面的VLAN感知开关,然后应用设置。

绝大多数情况下,打开这个设置不用担心与PVE失联绝大多数情况下,打开这个设置不用担心与PVE失联

接着,进入路由器VM的硬件选项卡,在原来的USB网卡已经移除后,选择新增——网络设备,在弹出的窗口中,选择桥接到vmbr0,并在VLAN ID中填入10,也就是VM在这张网卡上发出的包会被自动打上VLAN 10的标签,对应到网管交换机的1号口。至于MAC地址,笔者这里直接填入了原来USB网卡的MAC地址,方便在校园网设备上混个脸熟,不过校内似乎没有开启无感知认证,因此其实无所谓。

左上角是编辑,因为截图是直接截的现有网卡,这个不影响左上角是编辑,因为截图是直接截的现有网卡,这个不影响

如此配置后,进入路由器控制台,会发现新加的接口继续编号为eth1,正好接替了原来的USB网卡,原来配置好的软件都不用动。在交换机1号口插上校园网网线,路由器就会自动DHCP拿地址,最后跑一下认证脚本,就可以上网了。

和之前的USB网卡相比,这个方案的稳定性自然是大大提升的,虽然理论上来说增加逻辑接口会让速度略有下降,但反正校园网也跑不满千兆,因此也就无所谓了。

5. 写在最后

好了,暂时先折腾到这里。

其实很多情况下,网络都是越稳定越好的。站上曾经写过几篇文章介绍笔者的杏泉网络,但现在不发了,主要就是因为网络平稳运行,实在是没什么好写的了。希望这次折腾过后,校园网也能稳定使用吧。

(完)


木头箱子脆脆,但是这样正好

如无特殊声明,本站内容遵循 CC BY-NC-SA 4.0 协议

转载请注明出处并保留作者信息,谢谢!

本站由 搬瓦工VPS 强力驱动

none
最后修改于:2026年10月11日 23:04

已有 6 条评论

  1. 天呐🤣老大是真的厉害!网络这一块,体系之大,一直没下决心来完整啃过。之前在服务器折腾网络,折腾废了最后只能求教AI。老大还是太强了!

    1. 不敢当不敢当,都是一路折腾研究过来的

  2. 我这网太烂了,路由器上弄了个自动登录然后就摆了,多拨提速根本弄不起来

    1. 我这边也差不多,烂得要死,能保持不断线就很幸运了

  3. 哈哈哈校园网不敢动,怕找上门!

    1. 有外置VPN网关(和家里的链路)的需求嘛,顺便做了上网。是这样的,反正个人安分点就行,要是用这个方法去带整个宿舍,甚至是整层楼的上网,那没办法,包查的。

添加新评论

提醒:『评论回复邮件提醒』功能正在测试中
评论后,如果站长有回复,会有邮件通知