TUN 模式
经过了解,Tun 模式是 Clash Core 中相当好用的一个功能,传统的系统代理是接管系统的代理,然后让本来就走系统代理的软件通过 Clash 分流去实现科学上网,而 Tun 模式则是直接虚拟一张网卡,强制所有的流量都走 Clash 网卡,使得本来不走代理的一些软件也可以强制科学上网,比如 Windows 的终端还有部分 UWP 应用。
配置
dns:
enable: true
ipv6: false
enhanced-mode: fake-ip
nameserver:
- 223.5.5.5
- 114.114.114.114
- 8.8.8.8
fallback:
- https://8888.google/dns-query
- https://1.0.0.1/dns-query
- https://dns.twnic.tw/dns-query
- https://doh.opendns.com/dns-query
- https://dns-nyc.aaflalo.me/dns-query
- https://dns.aa.net.uk/dns-query
- https://sg.adhole.org/dns-query
- https://kaitain.restena.lu/dns-query
- https://hydra.plan9-ns1.com/dns-query
- https://jp.tiar.app/dns-query
- https://doh.asia.dnswarden.com/adblock
nameserver-policy: {}
fake-ip-filter:
- +.stun.*.*
- +.stun.*.*.*
- +.stun.*.*.*.*
- +.stun.*.*.*.*.*
- "*.n.n.srv.nintendo.net"
- +.stun.playstation.net
- xbox.*.*.microsoft.com
- "*.*.xboxlive.com"
- "*.msftncsi.com"
- "*.msftconnecttest.com"
- WORKGROUP
tun:
enable: true
stack: system
auto-route: true
auto-detect-interface: true
dns-hijack:
- any:53
其中第一部分 dns 是用于解析域名,境内网址会交由nameserver解析,然后得到 IP,所以此处一般使用国内运营商的 DNS 服务,例如阿里和腾讯。然后当nameserver解析得到被墙污染的地址时,触发 Fallback,域名会交给 fallback 部分的境外 DNS 服务解析,得到真实的 IP。
Tun 部分则较为简单,stack有两种模式,分别是system和gVisor,虽然不知道有什么区别,但是都说system模式的请求更底层,效率更高。
但是去查看 Clash 的 Issue 的时候发现,其实 Tun 模式是从混合配置 (Mixin) 中独立出来的,于是又去研究了一下什么是 Mixin。
Mixin
Mixin,CFW 对其的解释是开启时强制覆盖原有的配置,在研究后发现只要在 Mixin 中写上的公共属性,就会强制覆盖掉全局属性,例如我的机场规则中存在Rules属性,有几千条分流。
但是当我在 Mixin 中同样写下rules属性后,就会强制覆盖掉原有的rules属性。所以为了防止更新时我们的设置被覆盖,不管是机场订阅更新还是 CFW 更新,都会顶掉我们自己的配置。
PS:有一说一,Clash Core 删库跑路,CFW 也跑路,这俩还有更新见鬼了。
所以我们使用 Mixin 来启动 Tun 模式更为方便,也可以在 Mixin 中直接配置我们自定义的一些规则。
配置
首先打开 Clash 的 Mixin 配置,点击齿轮即可。
然后进入配置界面,将刚才在 Tun 模式中的内容照搬过来然后改一改格式。
mixin:
dns:
enable: true
enhanced-mode: fake-ip
use-hosts: false
default-nameserver:
- 223.5.5.5
- 119.29.29.29
fake-ip-range: 198.18.0.1/16
fake-ip-filter:
- "dns.msftncsi.com"
- +.stun.*.*
- +.stun.*.*.*
- +.stun.*.*.*.*
- +.stun.*.*.*.*.*
- "*.n.n.srv.nintendo.net"
- +.stun.playstation.net
- xbox.*.*.microsoft.com
- "*.*.xboxlive.com"
- "*.msftncsi.com"
- "*.msftconnecttest.com"
- WORKGROUP
nameserver:
- https://doh.pub/dns-query
- https://dns.alidns.com/dns-query
- https://doh.360.cn/dns-query
fallback:
- tls://dns.google
- https://1.0.0.1/dns-query
- https://doh.dns.sb/dns-query
- https://dns.cloudflare.com/dns-query
- https://dns.twnic.tw/dns-query
- tls://8.8.4.4:853
fallback-filter:
geoip: true
geoip-code: CN
geosite:
- gfw
ipcidr:
- 240.0.0.0/4
domain:
- "+.google.com"
- "+.facebook.com"
- "+.youtube.com"
tun:
enable: true
stack: system
dns-hijack:
- any:53
- tcp://any:53
auto-route: true
auto-detect-interface: true
这样我们只需要打开混合配置就可以开启 Tun 模式。
移动热点问题
移动热点问题很抽象,怎么说呢,我的卧室距离主路由器很远,所以会导致 WiFi 信号很差,但是我的笔记本用的是网线直连光猫,所以我就一直使用 Windows 的移动热点功能给我开热点,但是当我开始使用 Tun 模式后,发现 Tun 开启后,移动热点能开但是无法上网,于是我去 Issue 里看,果然发现不止我有这个问题,解决方法很简单但不能一劳永逸。
- 首先打开控制面板->网络共享中心->更改适配器选项
- 先打开移动热点,然后开启混合配置。此时适配器中会出现两个新网卡。
- 在 Clash 的网卡上右键,属性->共享->允许其他网络用户通过比计算机的 Internet 连接来连接 (N)->选择移动热点网卡
然后我们的移动热点就可以正常上网了,但是需要注意,这玩意很奇怪,老蹦,一会能一会不能,我的评价是一坨。
预处理配置
前提
这玩意我为啥会研究呢,很简单,有些分流规则不合我心意,比如 Spotify,我的账号地区设置的是美国,而且没有开 Premium,所以我每 14 天都需要重新切换到美国线路去验证一回账号,所以我干脆就想,能不能直接把 Spotify 直接分流到美国线路,然后就发现了预处理配置这玩意。
规则
这东西的关键词和普通的关键词不太一样,有表格列出来。
| 配置 | 功能 |
|---|---|
| append-rules | 数组合并至原配置 rules 数组后 |
| prepend-rules | 数组合并至原配置 rules 数组前 |
| append-proxies | 数组合并至原配置 proxies 数组后 |
| prepend-proxies | 数组合并至原配置 proxies 数组前 |
| append-proxy-groups | 数组合并至原配置 proxy-groups 数组后 |
| prepend-proxy-groups | 数组合并至原配置 proxy-groups 数组前 |
很明显,含义说的很清楚,我们主要使用的就是prepend-rules,这个可以把我们自定义的规则放到最前面,优先级更高,可以覆盖掉本来的分流。效果如下
上面就是我们添加的规则,可以看到出现在最上边而且改变了分流。
编写
这个东西在 Clash 的设置->配置->预处理配置,点击编辑打开编写界面。
parsers: # array
- url: https://sub.niceduck.cloud/api/v1/client/subscribe?token=6fa7e6efaa0af93bff2577adfb20fb28
yaml:
prepend-rules:
- DOMAIN-SUFFIX,wallhaven.cc,♻️ 自动选择
- DOMAIN-SUFFIX,bard.google.com,【1x】隧道丨美国 01
- DOMAIN-SUFFIX,ai.google.dev,【1x】隧道丨美国 01
- DOMAIN-SUFFIX,makersuite.google.com,【1x】隧道丨美国 01
- DOMAIN-SUFFIX,cdn.winget.microsoft.com,🚀 节点选择
- DOMAIN-SUFFIX,router.bittorrent.com,DIRECT
首先是parsers顾名思义,解析器,传入的是一个数组,但我们这里只有一个订阅,所以没必要写成数组。然后是 URL,这个地方填订阅地址,他会根据不同的订阅实行不同的配置。
然后下面是一个标准的 yaml 文件格式,使用prepend-rules使我们的规则出现在最前面,下面的参数有说法
这个地方其实是 Clash 的规则,而 Clash 的规则有好多种匹配方式,总体分 3 种:类型,匹配内容,策略。
DOMAIN-SUFFIX:域名后缀匹配
DOMAIN:域名匹配
DOMAIN-KEYWORD:域名关键字匹配
IP-CIDR:IP段匹配
SRC-IP-CIDR:源IP段匹配
GEOIP:GEOIP数据库(国家代码)匹配
DST-PORT:目标端口匹配
SRC-PORT:源端口匹配
PROCESS-NAME:源进程名匹配
RULE-SET:Rule Provider规则匹配
MATCH:全匹配
我们只讲几个常用的
域名规则
DOMAIN
域名规则,如果请求的域名完全匹配,就会使用此规则
rules:
- DOMAIN,google.com,auto
比如上面的,我们访问 google.com 就会出发 auto 的规则,而如果访问的是 mail.google.com,就无法触发。
DOMAIN_SUFFIX
域名后缀规则,如果请求的域名后缀匹配,则会匹配上此规则
例:
“google.com"匹配"www.google.com”、“mail.google.com"以及"google.com”,但是不匹配"content-google.com"。
rules:
- DOMAIN-SUFFIX,google.com,auto
DOMAIN_KEYWORD
域名关键词规则,如果请求的域名中包含关键字,则会匹配上此规则
rules:
- DOMAIN-KEYWORD,ad,REJECT
剩下的我基本用不上,想了解可以去[虚空终端](规则配置 - 虚空终端 Docs (metacubex.one)) 处了解详细规则的编写。
还有一点,预处理规则写在这个文件里,但是同样可以使用 Mixin 进行强制覆盖或者二次添加。
先写这么多,后面的还没用上,用上再说。



