本文包含了关于 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
2
3
4
5
6
7
dns:
...

nameserver-policy:
"*.uic.edu.cn": [system,dhcp://system]

...

需要注意的是,Clash-Go/Clash-Premium/Stash 的内核对 DNS 的配置写法有些不同,可能不支持一个地址对应多个 DNS 服务器,有需要的可以尝试以下写法

1
2
3
4
5
6
dns:
...

nameserver-policy:
"*.uic.edu.cn": system
...

这样,Clash 就会优先使用 UIC 校园 VPN 的 DNS 服务器 (172.16.240.10),解析出内网的 IP 地址,通过校园 VPN 访问 UIC 官网及 iSpace

然而,虽然看起来这个方案能行,但是还是有致命的缺点:DNS 缓存
在关闭校园 VPN 后的数分钟内,校园网连接时期的缓存依然存在,导致了一段时间内都不能访问同一个域名

为此,还有两种逻辑上可行的备用方法

方法2:使用 Zero Omega 浏览器插件预先分流

  1. 在Chrome商店安装插件,打开设置
  2. 从左侧进入 proxy –> Bypass list,填入*uic.edu.cn ,再在上面的 Proxy servers 填上 Clash 本地设置的端口
  3. 点击左侧的 Apply changes
  4. 浏览器右上角的插件栏,找到这个插件,使它长期处于 proxy 模式即可

这个方案,直接让浏览器预先分流,而不会受到 Clash 相关 DNS 设置的影响
不过缺点同样也很明显,这个方法只作用于浏览器。其他程序没法正常获取校内资源(如语言大模型(LLM)的本地客户端中,给它链接来读论文的场景就行不通了)
另外,对于那些经常开关 Clash 的人来说,每次关闭后都需要在浏览器右上角切换代理模式,会有点烦

方法3:让 Clash 的层级比校园 VPN 的层级高(如同样用TUN)

这个方案我还没试过,但是显然会很混乱

另为了避免学术网站地址被 Clash 代理走到外国服务器,无法获取校内 IP 才能访问的资源,可以在配置文件中加入以下规则

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
rules:
...

# 学术论文(需要机构内网)
- DOMAIN-SUFFIX,uic.edu.cn,DIRECT
- DOMAIN-SUFFIX,acm.org,DIRECT
- DOMAIN-SUFFIX,airitilibrary.com,DIRECT
- DOMAIN-SUFFIX,journals.aps.org,DIRECT
- DOMAIN-SUFFIX,artstor.org,DIRECT
- DOMAIN-SUFFIX,gale.com,DIRECT
- DOMAIN-SUFFIX,brillonline.com,DIRECT
- DOMAIN-SUFFIX,corpus.byu.edu,DIRECT
- DOMAIN-SUFFIX,zju.edu.cn,DIRECT
- DOMAIN-SUFFIX,cambridge.org,DIRECT
- DOMAIN-SUFFIX,chant.org,DIRECT
- DOMAIN-SUFFIX,ckcest.cn,DIRECT
- DOMAIN-SUFFIX,cityu.edu.hk,DIRECT
- DOMAIN-SUFFIX,cnki.net,DIRECT
- DOMAIN-SUFFIX,corpus.byu.edu,DIRECT
- DOMAIN-SUFFIX,csmar.com,DIRECT
- DOMAIN-SUFFIX,diaolong.com,DIRECT
- DOMAIN-SUFFIX,buddhism-dict.net,DIRECT
- DOMAIN-SUFFIX,doaj.org,DIRECT
- DOMAIN-SUFFIX,duxiu.com,DIRECT
- DOMAIN-SUFFIX,eadl.asia,DIRECT
- DOMAIN-SUFFIX,ebscohost.com,DIRECT
- DOMAIN-SUFFIX,emerald.com,DIRECT
- DOMAIN-SUFFIX,myendnoteweb.com,DIRECT
- DOMAIN-SUFFIX,bl.uk,DIRECT
- DOMAIN-SUFFIX,euromonitor.com,DIRECT
- DOMAIN-SUFFIX,ebscohost.com,DIRECT
- DOMAIN-SUFFIX,gale.com,DIRECT
- DOMAIN-SUFFIX,nssd.org,DIRECT
- DOMAIN-SUFFIX,global-sci.org,DIRECT
- DOMAIN-SUFFIX,ieee.org,DIRECT
- DOMAIN-SUFFIX,imf.org,DIRECT
- DOMAIN-SUFFIX,clarivate.com,DIRECT
- DOMAIN-SUFFIX,jstor.org,DIRECT
- DOMAIN-SUFFIX,lexisnexis.com,DIRECT
- DOMAIN-SUFFIX,ams.org,DIRECT
- DOMAIN-SUFFIX,uic.edu.hk,DIRECT
- DOMAIN-SUFFIX,ebscohost.com,DIRECT
- DOMAIN-SUFFIX,mintel.com,DIRECT
- DOMAIN-SUFFIX,nlc.cn,DIRECT
- DOMAIN-SUFFIX,nature.com,DIRECT
- DOMAIN-SUFFIX,oecd-ilibrary.org,DIRECT
- DOMAIN-SUFFIX,osapublishing.org,DIRECT
- DOMAIN-SUFFIX,oxfordartonline.com,DIRECT
- DOMAIN-SUFFIX,oxfordbibliographies.com,DIRECT
- DOMAIN-SUFFIX,oxfordmusiconline.com,DIRECT
- DOMAIN-SUFFIX,ebscohost.com,DIRECT
- DOMAIN-SUFFIX,muse.jhu.edu,DIRECT
- DOMAIN-SUFFIX,proquest.com,DIRECT
- DOMAIN-SUFFIX,ebscohost.com,DIRECT
- DOMAIN-SUFFIX,resset.cn,DIRECT
- DOMAIN-SUFFIX,sagepub.com,DIRECT
- DOMAIN-SUFFIX,sciencedirect.com,DIRECT
- DOMAIN-SUFFIX,scival.com,DIRECT
- DOMAIN-SUFFIX,scopus.com,DIRECT
- DOMAIN-SUFFIX,siam.org,DIRECT
- DOMAIN-SUFFIX,springer.com,DIRECT
- DOMAIN-SUFFIX,tandfonline.com,DIRECT
- DOMAIN-SUFFIX,tlg.uci.edu,DIRECT
- DOMAIN-SUFFIX,warc.com,DIRECT
- DOMAIN-SUFFIX,webofknowledge.com,DIRECT
- DOMAIN-SUFFIX,westlaw.com,DIRECT
- DOMAIN-SUFFIX,wiley.com,DIRECT
- DOMAIN-SUFFIX,worldbank.org,DIRECT
- DOMAIN-SUFFIX,zbmath.org,DIRECT
- DOMAIN-SUFFIX,ckcest.cn,DIRECT
- DOMAIN-SUFFIX,cnbksy.com,DIRECT

...

VPN 逻辑的研究

到这里,我的问题解决了,但是我还是非常好奇,为什么会有这样一个问题出现

对此,我通过 route print命令,查看了一下我的路由表

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
IPv4 Route Table
===========================================================================
Active Routes:
Network Destination Netmask Gateway Interface Metric
0.0.0.0 0.0.0.0 192.168.1.1 192.168.1.112 40
0.0.0.0 0.0.0.0 25.255.255.254 192.168.191.95 10034
1.0.0.0 255.0.0.0 172.25.0.1 172.25.50.204 2
2.0.0.0 255.0.0.0 172.25.0.1 172.25.50.204 2
3.0.0.0 255.0.0.0 172.25.0.1 172.25.50.204 2
4.0.0.0 255.0.0.0 172.25.0.1 172.25.50.204 2
5.0.0.0 255.0.0.0 172.25.0.1 172.25.50.204 2
6.0.0.0 255.0.0.0 172.25.0.1 172.25.50.204 2
7.0.0.0 255.0.0.0 172.25.0.1 172.25.50.204 2
8.0.0.0 248.0.0.0 172.25.0.1 172.25.50.204 2
16.0.0.0 240.0.0.0 172.25.0.1 172.25.50.204 2
32.0.0.0 224.0.0.0 172.25.0.1 172.25.50.204 2
64.0.0.0 192.0.0.0 172.25.0.1 172.25.50.204 2
116.6.50.238 255.255.255.255 192.168.1.1 192.168.1.112 41
116.116.116.116 255.255.255.255 192.168.1.1 192.168.1.112 41
127.0.0.0 255.0.0.0 On-link 127.0.0.1 331
127.0.0.1 255.255.255.255 On-link 127.0.0.1 331
127.255.255.255 255.255.255.255 On-link 127.0.0.1 331
128.0.0.0 192.0.0.0 172.25.0.1 172.25.50.204 2
172.16.240.10 255.255.255.255 172.25.0.1 172.25.50.204 2
172.25.0.0 255.255.192.0 On-link 172.25.50.204 257
172.25.50.204 255.255.255.255 On-link 172.25.50.204 257
172.25.63.255 255.255.255.255 On-link 172.25.50.204 257
192.0.0.0 224.0.0.0 172.25.0.1 172.25.50.204 2
192.168.1.0 255.255.255.0 On-link 192.168.1.112 296
192.168.1.0 255.255.255.0 172.25.0.1 172.25.50.204 2
192.168.1.1 255.255.255.255 On-link 192.168.1.112 41
192.168.1.112 255.255.255.255 On-link 192.168.1.112 296
192.168.1.255 255.255.255.255 On-link 192.168.1.112 296
192.168.191.0 255.255.255.0 On-link 192.168.191.95 291
192.168.191.0 255.255.255.0 172.25.0.1 172.25.50.204 2
192.168.191.95 255.255.255.255 On-link 192.168.191.95 291
192.168.191.255 255.255.255.255 On-link 192.168.191.95 291
221.5.88.88 255.255.255.255 192.168.1.1 192.168.1.112 41
224.0.0.0 240.0.0.0 On-link 127.0.0.1 331
224.0.0.0 240.0.0.0 On-link 192.168.1.112 296
224.0.0.0 240.0.0.0 On-link 192.168.191.95 291
224.0.0.0 240.0.0.0 On-link 172.25.50.204 10000
255.255.255.255 255.255.255.255 On-link 127.0.0.1 331
255.255.255.255 255.255.255.255 On-link 192.168.1.112 296
255.255.255.255 255.255.255.255 On-link 192.168.191.95 291
255.255.255.255 255.255.255.255 On-link 172.25.50.204 10000
===========================================================================
Persistent Routes:
None

我们可以直接看出来,Gateway172.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就很简单啦,使用方法:

  1. 下载好软件,安装
  2. 右上角 File -> Profile -> New Profile
  3. v.uic.edu.cn填入Gateway,点Save即可

下次连接的时候,只需要点ConnectGroupStudent,输入自己的账号密码和验证码即可

这下,我就可以通过 OpenConnect-GUI 来连接校园VPN,而不是 Cisco Anyconnect Client
并且,这个软件配置出来的路由表更加合理,不需要经过任何修改就可以实现局域网/虚拟内网和校园网的协同使用

这是我在 OpenConnect-GUI 连接校园 VPN 之后的路由表

route print
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
IPv4 Route Table
===========================================================================
Active Routes:
Network Destination Netmask Gateway Interface Metric
0.0.0.0 0.0.0.0 25.255.255.254 192.168.191.95 10034
0.0.0.0 0.0.0.0 192.168.1.1 192.168.1.112 40
1.0.0.0 255.0.0.0 172.25.50.214 172.25.50.214 6
2.0.0.0 255.0.0.0 172.25.50.214 172.25.50.214 6
3.0.0.0 255.0.0.0 172.25.50.214 172.25.50.214 6
4.0.0.0 255.0.0.0 172.25.50.214 172.25.50.214 6
5.0.0.0 255.0.0.0 172.25.50.214 172.25.50.214 6
6.0.0.0 255.0.0.0 172.25.50.214 172.25.50.214 6
7.0.0.0 255.0.0.0 172.25.50.214 172.25.50.214 6
8.0.0.0 248.0.0.0 172.25.50.214 172.25.50.214 6
16.0.0.0 240.0.0.0 172.25.50.214 172.25.50.214 6
32.0.0.0 224.0.0.0 172.25.50.214 172.25.50.214 6
64.0.0.0 192.0.0.0 172.25.50.214 172.25.50.214 6
116.6.50.238 255.255.255.255 25.255.255.254 192.168.1.112 41
127.0.0.0 255.0.0.0 On-link 127.0.0.1 331
127.0.0.1 255.255.255.255 On-link 127.0.0.1 331
127.255.255.255 255.255.255.255 On-link 127.0.0.1 331
128.0.0.0 192.0.0.0 172.25.50.214 172.25.50.214 6
172.25.0.0 255.255.192.0 On-link 172.25.50.214 261
172.25.50.214 255.255.255.255 On-link 172.25.50.214 261
172.25.63.255 255.255.255.255 On-link 172.25.50.214 261
192.0.0.0 224.0.0.0 172.25.50.214 172.25.50.214 6
192.168.1.0 255.255.255.0 On-link 192.168.1.112 296
192.168.1.106 255.255.255.255 192.168.1.1 192.168.1.112 41
192.168.1.107 255.255.255.255 192.168.1.1 192.168.1.112 41
192.168.1.112 255.255.255.255 On-link 192.168.1.112 296
192.168.1.255 255.255.255.255 On-link 192.168.1.112 296
192.168.43.0 255.255.255.0 192.168.191.32 192.168.191.95 291
192.168.191.0 255.255.255.0 On-link 192.168.191.95 291
192.168.191.95 255.255.255.255 On-link 192.168.191.95 291
192.168.191.255 255.255.255.255 On-link 192.168.191.95 291
224.0.0.0 240.0.0.0 On-link 127.0.0.1 331
224.0.0.0 240.0.0.0 On-link 192.168.191.95 291
224.0.0.0 240.0.0.0 On-link 192.168.1.112 296
224.0.0.0 240.0.0.0 On-link 172.25.50.214 261
255.255.255.255 255.255.255.255 On-link 127.0.0.1 331
255.255.255.255 255.255.255.255 On-link 192.168.191.95 291
255.255.255.255 255.255.255.255 On-link 192.168.1.112 296
255.255.255.255 255.255.255.255 On-link 172.25.50.214 261
===========================================================================
Persistent Routes:
None

显然合理多了,根据前面提到的“精确匹配原则”,本地的设备就可以正确匹配到本地的小局域网里,不会被大包围路由到学校 VPN 隧道里了

结语

这篇文章,记录了我对 UIC 校园 VPN 的研究,以及与 Clash 和虚拟内网的协同使用

但是我并非专业人士,甚至都不是 FST 的学生,大部分内容都是从网上细碎的片段配合 GPT4o 的解释来理解的,所以文章中可能有错误,欢迎在评论区指正