MetaCubeX / mihomo

A simple Python Pydantic model for Honkai: Star Rail parsed data from the Mihomo API.
https://wiki.metacubex.one
MIT License
16.44k stars 2.64k forks source link

[Feature] 支持 域名关键字 通配 和 程序关键字 通配 #846

Closed maxming2333 closed 3 weeks ago

maxming2333 commented 1 year ago

Verify steps

Description

目前有一个强烈的诉求 就是以某个字符串为关键字(比如品牌名称 baidu、ali、163,因为一般品牌都会申请很多相似域名,很多都给企业内网使用),只要命中了,就走对应的 DNS,形如:

minimatch 形式命名

nameserver-policy:
  '*baidu*': ['dhcp://en0', 'dhcp://en1'] # 表示匹配只要域名中含有 baidu 关键字的域名,a.b.c.baidu、a.f.baiduai.cc、a.f.eebaiduai.cc、a.xxbaiduxx.haha.com
  '*.ali*': ['dhcp://en0', 'dhcp://en1'] # 表示匹配包含 .ali 的域名,a.b.c.alibaba.com、a.b.c.alimama.com.cn

同理,PROCESS-NAME 也需要这种功能

rules:
- PROCESS-NAME,foo,Proxy # 只要程序名称包含 foo 这个字符串即可

或者使用正则,在加载配置后,直接缓存对应正则对象,这样就不用每次流量进来都需要 new 一次正则对象了,提升域名匹配性能


文档:

Possible Solution

No response

Paulgudring commented 11 months ago

Feature 2 will be of great help.

I use a diy rule-set direct(classical one, which consists of domain and geo rules) for proxy-direct routing and dns diversion. It works well.

I add wechat mini program (WeChatAppEx.exe) process rule. Most of the website domains it accesses are not covered by geosite, and I don't want dns-resolve. I supposed it conform with the nameserver-policy usage of rule-set. But it doesn't work. I figured out it is because nameserver-policy usage of classical rule-set is to unfold the domain and geo rules while other rules is unsupported.

Is it possible to implement the feature of supporting more types of rules (port, process, and even logic rules) in nameserver-policy? This would help make meta(mihomo, now) the most powerful proxy & dns-resolve tool.

Skyxim commented 11 months ago

~PROCESS-NAME 是无法实现的,需要获取流量来源程序,一般 DNS 来源皆为系统~ 理解错误,是正则匹配进程名;不过正则表达式相当耗费时间,虽然是能缓存正则表达式对象,可是每次匹配依旧是大量匹配的

maxming2333 commented 11 months ago

@Skyxim 是这样滴,因为某些进程故意会加一些 零宽字符 导致就算复制了进程名称,也无法匹配上 然后现在很多都是基于 Electron 开发的应用程序,经常会带有 xxx.app 和 xxx Helper.app 包括一些 fork 出的进程 就是一个软件,变身出来的有很多个,我这样我们可以直接使用关键字去做分流

正则主要是想着方便易用,或者您看看是否还有其他更好的实现方法

Paulgudring commented 11 months ago

~PROCESS-NAME 是无法实现的,需要获取流量来源程序,一般 DNS 来源皆为系统~

我把maxming提出的讨论扭歪了,不好意思。无法实现的原因理解了!谢谢~

john5du commented 11 months ago

感觉关键字匹配会导致搜索复杂度指数级上升,dns的性能也会下降。

dycwuxing commented 11 months ago

我之前一直在nameserver-policy字段里用ruleset做一些细化的分流,但是1.17开始失效了,你可以试试1.16的

Skyxim commented 11 months ago

引入一个 DOMAIN-REGEX 算了,分流也能用,不过的确非常影响性能

maxming2333 commented 11 months ago

其实第一个,我已经通过另外的方法实现了,就是使用 rule-providers

config.yaml 内容:

dns:
  nameserver-policy:
    'rule-set:tencent': ['dhcp://en0', 'dhcp://en1', '10.1.2.3', '10.4.5.6'] # 因为有 rule-set 这个操作,所以可以使用 rule-providers 来实现功能

rules:
- RULE-SET,tencent,Office # 这里主要是触发 rule-providers 的下载行为,并且也可以把命中的规则分流到 Office 对应的 proxies 里面

rule-providers:
  tencent:
    type: http
    behavior: classical
    url: http://127.0.0.1:8013/tencent.yaml
    path: ./Rules/tencent
    interval: 100

tencent.yaml 内容:

payload:
  # > Tencent Intranet
  - DOMAIN-SUFFIX,qq.com
  - DOMAIN-KEYWORD,qq
  - DOMAIN-KEYWORD,tencent

但是第二个问题,因为目前 PROCESS-NAME 是全匹配,所以确实没有其他替代的方法

希望能增加一个 PROCESS-KEYWORD 或者 PROCESS-GLOB 或者 PROCESS-REGEX

maxming2333 commented 11 months ago

以下规则里面,包含一个 零宽字符,可以看看

rules:
- PROCESS-NAME,kkkkk​ Helper,Office
dycwuxing commented 11 months ago
rule-providers

请问你用的是哪个版本号的核心?1.17吗?

maxming2333 commented 11 months ago
image
maxming2333 commented 11 months ago

这个版本应该也是支持滴 v1.17.0

仔细读了一遍文档配置后,发现这个功能其实很早就支持了 @dycwuxing

maxming2333 commented 11 months ago

我是被这段注释启发滴 @dycwuxing https://github.com/MetaCubeX/mihomo/blob/Meta/docs/config.yaml#L262-L264

dycwuxing commented 11 months ago

我是被这段注释启发滴 @dycwuxing https://github.com/MetaCubeX/mihomo/blob/Meta/docs/config.yaml#L262-L264

谢谢,这个功能确实很早就支持了,但我自己测试下来,1.17是没生效,如果换成geosite:cn就没问题,或者核心回退到1.16也没有问题,所以想和你确认下大概的版本~

2023-12-04 16:35:58 INFO - [clash]: DEBU[2023-12-04T16:35:58.696764+08:00] [DNS] resolve www.baidu.com from tls://1.1.1.1:853 2023-12-04 16:35:58 INFO - [clash]: DEBU[2023-12-04T16:35:58.696764+08:00] [DNS] resolve www.baidu.com from tls://1.1.1.1:853 2023-12-04 16:35:58 INFO - [clash]: DEBU[2023-12-04T16:35:58.696764+08:00] [DNS] resolve www.baidu.com from https://1.1.1.1:443/dns-query 2023-12-04 16:35:58 INFO - [clash]: DEBU[2023-12-04T16:35:58.696764+08:00] [DNS] resolve www.baidu.com from https://1.0.0.1:443/dns-query 2023-12-04 16:35:58 INFO - [clash]: DEBU[2023-12-04T16:35:58.696764+08:00] [DNS] resolve www.baidu.com from https://1.0.0.1:443/dns-query 2023-12-04 16:35:58 INFO - [clash]: DEBU[2023-12-04T16:35:58.696764+08:00] [DNS] resolve www.baidu.com from https://1.1.1.1:443/dns-query

dns: nameserver:

rule-providers: ChinaMax_Classical: url: https://raw.githubusercontent.com/blackmatrix7/ios_rule_script/master/rule/Clash/ChinaMax/ChinaMax_Classical.yaml path: ./rule_provider/clash/ChinaMax_Classical.yaml type: http behavior: classical interval: 3600 format: yaml image

maxming2333 commented 11 months ago

其实第一个,我已经通过另外的方法实现了,就是使用 rule-providers

config.yaml 内容:

dns:
  nameserver-policy:
    'rule-set:tencent': ['dhcp://en0', 'dhcp://en1', '10.1.2.3', '10.4.5.6'] # 因为有 rule-set 这个操作,所以可以使用 rule-providers 来实现功能

rules:
- RULE-SET,tencent,Office # 这里主要是触发 rule-providers 的下载行为,并且也可以把命中的规则分流到 Office 对应的 proxies 里面

rule-providers:
  tencent:
    type: http
    behavior: classical
    url: http://127.0.0.1:8013/tencent.yaml
    path: ./Rules/tencent
    interval: 100

tencent.yaml 内容:

payload:
  # > Tencent Intranet
  - DOMAIN-SUFFIX,qq.com
  - DOMAIN-KEYWORD,qq
  - DOMAIN-KEYWORD,tencent

但是第二个问题,因为目前 PROCESS-NAME 是全匹配,所以确实没有其他替代的方法

希望能增加一个 PROCESS-KEYWORD 或者 PROCESS-GLOB 或者 PROCESS-REGEX

@dycwuxing 建议你按照我这种配置,如果没有 Office 的 proxies,可以直接写成 DIRECT 另外大小写尽量统一,rule-providers 的名称,和 rule-providers path 路径 和 尽量保持一致

wanzhiyu commented 9 months ago

对于第2个需求,也就是PROCESS的blob或正则匹配,我也觉得很有必要,尤其是同一个文件夹路径下有大量需要代理的子程序时,使用完整路径的规则写起来会很麻烦。可以单独开一个PROCESS-GLOB 或者 PROCESS-REGEX功能,用于正则匹配程序路径,并且允许缓存正则结果,具体执行的性能可以由用户自己承担。

xishang0128 commented 3 weeks ago

process-name-regex也已经支持了,该issues将被关闭