一句话
防火墙阻断了所有 tcp 和 udp,但不阻断 icmp,把 tcp/udp 流量用 icmp 协议传输就行了。但是效果差强人意。
背景
某天起来,按照往常一样登录校园网,突然告诉我停机了。不过最近进工作室了,有个了自己的工位了,工位这边插上就有网,于是就没买校园网了。
但是,很难受,虽然可以白嫖学校的网络,但是只有在工位才可以,宿舍就只能用流量了。想着晚上回宿舍看视频,还要在工位提前缓存,心里想着一定要把认证给破了。
目前情况
学生校园网分为宿舍拨号上网和无线认证上网,这里只考虑无线。
无线网络为公开的无密码热点,连接后访问任何网页都会被重定向到登录页面。
地址分配
使用 ipconfig
命令查询接口的连接信息:
1
2
3
4
5
6
7
8
9
10
11
|
PS C:\Users\suyiiyii> ipconfig
无线局域网适配器 WLAN:
连接特定的 DNS 后缀 . . . . . . . :
IPv6 地址 . . . . . . . . . . . . : 2001:da8:****:****:****:d768:df53:2231
临时 IPv6 地址。. . . . . . . . . : 2001:da8:****:****:****:28c:267e:c8c6
本地链接 IPv6 地址。. . . . . . . : fe80::c7fe:6131:efde:de12%16
IPv4 地址 . . . . . . . . . . . . : 10.*.*.*
子网掩码 . . . . . . . . . . . . : 255.255.128.0
默认网关。. . . . . . . . . . . . : fe80::2e52:afff:fe6e:7e6d%16
10.*.*.*
|
可以看到正常分配到了 ipv4 和 ipv6 地址,结合之前使用的情况,认证之后地址不变。
DNS
既然正常分配到 ip 了,尝试 ping 一下:
1
2
3
4
5
6
7
8
9
10
11
12
|
PS C:\Users\suyiiyii> ping baidu.com
正在 Ping baidu.com [39.156.66.10] 具有 32 字节的数据:
来自 39.156.66.10 的回复:字节=32 时间=59ms TTL=48
来自 39.156.66.10 的回复:字节=32 时间=59ms TTL=48
来自 39.156.66.10 的回复:字节=32 时间=62ms TTL=48
来自 39.156.66.10 的回复:字节=32 时间=59ms TTL=48
39.156.66.10 的 Ping 统计信息:
数据包:已发送 = 4,已接收 = 4,丢失 = 0 (0% 丢失),
往返行程的估计时间 (以毫秒为单位):
最短 = 59ms,最长 = 62ms,平均 = 59ms
|
居然 ping 成功了,再去试一下打开网页,还是被重定向到登录页面了。
虽然不能上网,但还是说明了:
- 此时可以进行 dns 解析
- 服务器允许 ping 请求通过
分析
DNS 53 端口
基于第一点,我们猜测防火墙可能没有阻断 udp 53 端口,否则我们做不了 dns 解析。
于是我们尝试指定 dns 服务器进行解析
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
PS C:\Users\suyiiyii> nslookup baidu.com
服务器:dns.*.edu.cn
Address: 10.*.*.*
非权威应答:
名称:baidu.com
Addresses: 110.242.68.66
39.156.66.10
PS C:\Users\suyiiyii> nslookup baidu.com 223.5.5.5
DNS request timed out.
timeout was 2 seconds.
服务器:UnKnown
Address: 223.5.5.5
DNS request timed out.
timeout was 2 seconds.
DNS request timed out.
timeout was 2 seconds.
DNS request timed out.
timeout was 2 seconds.
DNS request timed out.
timeout was 2 seconds.
*** 请求 UnKnown 超时
|
很遗憾,尝试访问第三方服务器失败了。之前 dns 解析能够成功,是因为用的是校内的 dns 服务器,可能是特殊开放的端口。
经过测试,使用默认的 dns 服务器可以解析到正确的地址,但是无法访问第三方的 dns 服务器,也就是说,使用 udp 53 端口这条路行不通。
ICMP
没关系,我们还可以 ping 通。
1
2
3
4
5
6
7
8
9
10
11
12
|
PS C:\Users\suyiiyii> ping suyiiyii.top
正在 Ping suyiiyii.top [14.215.57.239] 具有 32 字节的数据:
来自 14.215.57.239 的回复:字节=32 时间=8ms TTL=53
来自 14.215.57.239 的回复:字节=32 时间=8ms TTL=53
来自 14.215.57.239 的回复:字节=32 时间=9ms TTL=53
来自 14.215.57.239 的回复:字节=32 时间=8ms TTL=53
14.215.57.239 的 Ping 统计信息:
数据包:已发送 = 4,已接收 = 4,丢失 = 0 (0% 丢失),
往返行程的估计时间 (以毫秒为单位):
最短 = 8ms,最长 = 9ms,平均 = 8ms
|
我们 ping 一下自己的服务器,结合之前的数据和 ping 其他服务器的延迟数据,可以大致判断 ping 请求真实到达了远端服务器,也就是说,防火墙没有阻断 icmp 协议,我们只需要把 tcp/udp 数据通过 icmp 协议发送就行了。
资料收集
通过相关关键字的查找,最终决定使用这个最近更新并且 star 比较多的项目:udp2raw
link_preview
udp2raw 项目支持通过 icmp 传输 udp,也就是说,我们现在可以建立一个 udp 连接了。
但是仅有 udp 连接是不够的,我们最终需要的是打开网页。所以我们还需要一个可以传输 tcp/udp 数据的隧道。这方面 udp2raw 项目推荐的是 openvpn,但由于复杂度的问题,我使用的是 v2ray。
为了绕过校园网的认证防火墙,我们还需要一个落地的机器,这里我使用的是在工位的电脑,24 小时开机提供服务。
所以,我们打开一个网页的整个流程就变成了这个样子。
1
2
3
|
┌───────┐ ┌─────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌─────────┐ ┌────────┐
│browser│->│ v2ray c │->│ udp2raw c│---│ firewall │->│ udp2raw s│->│ v2ray s │->│ server │
└───────┘ └─────────┘ └──────────┘ └──────────┘ └──────────┘ └─────────┘ └────────┘
|
实现了把 tcp/udp 流量通过 icmp 协议传输来绕过校园网认证防火墙的效果。
实施
按照项目的文档,先部署 v2ray,再部署 udp2raw 即可
v2ray 由于特殊原因,无法给出教程。也可以替换成其他组件,只要能够实现将 tcp 流量通过 udp 传输,效果是一样的。
udp2raw 就按照文档执行就可以了,记得按照文档修改为自己服务器的地址。
1
2
3
4
5
|
在 server 端运行:
./udp2raw_amd64 -s -l 0.0.0.0:40960 -r 127.0.0.1:45984 -k "passwdddd" --raw-mode icmp --cipher-mode xor -a
在 client 端运行:
.\udp2raw_mp.exe -c -l 127.0.0.1:45984 -r 10.1.1.1:40960 -k "passwdddd" --raw-mode icmp --cipher-mode xor
|
Tips:
- 运行 udp2raw 之后服务器就不会响应 ping 了,不是服务器挂了
- 刚开始可能无法连接,重启两个客户端软件即可
效果
最后确实是实现了免登录使用校园网,但是结果只能说是差强人意惨不忍睹。
首先学校给的接口都是百兆的,可能还不是全双工的。工位这里做服务器的,可能是因为同时有上下行,最多只能跑到 50m。然后,icmp 这一层封装+kcp 一层封装,效率不是一般的低,
但是大文件传输的效果好像还行
从校内镜像站下载镜像,速度有 3-4MB/s 速度尚且可以接受
重新测了一下,正常情况下的效率也还能接受吧
可以改进的地方
- 首先就是 icmp 数据的包装吧,人家的工具最初只是防止 udp 被 qos 的,伪装 icmp 都是次要的功能,被我拿来做主要功能了,效率上面可能没有做的很优。以后有时间可以自己研究一下然后尝试着自己写一下。
- 其次是 kcp,kcp 其实是应对容易丢包的环境的,网络环境好情况下时候还可能会有副作用,不过先不管这么多了,能用就行了。
- 通过目前的观察,校园网认证防火墙只阻断了出站的连接,尚不清楚有没有阻断入站的连接,如果没有,则可以利用 frp 类似的内网穿透机制实现通信。
总结
总得来说还是一次比较爽的折腾吧,搞的时间短没有拖很久,也确实搞出了一点效果。
帮学校想解决方案
首先,我不是专门搞计网的,实现难度这些的我都不清楚,只是自己觉得理论可行。
为什么要选择性阻断一些协议,搞的这么麻烦,要我搞就直接拉个 vlan。所有没有认证的用户都在一个独立的 vlan 里面,vlan 内只有该用户和认证服务器,认证成功之后再把用户切换到业务的 vlan 里面。用户认证之前,顶破天也只能和认证服务器通信,难倒能在认证服务器上打个洞?完美解决任何绕过方案(傻笑)。