最近研究代理工具上瘾, 其实也是为了更好地上网😂 前面研究了 clash for windows mixin 的多机场切换, 昨天研究了安卓如何不开 vpn 进行上网. 因为不想在前台挂一个软件, 还有小锁的图标.
于是就发现了 clash for magisk. 其实 cfm 有两种, 一种是原始的核, 好像叫 premium, 还有一个就是本文所讲的 meta 核了.
我发现 meta 核相较 premium 核多了很多功能, 参见完整配置示例:
https://docs.metacubex.one/example/ex1
比如,
1, dns.nameserver 支持 doq
2, dns.fallback 支持 group, 新手看着可能很奇怪, 举个例子就知道了: 🔰国外流量
3, dns.fallback-filter 支持 geosite , 你可以在这多加个 geosite: geolocation-!cn 让非 cn 的域名走 fallback dns.
4, dns.proxy-server-nameserver, 是指如果梯子节点是域名的话, 用此 dns 来解析. 这个就非常实用了, 因为最近研究的这么多机场, 基本节点服务器都是域名.
5, proxy-groups.filter, 这个是支持正则表达式筛选的, 可以非常方便地筛掉带 "官网, 群组, 直连" 之类无用的节点.
6, rule-providers.url 支持走代理访问, 有些规则比如去广告的, 或者 google 的, 一整个列表以订阅的方式获取, 这个 url 可能来自 githubusercontent 或者别的被屏蔽的域名, 这时候 clash meta 会自动从 rules 里判断此 url 是否该走代理.
以上是我这次研究总结出的 meta 核的亮点. 看得云里雾里的是吧, 我写这篇文章的目的就是为了避免谁再折腾 cfm 折腾十几个小时才有结果.
clash meta for magisk 是利用 tun 网口来实现代理的(在 clash meta for magisk 开着时, 不能开启 vpn 工具, 比如 httpcanary), 我在 telegram 频道和 github 上找了一些 cfm 但效果都不满意, 有的模块完全就是大杂烩, 在我手机上装完 cpu 直接起飞了... 我的需求是 clash for magisk 能正常运行, 并且和我的 dns, 也就是 adguard home magisk 正常对接. 我的 ahm 里面做了分流, 国内的域名写了个名单, 走国内的 dns over https, 国外的域名和我没有维护的域名, 全部走谷歌的 doh, 也就是 https://8.8.8.8/dns-query https://8.8.4.4/dns-query. 解析出来以后, 该直连的直连, 该代理的代理.
流程图如下图所示, 分流的同时保护了自己的隐私:
难点就在于, 8888这个doh如何也走代理. 所以要用到 clash meta for magisk 的 tun, 类似你在 clash for windows 见到的 tun 模式, 打开后, 系统网卡列表里面会多出一个 clash tunnel. 那么安卓手机上也是一样, 会在 ifconfig 网卡列表中多出一个可以自定义名称的 tun 网口. 下面我把配置贴出来. 大家使用的时候用在线的 yaml 检测工具检测一下语法, clash meta 出问题可能就是因为空格没对齐.
注意下面的配置是 meta 的, 我不想用 premium 之类的核因为它的部分功能不全, 之前已经列出来过几条. 下面的配置代码中, meta 专属配置我也会备注.
第一段配置:
mixed-port: 0 #在安卓手机上, 这些端口都可以不用开
port: 0
redir-port: 0
tproxy-port: 0
socks-port: 0
allow-lan: true #允许局域网, 可以关掉. 当然如果你有usb共享/热点共享的需求, 可以打开.
bind-address: '*'
mode: rule #规则模式, 下面的rules节点要自己维护.
log-level: error #日志记录级别error, 调试的时候可以写成 debug, 调试完记得改回来
ipv6: false #不开ipv6
tcp-concurrent: false #meta专属配置, 如果dns返回多个IP, 将全部并发连接, 最终选择握手最快的IP进行连接. 访问CDN会给机场造成压力, 我关了
unified-delay: true #meta专属配置, http204的真实延迟时间检测, 经过测试和与adguardhome返回结果的时间对比, 打开更准确一些. 感谢大佬的帮助. 参见
adapter/adapter.go的代码"unifiedDelay".
geodata-mode: true #meta专属配置, true使用.dat, false使用.mmdb
geodata-loader: memconservative #geodata载入内存用小内存模式还是标准模式, 标准模式就换成 standard 我的geoip只有170多K, 也不用geosite, 所以测试看不出两者差距.
geox-url: #meta专属配置, 自定义geo的更新地址. meta默认是完整版, 我只需要geoip精简版, private和cn就够了.
geoip: https://raw.githubusercontent.com/Loyalsoldier/geoip/release/geoip-only-cn-private.dat
#mmdb: https:// #指定mmdb的
#geosite: '' #如果不需要, 可以强制留空, 就写两个单引号
external-controller: 127.0.0.1:9090 #浏览器访问http://127.0.0.1:9090/ui来管理
external-ui: clash-dashboard #你安卓手机clash目录下的管理面板网页的文件夹,是一些html和js, 可以
下载meta专用的yacd.
#tcp-concurrent: true #meta专属配置, tcp并发连接, 作用自己看完整配置示例
#enable-process: true #meta专属配置, 允许进程名, 配合下面的rules使用, 可以分应用来写rules规则.
sniffer:
enable: false #meta专属配置, SNI嗅探我没开, AdguardHome应该够用了.
profile:
store-selected: true #保存上次使用的节点, 文件会存在clash配置目录的cache.db中
store-fake-ip: false #保存fake-ip地址, 用不上这个功能. 因为我的dns和adguardhome对接
dns:
enable: true
listen: 127.0.0.1:5335 #我的adguardhome magisk
nameserver:
- 127.0.0.1:5353 #我的adguardhome magisk
default-nameserver:
- 223.6.6.6 #只能是IP, 且不能是IP形式的doh dot doq等. 此功能用不上, 它是用来解析域名nameserver的, 如https://doh.pub/dns-query, doh.pub是域名, 所以要用到223.6.6.6解析出IP来. 我上面已经是IP了, 不用解析, 所以用不上.
#fallback: #fallfack用在这种场景, nameserver和fallback同时解析, 前面nameserver返回的IP不是CN的时候就会取fallback里的IP, #Proxy是下面第二段里走代理的 group name. Fallback 用不上, 因为我adguardhome magisk的8888走tun代理访问, 无劫持.
# - 'https://8.8.4.4:443/dns-query#Proxy' #走代理
# - 'https://1.0.0.1:443/dns-query#h3=true' #强制开启HTTP/3
# - 'https://8.8.8.8:443/dns-query#Proxy&h3=true' #走代理且强制开启HTTP/3
#fallback-filter: #dns 是无污染的 adguardhome magisk 8888, 所以用不上
# geoip: true
# geoip-code: CN #当nameserver解析到的IP不是CN时, 再走fallback
# geosite:
# - 'geolocation-!cn' #meta专属配置, 当geosite对应的国家不是CN时, 再走fallback
proxy-server-nameserver:
- https://120.53.53.53/dns-query #当下面节点服务器是域名时, 走这个dns来解析
tun:
enable: true
stack: gvisor #system和gvisor, 当在手机上ifconfig无法看到tun网口时, 可尝试另一种. 也可以试试lwip, 这个lwip是meta专属参数
device: tun #ifconfig里面可以看到的网口名
auto-route: true #meta专属配置, 自动路由,这块我不懂,照着默认配置来就行
auto-detect-interface: true #自动检测网口, 当你切换至流量/wifi时, 以及usb共享/热点共享, tun能自动识别上网的网口.
dns-hijack: #dns劫持, 设置成0.2可以和adguardhome magisk一起使用, adguardhome magisk 在 iptables NAT 上转发 53 至 adguardhome 的 5353端口, 这个hijack 和 adguardhome nat 转发没有冲突. 如果有问题可以尝试下面两个, 我对这块也不懂😂
- 198.18.0.2:53
#- 198.18.0.1:53
#- any:53
proxies: #静态配置, 维护起来较为麻烦, 我建议留空, 去配置下面的proxy-providers
proxy-providers:
机场1:
type: http
url: "clash格式的订阅链接"
path: 机场1.yaml
interval: 21600 #这么多秒更新一次订阅, 21600s=6h
health-check:
enable: false #健康检查, 用下面的url来检查这个组里面所有的节点
url: http://www.gstatic.com/generate_204 #HTTP204状态的链接
interval: 300 #每5分钟检查一次
机场2:
type: http
url: "clash格式的订阅链接"
path: 机场2.yaml
interval: 21600
health-check:
enable: false
url: http://www.gstatic.com/generate_204
interval: 300
机场3:
type: http
url: "clash格式的订阅链接"
path: 机场3.yaml
interval: 21600
health-check:
enable: false
url: http://www.gstatic.com/generate_204
interval: 300
#机场4, 可以继续写, 把上面的一段复制下来, 防止空格问题
proxy-groups:
- name: Proxy
type: select
proxies: #下面写每个订阅里面包含所有节点的group name. 在你订阅里找proxy-groups, 里面选一个包含全部节点的组名, 注意名字后面 type 是 select.
- 🚀 节点选择 #记住这些 proxy-groups.name
- port1
- port2
#- 机场4的 proxy-groups.name, 可以继续写, 记住这些顺序
- name: 🚀 节点选择 #改这
type: select
use:
- 机场1
filter: ^((?!(IAPL|群组|直连|官网|群组|套餐|剩余|更新订阅)).)*$ #排除正则, 排除这些关键字. 包含正则请自己发挥
- name: port1 #改这
type: select
use:
- 机场2
filter: ^((?!(IAPL|群组|直连|官网|群组|套餐|剩余|更新订阅)).)*$
- name: port2 #改这
type: select
use:
- 机场3
filter: ^((?!(IAPL|群组|直连|官网|群组|套餐|剩余|更新订阅)).)*$
#- name: 机场多可以继续写...
rules:
#- PROCESS-NAME,com.kiwibrowser.browser,DIRECT #配合第一段代码中的enable-process: true使用, 中间是包名, DIRECT则是指定这个应用程序直连.
- IP-CIDR,8.8.8.8/32,Proxy #adguardhome magisk里的两个dns, 我单独拉出来了, 让它们走代理.
- IP-CIDR,8.8.4.4/32,Proxy
- GEOIP,PRIVATE,DIRECT #内网IP直连, 如192.168
- GEOIP,CN,DIRECT #adguardhome magisk解析出来的CN IP走直连
- IP-CIDR,255.255.255.255/32,REJECT,no-resolve #adguardhome magisk专用的拦截IP, 比如拦截了sentry.io这个域名, 那么adguardhome magisk将返回255.255.255.255这个IP, 又因为rules这里面, 255.255.255.255这个IP是REJECT(拦截), 所以达到了去广告的效果.
- MATCH,Proxy #除了以上几条规则以外, 其它的全部走代理. 注意这个 Proxy 是我在proxy-groups里面起的组名, 不要以为Proxy就是代理, 它是个组名, 只不过组名里都是代理节点, 所以它才走了代理.
我用到的 clash meta for magisk 模块:
https://t.me/MagiskChangeKing/126
这个模块还带一个安卓APK的图形界面, 目前有这些功能: 开关, 查看流量使用/内存和CPU占用, 热更新配置(不用重启clash meta内核, 就可以让改动后的clash meta配置生效), 更新geo文件, 内部打开网页面板(不需要调起浏览器), IP检查, fast.com测速.
https://t.me/MagiskChangeKing/159
还有一个配置检测工具:
https://t.me/MagiskChangeKing/135