星期日, 一月 15, 2023

161 clash meta windows 内核, 以服务模式运行

前面的文章提到, meta内核一些方面做得很好, 比如代理服务器可以单独配置dns来解析, rules provider的url域名, 也可以根据rules判断规则进行解析. 这货也有十分气人的地方, 那就是以服务模式运行. 

最近一直在研究clash, 包括premium和meta两个分支. 最后选择了meta, 但是这货以服务运行一直有问题, 有大问题...

我倾向于把meta核做成系统服务, 因为服务可以在用户登录windows前运行起来, 而开机自启项不行, 必须是用户登录后.

如果直接写一个sc, 带上meta.exe和配置文件目录.\data, 它会在运行了几分钟之后闪退(我的yaml配置没有任何问题)

sc create "1meta" binpath= "%~dp0meta.exe -d \".\data\"" start= auto displayname= "1meta" type= own error= ignore

如果我写一个独立的exe, 让这个独立的exe注册为服务, 每次开机把clash meta内核调起来, 那么会有两种情况: 
要么我的独立exe无法调起meta内核, 就这样一直几M的内存占用; 

要么就是他妈的调起来meta内核, 内核1GB+的内存占用;

尝试用clash for windows 的 service.exe 小工具注册服务, 问题依旧. 
尝试用 administrator 身份以服务方式自启独立exe或者meta内核, 问题依旧. 
尝试把服务注册成 start= delayed-auto (延迟自启动), 有时候行, 有时候不行, 而且这个等的时间太长了. demand (手动) 这个也不行. 
尝试把服务注册成 type= share 也不行. 服务名后面还会出现几位随机字符. 


我怀疑过自己写的独立exe有问题, 但又能有啥问题... 就三行代码, 两行引用库, 一行执行进程(非shell), 在登录进系统之后, 双击这个exe都能正常运行. 


为啥clash meta以服务模式运行做不好, 我怀疑是这货在静默状态(loglevel: silent)依旧进行初始化时的日志输出.

最后找到了个工具 AlwaysUp, 有点类似 linux 的 supervisord, 守护进程监控的一款软件, 简单配置一下就行. 以管理员身份运行, 不要以默认的system身份运行. 没错, 权限要低一点, 不然抽风... 另外, 建议把内存占用监控打开, 还有开机后等待x秒后再运行, AlwaysUp这个破解版很多, 有注册机, 自己找吧. 发几张截图: 





守护服务的进程占用也就4MB左右. Clash meta 进程占用约40-50MB左右. 

我也不知道为什么用了一个工具它就正常了... 总之凑合用吧, 额外4MB内存的服务自启项我还是给得起的. 


当前clash meta内核版本号: 1.14.1

160 安卓手机 clash meta for magisk 和 adguard home magisk 组合使用, 以及 config.yaml 的常用参数解释

最近研究代理工具上瘾, 其实也是为了更好地上网😂 前面研究了 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


#部分参数甚至官方文档也没有提及, 从代码里可以大致看到其作用: config/config.go
#下面是第二段配置

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

星期三, 一月 11, 2023

159 虚拟币(USDT)的转账手续费

最近在研究机场, 部分机场的第四方手续费都是6% 8%的, 但也发现一些机场的付费方式支持 USDT (TRC20链路), 我看机场的 USDT 转账方式付费都没有手续费, 20块的月付就收20. 

结果他妈的掏了些钱, 买了点 USDT, 发现 Withdraw(转账给别的地址) 的手续费他妈的离谱!!!

欧易的 USDT TRC20 链路转账手续费是 0.8 USDT, 也就是 $0.8 左右. 


币安更他妈离谱, 1 USDT, 也就约为 $1...

https://www.binance.com/en/fee/cryptoFee

买一个十几块二十几块月付的机场, 我他妈的还得交这么高的手续费, 

星期一, 一月 02, 2023

158 利用 Javascript, 让 Clash For Windows 的 mixin 同时支持多个机场切换, 而不用频繁修改 MATCH (以及 yaml + 多机场 的 proxy-providers 写法)

在154号文章中讲到, 利用混合配置 Mixin 将 Clash For Windows 和 AdGuard Home 组合起来使用, 但是 mixin 使用的 Yaml 是静态的, MATCH后面跟的是组名, 每个订阅的组名又不一样, 这就是说, 每次切换节点我还得改, 十分蛋疼. 

于是我在这里找到了解决方法, 从 Yaml 切换成 Javascript. 博主的代码中好像有些错误, 因为它在我这运行报错... 规则也会反过来, MATCH跑到第一位去了... 我也都将其改正了. 
注意 'GEOIP,CN,DIRECT', 'IP-CIDR,255.255.255.255/32,REJECT,no-resolve', 这两句的顺序不能写反了, 我测试发现写反了会导致 AdGuard Home 屏蔽掉的域名又特么被拉进代理解析了... 

我的需求: DNS 走我的 AdGuard Home, 局域网流量直连, 解析出来的 CN IP 直连, 其余一律走代理, 无流媒体需求. 

自己按需修改规则即可. 注意, 如果用 tun 不要使用 fakeip dns 模式, 不然你外部自建的 dns 就废了. 


module.exports.parse = ({ content, name, url }, { yaml, axios, notify }) => {


    // 通用设置

    content['mixed-port'] = 1081;

    content['allow-lan'] = true;

    content['ipv6'] = false;

    content['bind-address'] = '*';

    content['mode'] = 'rule';

    content['log-level'] = 'error';

    content['unified-delay'] = true;

 

    //DNS

    content.dns = {

        'enable': true,

        //'listen' : '127.0.0.1:5335', 

        'nameserver': [

            '192.168.10.1:5335'

        ],

        'default-nameserver': [

            '192.168.10.1:5335'

        ]

    };


    // 自定义 DIRECT / REJECT 条目

    //先清空 rules 以达到覆盖的效果

    content['rules'] = []; 

    [

        'IP-CIDR,192.168.0.0/16,DIRECT,no-resolve',

        'IP-CIDR,10.0.0.0/8,DIRECT,no-resolve',

        'IP-CIDR,172.16.0.0/12,DIRECT,no-resolve',

        'IP-CIDR,127.0.0.0/8,DIRECT,no-resolve',

        'IP-CIDR,100.64.0.0/10,DIRECT,no-resolve',

        'IP-CIDR6,::1/128,DIRECT,no-resolve',

        'IP-CIDR6,fc00::/7,DIRECT,no-resolve',

        'IP-CIDR6,fe80::/10,DIRECT,no-resolve',

        'IP-CIDR6,fd00::/8,DIRECT,no-resolve',

        'GEOIP,CN,DIRECT',

        'IP-CIDR,255.255.255.255/32,REJECT,no-resolve',

    ].forEach(rule => {

        content.rules.push(rule);

    });


    // 自定义走梯子的条目, 无需写尾部的后缀, 末尾带上逗号

    const customProxy = [

        'MATCH,',

    ];


    // 需要对每个 Plan 配置相应的 GroupName

    var proxyGroupName = '';


    if (name == '订阅名1.yaml') {

        proxyGroupName = 'proxy';

    } else if (name == '订阅名2') {

        proxyGroupName = '🚀 节点选择';

    } else if (name == '订阅名3') {

        proxyGroupName = '🔰国外流量';

    }

    // 还可以继续添加


    customProxy.forEach(rule => {

        content.rules.push(rule + proxyGroupName);

    });


    // Debug

    // axios.get('http://localhost:4016/openFile?path=' + yaml.stringify(content));

    return content;

}



更新:  其实 yaml 也行, 只不过它那个空格太厦碧, 我从网上东拼西凑总是报错, 下面是测试能用的. 成功的标志是, 常规 - Clash 核心( API 端口) 右边有个小芯片图标, 点开有你修改的 mixin 的内容, 而且主界面左侧会多出来一个 "服务商".  博客复制出来的代码可能还会有缩进问题, 请仔细检查, 妈的真的服了 yaml 了...

mixin:

  mixed-port: 1081

  allow-lan: true

  bind-address: '*'

  mode: rule

  log-level: error

  ipv6: false


  dns:

    enable: true

    #listen: 127.0.0.1:5335

    nameserver:

      - 192.168.10.1:5335

    default-nameserver:

      - 192.168.10.1:5335

 

  proxy-providers:

    机场1:

      type: http

      url: "填节点订阅网址, 如果是v2board的机场面板, 记得加上 &flag=clash"

      path: 机场1.yaml

      interval: 21600

      health-check:

        enable: true

        url: http://www.gstatic.com/generate_204

        interval: 300


    机场2:

      type: http

      url: "https://v2board的面板订阅/api/v1/client/subscribe?token=123&flag=clash"

      path: 机场2.yaml

      interval: 21600

      health-check:

        enable: true

        url: http://www.gstatic.com/generate_204

        interval: 300


    机场3:

      type: http

      url: "https://sspanel的面板订阅/link/123?clash=1"

      path: 机场3.yaml

      interval: 21600

      health-check:

        enable: true

        url: http://www.gstatic.com/generate_204

        interval: 300


  proxy-groups:

    - name: Proxy

      type: select

      proxies:

        - cnix  #这里填机场提供的订阅里面, 含有一堆节点的那个组名(proxy-groups底下的name, 一般在type: select的前面, 我这里是随便举例写了个cnix)

        - 代理流量

        - amy

      

    - name: cnix  #和上面对应

      type: select

      use:

        - 机场1

      

    - name: 代理流量

      type: select

      use:

        - 机场2

      

    - name: amy

      type: select

      use:

        - 机场3


  rules:

    #- 'PROCESS-NAME,clash,REJECT' #安卓上防止回环, win上没见出问题

    - 'GEOIP,PRIVATE,DIRECT'

    - 'GEOIP,CN,DIRECT'

    - 'IP-CIDR,255.255.255.255/32,REJECT,no-resolve'

    - 'MATCH,Proxy'