和校园网斗智斗勇的日子(第九辑)
两年了,我去,时间过得真快。这个系列的第八辑已经是很久之前的事情了,当然前面其实还有另外七集,不过因为那都是老学校的情况,和本文已经没有太大关系,因此不再放出目录,感兴趣的朋友可以到第八辑的页面查看。
专升本进入新学校,连上校园网,自然是要重新再给这个系列加一篇文章的了,同时也是给长久没动静的网络分类上上新。
三天前的第一顿饭,黄芽白和酱鸭,9块钱,先干为敬1. 前言
专升本成功一半,现在已经正式进入本科学校就读。时隔一年回到020,似乎很多东西都有大变化,比如说地铁线路又新开通了几条,比如说又有什么新工程开工了。不过,这对我来说都没有太大的关系,学校所处的地方较为偏僻,尤其是离地铁站也很远,平日里难得到外面去转转,只能呆在学校里,该干啥干啥。
经过几天的观察和适应之后,更加确定了这一点。不知道是因为好审批还是怎么的,学校可以说完全就是建在山上,校园内马路到处都是上坡下坡,一不小心还能压死了二百多。从宿舍去教室,尚可骑骑自行车,但要从任意地方去食堂,不好意嘻,请下车推行,因为根本骑不上坡,或者下坡刹不住车。当吃饭这种事情都变得麻烦的时候,校内的外卖自然也就非常流行了。尤其是,比如说,上午或者下午没课,很多人根本不想到宿舍外,干脆点个校内外卖,他能直接送到宿舍楼下,甚至直接送到宿舍门前,不得不说是非常方便了。
当然,笔者其实并没有点外卖的习惯,在之前小城大梦里就有提过,我甚至连美团都没有下载,如果让我去吃饭,我还是更喜欢去现场吃热乎的。
扯远了。总之,在进入新学校的新鲜劲过去之后,余下的就是各种麻烦事了,这当然包括校园网。
2. 环境初检查
校园网提供了自助服务系统,从上面提示来看,具体来说,用的是Dr.COM的系统,而且曾经用过802.1x,不知从何时起转为现在的Web Portal认证:
802.1x兼容性理论上很好,实际嘛...就目前来看,Web Portal认证是比较折中的方式,比客户端认证侵入要小(至少不能检测到你有多网卡),也比PPPoE/纯L2TP认证要更能实现移动端适配。至于802.1x,我能查到的说法是,这玩意虽然是『标准』,但他的兼容性有些一言难尽。作为类比,好比如IKEv2,虽然大家都叫这个名字,但愣是不能互联,揭开盖子一看,EAP方式不同的,加密填充不同的,分片处理方式不同的....反正就是一堆乱七八糟的事情,让你用不舒服。
联网还是经典的DHCP,插墙上有线口上网后,分配10.25.x.y/24地址,访问任意网站均能跳转到认证页面。然而,学校用的这一套系统同样有些一言难尽,这在下面3.2还会继续提,但简单来说就是,他在用GET请求来登录,密码就放在Query String里。就,我不知道厂家在想什么,他们认为这是幂等的操作吗?还是说登录操作可供缓存?或者密码暴露在路径里也没事?
至于测速,只能说老学校的畅快上网体验(400Mbps下,100Mbps上)已经一去不复返了,新学校直接砍了到十分之一,也就是约50Mbps下,15Mbps上,对于日常浏览来说问题不大,但要是下载什么东西(比如游戏更新),那就只能慢慢等了。对于内网传输来说,情况也不容乐观,似乎被人为限制在了200Mbps下,50Mbps上,因此即使是到内网资源站(恐怕并没有这种东西)下资源,速度也很难看,不过远程桌面还是没问题的。
出口节点是广州电信出口方面,学校只有三个出口:电信,联通,教育网。对于无法直连的网络,比如移动和海外,就统一走电信出口。这在早年间似乎是一个很好的选择,毕竟电信的网络基础设施还是没问题的,但到了2026年,尤其是读过跨网比赛一文的读者都知道,这个直觉已经不太适用。比如,笔者家里的网络是移动,因此到了晚高峰的时候,这种跨网流量就开始玩QQ农场了,QoS的Q。
不用看了,经典的『IPv6建设优秀单位没有IPv6』终端方面,还是经典地只分配了两个终端的槽位,也就是一个PC和一个手机(甚至后台还能用不知道什么方式来知道你连接的是PC还是手机,TTL?),这对于笔者来说显然是不太够用也不太方便的。虽然并不打算把账号分享出去,但依然要想办法略微过一下这个限制。
3. 安装一个路由器
还有什么东西是比路由器(严格来说,是NAT网关)更能过限制的呢?
3.1 系统选择
对于我们的需求来说,需要的是软路由。聊到软路由,可能很多朋友会想到用OpenWRT,pfSense,爱快之类的,但这些笔者都没有选择,而是选择安装纯净的Debian 13,再把他改造为路由器系统。至于硬件,还是那台NUC,i5-6260U(2C4T),24G内存,256G SSD,跑点东西还是很舒服的。
故事的起因其实在本系列的第三辑已经说过了,基本上就是Debian算是『正经的』发行版,而OpenWRT之类的不是,他精简了很多东西,而且软件源内可能还没有这些东西,这就导致在安装某些东西(尤其是编译安装,尤其是网卡驱动)的时候会被卡住。另外,现在电力供应也已经比较稳定,很少出现突然掉电的情况,因此OpenWRT那样的不可变发行版作用并不算太大,再加上人在旁边,出事了也能救回来,所以可以放心地使用Debian顶上。
当然,并不是直接在机器上面安装Debian。以前确实是这么玩的,但现在稍微改变一下,先安装Proxmox VE,再在里面开虚拟机,直通USB网卡(机器只有一个网口)进去,把这个VM作为路由器。目前只有一个VM,但等以后有空了,上面还可以跑点小容器来用。
PVE 9.2.2现在的新版PVE,直通USB设备已经很舒服了,设置页面里面可以直接选择按ID映射,还是列表选择,不用再像以前那样先用lsusb去看ID了。插上网卡,机器就能识别到,然后直接选择把卡直通进去虚拟机就行。
这里的『中介设备』英文是『Use Mapped device』,不知道有何用安装好之后,直通进去的USB网卡作为WAN口,编号eth1(关掉了系统的可预测的网络接口命名规则),接在PVE网桥上的就是LAN口,编号eth0,网段10.1.1.0/24。因为学校只有一个接入口,晚上也不断网,因此不折腾WAN侧的VLAN接口了,直接上就行。
3.2 安全接入校园网
要想让他接入校园网并实现网络共享,主要是得解决三个问题:认证,NAT,防DPI。
先做认证。因为是Web Portal,基本思路是直接用浏览器打开认证页面,填写账号信息,并调出DevTool,抓取账号登录瞬间发出的请求即可。不过,在实操过程中可能没有那么简单,因为不确定是否有动态令牌之类的东西,导致不能简单地重放请求实现认证,这就需要仔细观察并分析前端代码了。笔者所在的学校似乎还比较单纯(而且考虑到这玩意还用GET发登录请求,估计别的方面也不会有太大的安全性),直接将发出的请求保存为curl格式,稍作整理,就可以在路由器上重放请求来实现认证了。
# 登录网络
# 注意不能换网卡,因为他还得看你MAC地址
# 末尾的v=4788有些在意,但目前没发现问题
curl --url 'http://10.*.*.*:***/eportal/?c=Portal&a=login&callback=dr1003&login_method=1&user_account=*****&user_password=*******&wlan_user_ip=*******&wlan_user_ipv6=&wlan_user_mac=*******&wlan_ac_ip=*******&wlan_ac_name=&jsVersion=3.3.2&v=4788' \
-H 'Accept: */*' \
-H 'Accept-Language: zh-CN,zh;q=0.9,en;q=0.8' \
-H 'DNT: 1' \
-H 'Proxy-Connection: keep-alive' \
-H 'Referer: http://10.*.*.*/' \
-H 'User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/151.0.0.0 Safari/537.36' \
--insecure成功登录后,系统会将网卡的MAC记录下来,实现无感认证,因此不必经常运行登录代码。
然后是NAT,这个并没有什么好说的,限制一下NAT的范围就行
iptables -t nat -I POSTROUTING -s 10.1.1.0/24 -o eth1 -j MASQUERADE最后就是防DPI。因为这玩意对于用户来说是黑箱,不知道是怎么实现的,因此只能一边猜一边实现,即使尽力而为也可能有遗漏,不过总比没有好。
# 劫持标准DNS查询
iptables -t nat -I PREROUTING -i eth0 -p udp ! -d 10.1.1.233 --dport 53 -j DNAT --to 10.1.1.233 # 劫持 DNS TCP 53
iptables -t nat -I PREROUTING -i eth0 -p tcp ! -d 10.1.1.233 --dport 53 -j DNAT --to 10.1.1.233 # 劫持 DNS UDP 53
# 劫持NTP
iptables -t nat -I PREROUTING -i eth0 -p udp ! -d 10.1.1.233 --dport 123 -j DNAT --to 10.1.1.233
# 改写TTL为128,模拟Windows网络直出
iptables -t mangle -I POSTROUTING -j TTL --ttl-set 128
以前还会再加一个UA3F之类的东西,对指定端口(比如80、8080)上的HTTP流量进行UA改写,但考虑到目前HTTP流量已经较少,所以暂时不动他,观察到确有此类行为再说吧。
3.3 联网三剑客
这里的三剑客指的是NAT,DNS和DHCP。NAT上面搞定了,接下来搞下面两项。
理论上来说,这俩事可以用一个DNSMasq搞定,但其实DNS有个更好的选择:直接上ADGuard Home,一方面作为DNS缓存,另一方面还能去去广告。
# 下载并安装
cd /etc/adguardHome/
wget <下载地址>
chmod +x AdGuardHome
./AdGuardHome -s install
# 他默认监听80作为Web配置页面,这里需要换个端口
# 避免和后续步骤冲突
nano AdGuardHome.yaml
systemctl restart AdGuardHome
systemctl enable AdGuardHome配好AdGuard Home之后,记得修改一下本机的resolv.conf,里面把本机的DNS服务器设置为127.0.0.1。由于各种软件都会插一脚,覆写掉这个文件。由于懒得排查,笔者这里采用笨方法,改完文件后直接chattr +i,禁止任何人修改。
关于上游DNS,已经有现成的DoV系统,重新装上就行了,速度快,也不怕近端隐私泄露。同时这一步也顺便把WireGuard装上,方便下面使用。
DHCP就交给DNSMasq了,apt直接安装就好,主要是写一写配置文件
# nano /etc/dnsmasq.conf
# 关闭自带的DNS服务
port=0
# 设置DHCP选项
dhcp-range=10.1.1.100,10.1.1.200,255.255.255.0,12h
dhcp-option=option:router,10.1.1.233
dhcp-option=option:dns-server,10.1.1.233
dhcp-authoritative
# 给自己的电脑固定分一个地址
dhcp-host=DE:AD:BE:EF:CA:FE,10.1.1.11,pc
保存后重启即可。
此时,LAN口下挂的设备已经可以正常上网了。接下来就是接交换机,拉网线,装一个AP模式的无线路由器供手机上网,这些都是很轻松的工作了。
3.4 回家的路
家里还有台PVE老母鸡跑着呢,上面还挂着硬盘,因此回家也是一件很重要的事情。这里依然使用Tailscale,连接到自己部署的Headscale。UDP QoS的情况不算太严重,这种玩法还是可以的。
安装过程本身没有什么太值得说的地方,主要是碰到了一个坑:登录启动后,路由器就失联了,下面的设备也不能正常上网了。通过PVE控制台进去(这就是虚拟机的好处)检查发现,路由器与下游LAN断开了,关掉Tailscale之后又能恢复正常。
原因其实很简单:为了正确访问家里的网段,也为了让家里能正常访问宿舍,Tailscale打开了接受外部路由和推送本机网段的选项;与此同时,远端的Headscale上有一条路由条目,是以前的路由器推送的,网段正好和当前的LAN网段一致;又同时,Tailscale添加的路由表,优先级似乎比较高。因此,当本机的Tailscale启动后,就会添加老路由留下的同一网段,导致原本应该直接发往LAN口的流量被发到了不存在的远端,表现出来的就是断联了。
问题解决方案也很简单,登上远端,删掉那条路由就行。
3.5 Wake on Lan
为了方便使用,自己的主力机已经启用了WoL,因此在路由器上也装一个WoL唤醒器,有需要的时候SSH连上路由器,唤醒主机就行了,不必一直开着主机。
apt install etherwake
# 写个小脚本,内置方便命令
# 主要是调用etherwake去在指定网口唤醒指定MAC
nano wakePC
chmod +x wakePC3.6 校内安全连接
内网不通的学校不是好学校。在教室的时候,是可以直接敲IP连接到这个路由器上面的。不过考虑到网内有防火墙(比如屏蔽445端口,免得SMB病毒横向移动),以及为了保持连接IP不变,因此外面可以再套一层WireGuard。
关于如何搭建WireGuard实现安全访问,网上已经有很多教程了,具体配置也很简单,这里就不再赘述。不过,笔者有个很有趣的问题:对于如下的网络结构,在教室可以正常访问宿舍路由器,宿舍路由器可以正常访问家里的路由器,那么你认为,在教室可以正常访问家里的路由器吗?
教室(VPN = 10.8.0.2)
|
| (交换了路由)
|
宿舍(VPN = 10.8.0.1,LAN = 10.1.1.233)
|
| (Tailscale)
|
家(LAN = 10.0.0.233)答案是:不能。虽然他们看起来好像是相互交换了路由,但注意,教室和家并没有交换路由,在家里的路由器看来,源地址是10.8.0.2,但家里的路由器并没有通往这个网段的路由,只能转发到默认网关,也就是公网运营商,自然也就被丢包了。
要解决这个问题,可以有两个办法:要么就是在家里的路由器上添加一条去10.8.0.0/24的路由;要么在宿舍路由上,针对『源地址10.8.0.0/24,目的地址10.0.0.0/24』的数据包做NAT。因为打通链路的是Tailscale,添加路由略显麻烦,再加上一般都是从教室主动访问家,而不是反过来,因此这里选择第二个方案,也能使用。
3.7 方便导航站
既然校内网是通的,那么也不能白瞎。为了防止忘记带U盘导致无法远程,在路由器上开个Nginx放导航页和下载页,也是个不错的选择。访问时用的是域名,因为考虑到WAN侧是DHCP,虽然不一定变,但也最好以防万一,因此还可以装一个DDNS系统,把最新的IP刷上去。这里用的是DDNS-Go,你也可以用你习惯的DDNS系统,看文档操作就行。
找DSv4f写的,能用就行4. 写在最后
目前能正常上网,先不管他了,以后出什么问题再回来修吧。
(完)
双物理接口的NUC么, 如果在debian上使用proxy server呢, 内网的终端均使用http proxy去访问外部/校园网络. 这种访问方式呢?
单物理口,需要通一个网卡进去才能用(否则只能做单臂路由)。Proxy Server那种也研究过,理论上比NAT更为彻底,因为是纯粹的L7流量,但考虑到客户端并不好适配,因此还是用了NAT