用了几年 v2ray 没啥感觉,今天升级了一下,突然就觉得面目可憎,言语无味了。
然后下了个最新版的 CFW 看了一下,比以前好用多了,TUN 更是 v2ray 的盲区。
果断换之。
CFW 是什么#
Clash 是另一个用 Go 写的隧道转发工具(当然也参考了 v2ray-core)。
就好比 v2rayN 之于 v2ray-core*,普通 Windows 用户很难直接使用命令行完成复杂的配置操作,我们一般使用的是封装好的图形化客户端。
* 现在的 v2rayN 内核还支持 Xray-core。
类似的,Clash 自然也有 GUI 版的客户端,那就是 Clash for Windows,简称 CFW。
CFW 玩法介绍#
系统代理 VS TUN & TAP#
系统代理的缺陷
众所周知,通常我们使用的「网络代理软件」走的都是系统代理。
注意:这个跟你「全不全局」没关系,你开不开所谓的「全局」本质都是设置系统代理。是否仅对浏览器生效而已,PAC 也只是浏览器访问网站之前先过一遍规则罢了。
但是有很多应用,比如:git
/ npm
/ yarn
/ go get
/ pip
/ cargo
/ composer
(不是,2022 了还有人写 PHP 吗) 等等,它们是 没有办法 走系统代理的。
此时应该怎么办呢?对啦,那就是用国内各家自行搭建的镜像源(详见 Thanks-Mirror)。
没错,GitHub 也有镜像源,而且(理所应当地)有一大堆,详见这个 油猴脚本。
万一没有对应的镜像源怎么办?比如我 Windows 装个 scoop 作为包管理器不过分吧?
那就只有手动设置代理了,其他应用同理(如果该应用支持的话)。
除此之外,还有老生常谈 —— Windows 的 UWP 应用,由于其本质是一个网络隔离的 App 容器(沙箱),也不能走系统代理。
此时,一般是使用 Fiddler 的 WinConfig 功能(自动启动拥有 UAC 权限的 Fiddler Web Debugger)来解锁 UWP 应用的 Loopback(本地回环)。
对网工稍有了解的同学大概都知道 Fiddler 原本是一个抓包软件,不必在意,物尽其用即可。
那么,有没有办法解决以上痛点呢?
TUN / TAP
显然是有的。
TUN / TAP 二者都是一种「虚拟网卡」模式,区别在于:
- TUN 是模拟「三层(网络层)设备」,操作三层的 IP 数据包。
- TAP 是模拟「二层(数据链路层)设备」,更进一步,假装那里真的有一张网卡,进而操作 MAC 数据包和 FSC 帧校验。
很多人大概都用过的 SSTap(常常用来代理网游 / 联机游戏)就是 TAP。
总的来说,TUN 没有 TAP 装得那么像,但骗骗操作系统也完全够用了。
而且 TUN 少模拟一层(自上向下),根据常识来说就比 TAP 拥有更好的性能表现。
TUN 增强了 Clash 的 Inbound(入口)转发能力,理论上可以劫持任何三层流量,DNS 自然也是小菜一碟。开启 TUN 模式之后、提升了 UDP 流量处理能力(代理游戏更快了)的 Clash 可以说才是完全体。
预处理 & Mixin#
所有人都一定会有的一个需求:过滤流量,辨别是否 有必要 使用代理。
因为如果一律无脑走代理,对某些「仅部署在国内的网络服务」反而会造成减速效果。
搁这反向加速呢?
Clash 的核心当然是 规则 转发(它甚至自称 rule-based
)。
一般来说,我们当然不会手动配置代理,而是使用网络代理服务提供商(俗称「机场*」)提供的「订阅链接」,根据这个链接自动更新节点。
* 因为老前辈 shadowsocks(SS)和二代目 ShadowsocksR(SSR)的图标就是一个小飞机,故而从那时开始,提供「翻墙」的「梯子」的服务商戏称「机场」,很合理吧?
不过 SS 和 SSR 都已经是时代的眼泪了,一是作者早已弃坑多年,二是它们的底裤都被 GFW 扒得一干二净了。
由于 Clash 基于「单独的某个配置文件」运行的特性,对应 Clash 的「订阅链接」实际上是下载一个你的机场那边提前设定好的配置文件。
每次更新订阅节点,原来的配置文件就会被新的覆盖。
难道每次更新订阅都要重写一遍定义的规则?
不可能,这也太麻烦了。
还好最新版的 Clash(22.6.15 v0.19.20)提供了 预处理 和 Mixin 两个实用功能。
简单来说,配置文件要读进内存,然后在根据配置项执行对吧?
于是我们就可以在中间插入自动化处理:
更新订阅链接 → 预处理 → 保存在本地 → 写入内存 → Mixin → 根据最后的配置文件执行
原理很简单吧。了解即可,下文会提供开袋即食方案。
CFW 的正确使用姿势#
我就奇了怪了,为什么全网都搜不到什么细节稍微丰满那么一点的教程。
各位大佬,把使用方法写明白真的有那么难吗?
去 GitHub 的 Releases 页面 下载就是了。
一般是 Clash.for.Windows-[版本号]-win.7z
这个。
看到那个 *-mac.zip
了吗?没错,虽然它叫「Clash for Windows」,实际上它是用 Electron 写的跨平台客户端。
编辑配置文件#
规则参考 Loyalsoldier 写的 clash-rules。
这里具体使用「黑名单模式 Rules 配置方式」:
只有匹配到的网络流量才使用代理,其他一律直连。
右键配置文件,编辑,新增以下内容:
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
| proxy-providers:
YourProxies: # 随便取名
type: http
url: "" # 你的机场给你的订阅链接 注意得是 clash 格式的
interval: 3600
path: ./whatever.yaml # 配置文件路径 可以随便取名
health-check:
enable: true
interval: 600
# lazy: true
url: http://www.gstatic.com/generate_204
proxy-groups:
- name: PROXY
type: select
use:
- YourProxies # 对应之前取的名
rules:
- RULE-SET,applications,DIRECT
- DOMAIN,clash.razord.top,DIRECT
- DOMAIN,yacd.haishan.me,DIRECT
- RULE-SET,private,DIRECT
- RULE-SET,reject,REJECT
- RULE-SET,tld-not-cn,PROXY
- RULE-SET,gfw,PROXY
- RULE-SET,greatfire,PROXY
- RULE-SET,telegramcidr,PROXY
- MATCH,DIRECT
|
这样不是直接把机场给你的配置文件拿来用,而是从中读取出节点列表以备他用。
而且自动定时更新功能也在。
Settings > Mixin > YAML Edit:
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
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
| mixin: # Mixin 配置文件
dns: # 自定义 DNS
enable: true
ipv6: true # true/false 是否启用 ipv6 支持
# 从 v0.18.8 版本开始,TUN 模式建议使用 fake-ip 模式,redir-host 将无法进行远端 DNS 解析
enhanced-mode: fake-ip # redir-host/fake-ip
# use-hosts: true # 查询 hosts 并返回 IP 记录
default-nameserver: # 用于 DoH/DoT 的 Bootstrap Server
- 223.5.5.5 # 阿里公共 DNS
- 223.6.6.6 # 阿里公共 DNS
- 119.29.29.29 # DNSPOD 公共 DNS
fake-ip-range: 198.18.0.1/16 # Fake IP 地址池 (CIDR 形式)
fake-ip-filter: # 微软系 APP 无法登陆使用等问题,通过添加 fake-ip-filter 解决
# Local
- "*.lan"
- "*.local"
# Microsoft Windows Serivice
- "*.msftncsi.com"
- "*.msftconnecttest.com"
nameserver: # GeoIP 为 CN 时使用的 DNS NameServer(使用DoH/DoT)
- https://doh.pub/dns-query # DNSPod DoH
- https://dns.alidns.com/dns-query # 阿里 DoH
#- https://[2400:3200::1]/dns-query # 阿里 IPv6 DoH
#- https://[2400:3200:baba::1]/dns-query # 阿里 IPv6 DoH
fallback: # GeoIP 不是 CN 时使用的 DNS NameServer(使用DoH/DoT)
#- https://doh.dns.sb/dns-query # DNS.SB DoH
- https://dns.google/dns-query # Google DoH
- https://1.1.1.1/dns-query # Cloudflare DoH
#- https://1.0.0.1/dns-query # Cloudflare DoH
fallback-filter:
geoip: true # 启用 GeoIP
ip-cidr:
- 240.0.0.0/4
- 127.0.0.1/8
- 0.0.0.0/32
domain:
- +.google.com
- +.facebook.com
- +.twitter.com
- +.youtube.com
- +.xn--ngstr-lra8j.com
- +.google.cn
- +.googleapis.cn
- +.googleapis.com
- +.gvt1.com
tun: # TUN 配置
enable: true # 启用 TUN 模式
stack: system # gvisor/system
dns-hijack:
- 198.18.0.2:53 # 本地劫持 DNS 地址,无需修改
auto-route: true
auto-detect-interface: true # 自动检测出口网卡
rule-providers: # 每日动态更新的规则
reject:
type: http
behavior: domain
url: "https://raw.githubusercontent.com/Loyalsoldier/clash-rules/release/reject.txt"
path: ./ruleset/reject.yaml
interval: 86400
icloud:
type: http
behavior: domain
url: "https://raw.githubusercontent.com/Loyalsoldier/clash-rules/release/icloud.txt"
path: ./ruleset/icloud.yaml
interval: 86400
apple:
type: http
behavior: domain
url: "https://raw.githubusercontent.com/Loyalsoldier/clash-rules/release/apple.txt"
path: ./ruleset/apple.yaml
interval: 86400
google:
type: http
behavior: domain
url: "https://raw.githubusercontent.com/Loyalsoldier/clash-rules/release/google.txt"
path: ./ruleset/google.yaml
interval: 86400
proxy:
type: http
behavior: domain
url: "https://raw.githubusercontent.com/Loyalsoldier/clash-rules/release/proxy.txt"
path: ./ruleset/proxy.yaml
interval: 86400
direct:
type: http
behavior: domain
url: "https://raw.githubusercontent.com/Loyalsoldier/clash-rules/release/direct.txt"
path: ./ruleset/direct.yaml
interval: 86400
private:
type: http
behavior: domain
url: "https://raw.githubusercontent.com/Loyalsoldier/clash-rules/release/private.txt"
path: ./ruleset/private.yaml
interval: 86400
gfw:
type: http
behavior: domain
url: "https://raw.githubusercontent.com/Loyalsoldier/clash-rules/release/gfw.txt"
path: ./ruleset/gfw.yaml
interval: 86400
greatfire:
type: http
behavior: domain
url: "https://raw.githubusercontent.com/Loyalsoldier/clash-rules/release/greatfire.txt"
path: ./ruleset/greatfire.yaml
interval: 86400
tld-not-cn:
type: http
behavior: domain
url: "https://raw.githubusercontent.com/Loyalsoldier/clash-rules/release/tld-not-cn.txt"
path: ./ruleset/tld-not-cn.yaml
interval: 86400
telegramcidr:
type: http
behavior: ipcidr
url: "https://raw.githubusercontent.com/Loyalsoldier/clash-rules/release/telegramcidr.txt"
path: ./ruleset/telegramcidr.yaml
interval: 86400
cncidr:
type: http
behavior: ipcidr
url: "https://raw.githubusercontent.com/Loyalsoldier/clash-rules/release/cncidr.txt"
path: ./ruleset/cncidr.yaml
interval: 86400
lancidr:
type: http
behavior: ipcidr
url: "https://raw.githubusercontent.com/Loyalsoldier/clash-rules/release/lancidr.txt"
path: ./ruleset/lancidr.yaml
interval: 86400
applications:
type: http
behavior: classical
url: "https://raw.githubusercontent.com/Loyalsoldier/clash-rules/release/applications.txt"
path: ./ruleset/applications.yaml
interval: 86400
|
搞定,就这么简单。
其他设置#
记得回到常规设置(General)把「TUN Mode」和「Mixin」打开。
然后 不要启用「System Proxy (系统代理)」。至于其他的:
- Allow LAN:允许局域网内的设备利用本机 IP 和上面的端口(默认
7890
)当作代理
记得要放开本机的 入站规则 tcp 7890(Win + R,运行 wf.msc
)
还有,这是 http 代理,不是 socks5 手机连电脑的 Clash 开 Telegram App 没用 - IPv6
- UWP Loopback:UWP 使用代理
- Service Mode:注册系统服务
- Start with Windows:开机自启
自己看着办就行。
注意事项#
如果开启 Clash 后发现 Git 和 SSH 连不上了,关掉 Clash 又可以正常直连。
此时可以尝试 rm ~/.ssh/known_hosts
删掉当前的 known_hosts
,重新获取 IP 和公钥指纹。
完结撒花。真的很难吗?!