UIC Anyconnect的校园VPN研究
本文包含了关于 UIC VPN 与 Clash 协同使用,基本逻辑,和虚拟内网(Zerotier)/局域网协同使用的研究
前言
UIC 校园 VPN 是一个基于 Cisco Anyconnect 的 VPN ,可以在校外网络环境访问校园网资源
我这里使用的学校推荐的那个版本 ITSC校园VPN使用指引
Clash 是一个基于 Go 语言的代理软件,可以实现代理转发,支持多种代理协议
我这里使用的是 Clash Nyanpasu 的 GUI + Mihomo 1.18.3 的内核
(但是其实用什么版本的关系并不大)
Zerotier 是一个虚拟内网软件,可以实现全球范围内的虚拟内网连接
另外,我使用的是 Windows 11 23H2 版本,用 MacOS 和 Linux 的同学需要根据这个逻辑自行调整
我研究这个的起因非常简单:我开了 UIC 校园 VPN ,但是同时又开了 Clash ,导致了uic.edu.cn
的域名解析出现了问题,我无法访问 iSpace 交作业
与Clash协同使用
我使用的Clash,是只开了系统代理(使用 TUN 模式的话可能会有点区别)
根据7层网络模型,系统代理位于应用层(第七层),虚拟网卡工作在数据链路层(第二层)和物理层(第一层)之间,所以逻辑上流量是会先经过 Clash 再经过 VPN 的
Clash 的配置文件中,可以配置一个 dns
字段,用于指定 DNS 服务器
主要问题就出现在这里:Clash 的 DNS 服务器因为层级较高会被优先使用,使得uic.edu.cn
的域名解析到了 61.143.62.100
这个地址,是 UIC 官网在一般网络环境下访问的地址,这没有任何问题
但是,当我开了 UIC 校园 VPN 的时候,这个 IP 就会被防火墙拦截(可能是因为避免用了VPN还是使用外部地址,访问不到学术资源的”Bug”),导致了无法访问 UIC 官网及 iSpace
那么就诞生了方法1:在 Clash 的配置文件中,将 UIC 的 dns
匹配改成跟随系统即可(但是还是有缺陷,看下文)
例如我写的是:
1 | dns: |
需要注意的是,Clash-Go/Clash-Premium/Stash 的内核对 DNS 的配置写法有些不同,可能不支持一个地址对应多个 DNS 服务器,有需要的可以尝试以下写法
1 | dns: |
这样,Clash 就会优先使用 UIC 校园 VPN 的 DNS 服务器 (172.16.240.10),解析出内网的 IP 地址,通过校园 VPN 访问 UIC 官网及 iSpace
然而,虽然看起来这个方案能行,但是还是有致命的缺点:DNS 缓存
在关闭校园 VPN 后的数分钟内,校园网连接时期的缓存依然存在,导致了一段时间内都不能访问同一个域名
为此,还有两种逻辑上可行的备用方法
方法2:使用 Zero Omega 浏览器插件预先分流
- 在Chrome商店安装插件,打开设置
- 从左侧进入 proxy –> Bypass list,填入
*uic.edu.cn
,再在上面的 Proxy servers 填上 Clash 本地设置的端口 - 点击左侧的 Apply changes
- 浏览器右上角的插件栏,找到这个插件,使它长期处于 proxy 模式即可
这个方案,直接让浏览器预先分流,而不会受到 Clash 相关 DNS 设置的影响
不过缺点同样也很明显,这个方法只作用于浏览器。其他程序没法正常获取校内资源(如语言大模型(LLM)的本地客户端中,给它链接来读论文的场景就行不通了)
另外,对于那些经常开关 Clash 的人来说,每次关闭后都需要在浏览器右上角切换代理模式,会有点烦
方法3:让 Clash 的层级比校园 VPN 的层级高(如同样用TUN)
这个方案我还没试过,但是显然会很混乱
另为了避免学术网站地址被 Clash 代理走到外国服务器,无法获取校内 IP 才能访问的资源,可以在配置文件中加入以下规则
1 | rules: |
VPN 逻辑的研究
到这里,我的问题解决了,但是我还是非常好奇,为什么会有这样一个问题出现
对此,我通过 route print
命令,查看了一下我的路由表
1 | IPv4 Route Table |
我们可以直接看出来,Gateway
为172.25.0.1
的便是走了 UIC 校园 VPN 的路由,而Metric
则表达出了它的优先级,而192.168.1.*
则是我宿舍的本地网络,192.168.191.*
是我 Zerotier 的虚拟内网
这个路由表,并不像他看起来的那样这么好理解,我甚至还需要借助GPT来帮忙解读这个表
以下是GPT的解读结果:
这些路由条目表示特定的IPv4地址范围是通过VPN隧道传输的。具体的路由如下:
128.0.0.0/2 覆盖128.0.0.0到191.255.255.255的IP地址范围。
192.0.0.0/3 覆盖192.0.0.0到223.255.255.255的IP地址范围。
64.0.0.0/2 覆盖64.0.0.0到127.255.255.255的IP地址范围。
32.0.0.0/3 覆盖32.0.0.0到63.255.255.255的IP地址范围。
16.0.0.0/4 覆盖16.0.0.0到31.255.255.255的IP地址范围。
8.0.0.0/5 覆盖8.0.0.0到15.255.255.255的IP地址范围。
1.0.0.0/8 覆盖1.0.0.0到1.255.255.255的IP地址范围。
2.0.0.0/8 覆盖2.0.0.0到2.255.255.255的IP地址范围。
3.0.0.0/8 覆盖3.0.0.0到3.255.255.255的IP地址范围。
4.0.0.0/8 覆盖4.0.0.0到4.255.255.255的IP地址范围。
5.0.0.0/8 覆盖5.0.0.0到5.255.255.255的IP地址范围。
6.0.0.0/8 覆盖6.0.0.0到6.255.255.255的IP地址范围。
7.0.0.0/8 覆盖7.0.0.0到7.255.255.255的IP地址范围。
172.16.240.10/32 表示单个IP地址172.16.240.10通过VPN隧道传输。
总结来说,这段配置定义了哪些流量应通过VPN(安全路由)以及哪些流量应通过本地网络(非安全路由)。在这个配置中,除了0.0.0.0/0表示的默认所有流量之外,其他一些特定的地址段将会通过VPN进行传输。
那么,我们就可以发现,UIC 的外部 IP 地址 61.143.62.100
,是需要通过 VPN 隧道传输,并不能像我们想的那样可以按需传输,给了位于校园网内部的防火墙可以拦截的机会
所以,这也带来了一个问题:在开启 VPN 之后,因为 VPN 的路由表优先级高于本地网络,所以会导致一些本地网络的问题
比如无法访问局域网内的设备等
但是,我又发现,我还可以访问 192.168.1.1
,它明明是优先级41的,比2高了许多,为什么还可以访问呢?
这又得提到另外一个机制了,因为我也不太懂,所以GPT是这么解释的
精确匹配原则:
路由表的查找遵循“最长前缀匹配”原则,即最精确匹配的路由条目优先。例如,192.168.1.1 255.255.255.255 的匹配精度高于 192.168.1.0/24。
因此,当你访问本地地址192.168.1.1时,路由表选择最精确的匹配,即 192.168.1.1 255.255.255.255 On-link 192.168.1.112,而不是通过网关 172.25.0.1。这是为什么你仍然可以访问本地的192.168.1.1,即使有一个低metric值的路由条目存在。
与虚拟内网(Zerotier)/局域网协同使用
研究完了 VPN 的逻辑,逻辑能力强的人就会发现一个问题:既然VPN的路由表优先级高于本地网络,那么本地内网的设备是不是会优先被路由去了学校里面,导致内网的设备无法访问吗?
是的,实际操作确实会出现无法访问本地网络设备的情况
理论上,我们可以通过修改路由表来解决这个问题,然而,我每次修改完貌似都不起作用
我尝试过输入route delete 192.168.191.0 172.25.0.1
,但是貌似并没有什么用
经过一段时间尝试修改路由表,但是依然不生效,有可能是因为 Cisco Anyconnect 会不断覆盖我的路由表,导致了我无法修改,所以放弃了这个方案
但是,我偶尔又想到了另一条路子:为什么我非要使用 Cisco Anyconnect Client 来连校园 VPN 呢?
所以,我找到了另一个支持 Anyconnect 协议的开源平替:OpenConnect
单看这个界面,非常的老旧,还都是命令行,非常的难用,所以我又找到基于它的GUI版本:OpenConnect-GUI
这有GUI就很简单啦,使用方法:
- 下载好软件,安装
- 右上角 File -> Profile -> New Profile
- 把
v.uic.edu.cn
填入Gateway
,点Save
即可
下次连接的时候,只需要点Connect
,Group
选Student
,输入自己的账号密码和验证码即可
这下,我就可以通过 OpenConnect-GUI 来连接校园VPN,而不是 Cisco Anyconnect Client
并且,这个软件配置出来的路由表更加合理,不需要经过任何修改就可以实现局域网/虚拟内网和校园网的协同使用
这是我在 OpenConnect-GUI 连接校园 VPN 之后的路由表
1 | IPv4 Route Table |
显然合理多了,根据前面提到的“精确匹配原则”,本地的设备就可以正确匹配到本地的小局域网里,不会被大包围路由到学校 VPN 隧道里了
结语
这篇文章,记录了我对 UIC 校园 VPN 的研究,以及与 Clash 和虚拟内网的协同使用
但是我并非专业人士,甚至都不是 FST 的学生,大部分内容都是从网上细碎的片段配合 GPT4o 的解释来理解的,所以文章中可能有错误,欢迎在评论区指正