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

哇,第11辑了,在建立这个专辑之初,根本没想到能写这么多。

今天是11/09,又到了一年一度广东入冬的时候,外面开始刮大风,气温也下降。虽然过几天(也就是本周末)还是会重回30℃,但其实也持续不了多久了,之后的气温还是会相对较低的。所以一时高兴,干脆把本文给更了算了,反正不是很长,权当折腾记录吧。

这是本文的主角之一这是本文的主角之一

1. 前言

关于这个校园网有多垃圾,已经在上一期里面提到过。友人曾经劝我说,让我整个流量卡用,但可惜流量卡也不是良药,笔者的手机副卡槽插的就是流量卡(还是正规号卡),然而一到高峰期,连接质量其实真的能和校园网打得有来有回。因为校内基站不多,大家都在挤的时候,不论是空口质量还是基站上联口,承受的压力都会很大,原本畅快的体验也就随之消失了。

所以,在可预见的将来,笔者还是会选择当校园网钉子户,毕竟再烂能烂到哪去呢。于是这就自然地引出了一个问题:既然我付钱了,那当然要充分利用才对,不然就显得很亏了。所以在目前基本稳定的情况下,本文主要聚焦的还是如何尽可能提升使用质量。

2. 十八般武艺

2.1 多拨加速

我们都知道,校园网一般都是有设备数限制的,但目前这个学校不仅如此,还会限制你的设备类型:同时只能有一个PC和一个移动设备连上,再多,就要踢掉之前的设备了。由于一些隐私保护措施(例如加密DNS)只有路由器上有安装,本着多一事不如少一事的原则,笔者长期以来都只在电脑上(通过小路由器)使用校园网,手机在校内的时候要么也连小路由器,要么就干脆用流量,很少会直连校园网。

某天,看着校园网账号上这个空着的移动端槽位,感觉付了钱不用,好像有些亏。校园墙上倒是有不少人合租校园网的,车找人和人找车都有,就是一个人用电脑端,另一个人用手机端,费用对半分,甚至还有按天出租的。仔细想想,虽然拿去卖钱也能回点本,但安全性不足,所以还不如想办法让两个槽位都给自己用,岂不美哉?很自然的,我们就想到了双拨加速,也就是让两条线路同时承担上网流量,实现速度翻倍的效果。

2.1.1 技术栈选型

因为之前提到,校园网账号有限速(60下,10上),而这个限速是按槽位进行的,也就是说只要登录两个账号,就可以视为两个设备,分别占有两个槽位,分别获得60/10Mbps的带宽,加起来正好就是120/20Mbps。

这里我们采用ECMP(等价多路径路由)这种三层负载均衡方法,并且启动L4 Hashing,也就是针对五元组来决定走哪个接口。显然,这种方法兼容性很好,数据包出来可以直接上公网,而且对多线程下载来说提速是很显著的。但需要注意:ECMP对单线程应用(例如开单条TCP连接下东西)就无能为力了,因为常见的TCP流量没办法劈开到不同链路上传输,除非改用MPTCP,或者更为底层的链路聚合,但这又要求对端有设备接收这种特殊流量(MPTCP是专用的聚合服务器,需要另外花钱,链路聚合是要有配置正确的交换机),不适合我们的场景。另外,理论上来说,这种负载均衡的方式会让你的IP(在不同应用访问时)漂移,不过考虑到校园网NAT出口本来就是在一个大池子里漂移,所以也就无所谓了。

ECMP需要有多个接口,换句话说,我们需要将校园网账号的另一个槽位映射到某个接口上。这个接口不一定是物理口,虚拟口也是可以的,因此这里我们请出MACVLAN,就是你玩Docker时候可能会碰到的那个,来实现我们的需求。MACVLAN可以在一个物理网口上虚拟多个逻辑网口,分别拥有不同的MAC地址,在对端看来,这就像是一台交换机下挂了不同设备,因此DHCP会分配不同IP,认证系统也会将其视为新设备。

另外,我们还需要让校园网认证系统认为我们连入的是移动终端。老实说,笔者也不知道他具体是怎么识别的,只是看校园墙上有人抱怨平板被识别为PC,或平板被识别为移动端(对,两者都有人抱怨),所以推测是登录页根据UA返回对应信息,甚至是前端js根据屏幕宽度来判定设备类型。所以反正最后的解决办法是:Chrome开DevTool里模拟手机的模式,填写对应的移动端UA,来抓取登录请求为curl形式,看着登录参数不太一样,就认为这确实是识别到移动端了。反正也能用。

2.1.2 具体实施

路由器跑的是Debian 13。首先需要进行一些必要设置:

# 获取ROOT权限,以下不再重复
sudo -i

# 打开ECMP L4 Hashing
echo "net.ipv4.fib_multipath_hash_policy=1" >> /etc/sysctl.d/99custom.conf
# 使其根据邻居状态来决定是否分担流量
# 可以防止断线后流量空洞
echo "net.ipv4.fib_multipath_use_neigh=1" >> /etc/sysctl.d/99custom.conf
# 顺便把RP_Filter也调成松散模式
# 建议针对具体网卡也进行设置
echo "net.ipv4.conf.all.rp_filter=2" >> /etc/sysctl.d/99custom.conf
# 记得保存
sysctl --system

然后,开启一个新的虚拟网口承接流量。由于原来的上联口是eth1,因此下面就在eth1开(和物理口业务不冲突),请记得替换为自己对应的上联口。

# 添加新的MACVLAN接口
# 如果需要固定MAC地址(例如,模仿移动端大厂的MAC)
# 请添加address <MAC>参数
ip link add link eth1 macv0 type macvlan

# 启动接口
ip link set macv0 up

# 并给他分配地址
dhcpcd macv0

完成后执行ip a,应该能看到新增的MACVLAN网口,同时应获取到了一个不同的IP地址,在此接口上登录校园网即可(curl 需要指定一下接口)。

接着需要配置ECMP,笔者将其写成了一个脚本,方便按需启用

#!/bin/bash

echo "获取接口信息..."
PC_IP=$(ip -4 addr show dev eth1 | grep -oP '(?<=inet )\d+(\.\d+){3}')
PC_GATEWAY=$(ip route show dev eth1 | grep default | awk '{print $3}')

MOBILE_IP=$(ip -4 addr show dev macv0 | grep -oP '(?<=inet )\d+(\.\d+){3}')
MOBILE_GATEWAY=$(ip route show dev macv0 | grep default | awk '{print $3}')

echo "设置ECMP..."
ip route del default

ip route add default \
    nexthop via $PC_GATEWAY dev eth1 weight 1 \
    nexthop via $MOBILE_GATEWAY dev macv0 weight 1

echo "设置移动端TTL"
iptables -t mangle -I POSTROUTING -o macv0 -j TTL --ttl-set 64

echo "设置NAT..."
iptables -t nat -I POSTROUTING -s <你的内网网段> -o macv0 -j MASQUERADE

echo "设置源入源出..."
ip route flush table 100
ip route flush table 200
ip route add default via $PC_GATEWAY dev eth1 table 100
ip route add default via $MOBILE_GATEWAY dev macv0 table 200

ip rule add from $PC_IP table 100 priority 100
ip rule add from $MOBILE_IP table 200 priority 200

同样的,还有对应的关闭脚本,方便在不需要时一键关闭。限于篇幅就不贴上来了,根据以上的步骤倒着执行相反操作就行,或者问问大模型,让他帮你写一个。

最后执行上面的启动脚本,链路就搭建好了。

2.1.3 效果测试

最直观的结果就是启动多线程下载,或者去支持多线程的测速站:

这里走的是笔者的香港出口,可以看到速度已经叠加这里走的是笔者的香港出口,可以看到速度已经叠加

但对于一般的下载而言,比如米游更新,比如浏览器下东西,这种典型的单线程单连接下载,也就没有提速作用了。

启动器自带的是单线程下载,这对于商业服务来说是合理的启动器自带的是单线程下载,这对于商业服务来说是合理的

所以双拨提速的效果,只能说聊胜于无吧,可能就是偶尔下点大东西的时候,可以用下载器开两个线程进行高速下载。

2.2 五三大法

在校内,手机虽然经常用流量,但偶尔想看看视频的时候还是觉得流量可能不太够(虽然每个月都用不完),又因为移动端槽位已经被拿去做双拨加速,所以手机也不好继续登校园网。理想状态下,当然是先让流量绕一圈宿舍路由器再出去,但目前这里的校园网,在不认证的情况下也是无法访问内网的,所以为了方便起见,此时就要用上校园网经典操作之五三大法了。

这个方法由来已久,核心思想就是,校园网认证系统在不登录状态下,为了保持DNS正常解析和DHCP正常下发,53/67/68这三个端口的UDP协议一般来说都是放行的,而且在大多数情况下不会在意这些端口上跑的流量类型。因此我们只需要找到某种基于UDP的隧道协议(例如WireGuard,OpenVPN-UDP,或者应用层的KCP,QUIC等),把上网流量封装进去,就可以传输了。

早年间这种方法被很多人用于白嫖校园网(走53端口连接到校外的服务器,或者到校内免认证的机器上,实现免登录上网,自然也就免缴费),但这种做法一来不算合法,二来学校也不是吃白饭的,由于DNS服务器可以在校内搭建缓存DNS,DHCP也不需要到校外进行,因此在出公网的网关上可以很自然地阻断掉这些端口的流量,白嫖方法也就随之失效了(还有另一个原因是,公网服务器越来越难开53端口,这个也是需要单独备案的,68端口好像没什么说法)。不过,我们这里的目的只是实现校内互联,而且该交的费用也交了,对端挂的也是我自己的账号,因此合法性没有太大问题,学校也就懒得管了,53端口畅行无阻,给了我们折腾的空间。

这里采用的协议是WireGuard,因为他比较方便:路由器上本来就有一个用来平时在机房上课时远程自己电脑的WireGuard,监听在3960端口,因此只需要把53端口的流量转过去就行了:

# 上面配置了源入源出,因此这条命令可以正常工作
iptables -t nat -I PREROUTING \
    -i eth1 -p udp --dport 53 \
    -j REDIRECT --to-ports 3960

移动端只需要在WireGuard客户端里填入对应的连接信息,就可以随时随地享受宿舍网络服务(记得关掉流量,不然系统不会把流量导向一个不能上网的接口,WireGuard也就连不上)。需要注意的是,移动端(至少iOS端是如此)一般情况下起不了两个VPN接口,因此如果此时还有访问加密代理的需求,就只能在路由器上想办法,让WireGuard接口出来的流量走一趟分流和代理了。

3. 关于如何不掉线的杂谈

最后这部分属于杂谈。

校园墙上经常有人说移动端一天能掉线个十几次,笔者观察了一下,基本上都是iOS设备为主。考虑到认证系统靠MAC识别设备(所以上面可以开MACVLAN来伪装设备),因此怀疑是否会和轮换MAC(也就是所谓的隐私MAC,安卓苹果都有)有关。询问友人得知,iOS设备的轮换频率其实挺高的,且取决于同一局域网下设备的多少,据说是设备越多轮换越快,甚至有平均轮换时长十分钟一次的极端情况,因此校园网掉线也是家常便饭了。

不过,似乎一个MAC地址长时间不产生活动数据(例如电脑关机或休眠/睡眠),也会导致认证网关将终端踢下线。这个倒是正常操作,毕竟以太网是无连接的,网关主动探测(不论是ICMP还是别的什么)又不一定准确,只能通过这种方式来判断终端是否还活着,考虑到现在终端设备即使是静默熄屏状态下也会产生一定量数据包,因此这种判断方法还是比较准确的。同样,我们也可以逆向思维:只要一个接口有活动,就不会被认证网关判断下线而踢掉认证。笔者的路由器就是这样的一个例子,上面跑了一群服务,例如EasyTier和DDNS,本身就会产生一定量的网络包,再加上电脑关了还有手机连着,所以24x7不间断有包发出,认证网关也就不会踢人。

对于一个独立设备来说,尤其是上面说的休眠后的电脑,就没有什么好办法了。校园墙上有其他大佬写了休眠唤醒后自动触发认证的软件,笔者没用过,不知道效果如何。

一直不掉线的好处其实没啥,而且自助平台里也没有上网时长排行榜,否则还可以刷刷榜单。不过近来发现,认证系统是在用户认证上线的时候检查一次上网套餐的有效性和到期时间,之后就能上网了,直到掉线为止,所以....?

4. 写在最后

幸好,目前暂时没有什么太多需要折腾的东西了。除非学校网关又闲着没事干折腾什么新玩意,不然目前的系统足够日常使用,也就不怎么需要动他了。

(完)


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

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

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

本站由 搬瓦工VPS 强力驱动

none
最后修改于:2026年11月09日 17:12

添加新评论

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