meta-rules-dat
meta-rules-dat copied to clipboard
对各种geo文件以及格式的疑问
你好,我读过mihomo的文档和meta-rules-dat的README后发现有一些东西并没有说明,不知道在这里问是否合适,如果有相关文档也麻烦贴一下,不胜感激。
Loyalsoldier/v2ray-rules-dat里只有一种.dat
格式,meta-rules-dat有.dat
, .db
, .mmdb
, metadb
,这几种格式有什么区别?
Loyalsoldier/v2ray-rules-dat里只有geoip
和geosite
两个文件,meta-rules-dat多了一个country.mmdb
,这个文件有什么特殊作用?
mihomo配置里的geodata-mode
只提到了.dat
和.mmdb
,其他两种格式是否不被mihomo支持?
mihomo配置里的geox-url
为什么有单独的mmdb
选项,mmdb
和asn
貌似不受geodata-mode
的限制?
我也有此疑惑,文档没解释清楚
我也不清楚, 另外我还不清楚 rule-set 内引用 meta branch 的和 geoip/site 什么区别,有多少重叠。 我这两天看了一些高 star 分享,很多配置都是一大堆 rule-providers 和 rule,但其实有很多都重叠。
今天早上粗略查了下,说下我的理解,可能不准确。
-
geosite.db: clash 源码里未发现读取的地方, 猜测 clash 不支持此格式
-
geosite.dat: 源码 path.GeoSite, 存放域名的地方, 这些域名会按照一定规则分组称为 域名类别, 比如
domain:ip.cn
属于cn
;domain:git.io domain:githubusercontent.com
属于github
. 这个文件可以通过 metacubex/geo 解压查看. -
country.mmdb: 格式是 maxmind 定义的 IP geolocation databases,用途是根据 ip 地址查询国家/城市/时区等信息,而名称的 country 是指只包含到国家的信息,而没有城市/时区,具体可容纳的信息见它的 pdf 说明 GeoLite2-IP-MetaData-Databases-Comparison-Chart. 而这个仓库的此文件来自 Loyalsoldier/geoip, 其在 maxmind 提供的标准基础上新增了域名类别(cloudflare/google...) 等等, 具体见其说明 与官方版 GeoIP 的区别
-
geoip.db/geoip.metadb: 根据源码 path.MMDB 来看 Country.mmdb/geoip.db/geoip.metadb 只会取一个用来比较 ip 归属国家的 (geoip.Match), 所以对于 clash 来说这三者可看作同一份数据, 以下简称为 Country.mmdb 系列
-
geoip.dat: 根据源码大量 C.GeodataMode (update_geo.UpdateGeoDatabases) 的判断来看, Country.mmdb 系列 和 geoip.dat 是二选一的. 而此仓库的来自 Loyalsoldier/geoip 所以其实这四种都是同一份数据的不同格式.
总结:
- Country.mmdb/geoip.db/geoip.metadb 和 geoip.dat 是二选一的, 四者内部都是同一份数据, 通过配置 GEOIP 数据模式 来决定.
- geosite.db 不支持
- geosite.dat 按照地区(cn...)/服务商(如 google/github...)等分组的域名(2024/07/20 补充: 一个组对应一个文件, 通过 rule 里 GEOSITE 引用, 按需加载--只会加载引用的)
- xxx-lite 就是 xxx 的精简版
2024/04/17 geosite.dat 数据概览:
geo unpack site ./geosite.dat -d sites ls sites -1 | wc -l # >>> 1257 dust sites # 16K ┌── meta │█ │ 0% # 16K ├── microsoft │█ │ 0% # 16K ├── tld-!cn │█ │ 0% # 16K ├── win-extra │█ │ 0% # 16K ├── win-update │█ │ 0% # 20K ├── beats │█ │ 0% # 20K ├── category-ads │█ │ 0% # 20K ├── category-ecommerce │█ │ 0% # 20K ├── category-games │█ │ 0% # 24K ├── category-ads-all │█ │ 0% # 28K ├── google │█ │ 0% # 32K ├── category-media │█ │ 0% # 36K ├── category-entertainment│█ │ 0% # 48K ├── apple │█ │ 1% # 96K ├── geolocation-cn │█ │ 1% # 124K ├── gfw │█ │ 2% # 140K ├── category-porn │█ │ 2% # 148K ├── category-companies │█ │ 2% # 520K ├── geolocation-!cn │███ │ 7% # 1.4M ├── cn │████████ │ 18% # 7.8M ┌─┴ sites │███████████████████████████████████████ │ 100%
@adoyle-h 可以看下我上面分享的, 有问题一起讨论
还有个问题,geosite.dat这个文件, meta-rules-dat的版本和v2ray-rules-dat版本的并不一样,country.mmdb和geoip.dat倒是一样的,不知道这两个有什么具体区别,根据Readme似乎是新增合并了一些域名数据,但是文件大小却小还了2MB,有点疑惑😂
还有个问题,geosite.dat这个文件, meta-rules-dat的版本和v2ray-rules-dat版本的并不一样,country.mmdb和geoip.dat倒是一样的,不知道这两个有什么具体区别,根据Readme似乎是新增合并了一些域名数据,但是文件大小却小还了2MB,有点疑惑😂
meta的geosite删去了大量category-ads-all域名规则
@potoo0 请问一下, 使用这些数据格式配置分流规则, 和直接使用类似rule-providers这种yaml文件有什么区别啊? 我看好像数据源都差不多, 我用的blackmatrix7/ios_rule_script@master的classical数据, 而且都有No_Resolve版本.
@potoo0 请问一下, 使用这些数据格式配置分流规则, 和直接使用类似rule-providers这种yaml文件有什么区别啊? 我看好像数据源都差不多, 我用的blackmatrix7/ios_rule_script@master的classical数据, 而且都有No_Resolve版本.
@NewEpoch2020
rule-provider 一般是把目标地址按照一些规律分组(规律自己随意), 比如我把 谷歌相关的域名全部收集起来,例如:
########## 注意这里的规则不写代理出口,下面三条是举例乱写的
DOMAIN-KEYWORD,google
DOMAIN-SUFFIX,google0000001.com
IP-CIDR6,22:22:22:22::7/32
然后配置 rule-provider 起名 gg, format=text, behavior=classical 指向我这段文件地址,
那么在 rule 下面就可以配置 RULE-SET,gg,出口-美国
,这样满足上面三条条件的目标地址就会使用出口“出口-美国”。
rule-provider 支持两种 format: yaml 和 text, 以及 三种 behavior: domain / ipcidr / classical
简单总结三种 behavior:
- domain: 只能写域名
- ipcidr: 只能写 ip 的 cidr
-
classical: 支持 rule 配置下面的所有, 例如:
SRC-PORT,9999
no-resolve: 如果访问域名例如 google.com 然后遇到了 IP-CIDR 的规则时,MetaCubeX 会尝试将 google.com dns解析成 ip 地址,然后拿解析的 ip 地址去判断是否命中 IP-CIDR 规则。而 no-resolve 就是告诉 MetaCubeX 这条 IP-CIDR 不要 dns 解析,那访问 google.com 就会永远不命中也就是会跳过这条 IP-CIDR 的规则。
总结:
- rule-provider 用途上和 geosite 类似:按照一些规律挑选出部分目标地址(相当于分组,从不计其数的目标地址中按照域名/地域/服务提供商等等分组),然后在 rule 里来指定此分组的代理出口,如
RULE-SET,gg,出口-美国
GEOSITE,google,出口-美国
。 而 rule-provider 比 geosite 更灵活功能更多,只要 rule 下面支持的这里都可以支持,比如 ipcidr / 应用程序名等等:IP-CIDR6,2620:0:2d0:200::7/32
,PROCESS-NAME,aria2
如果把 geosite 的内容的文件名作为 rule-provider 名称,对应文件内容作为 rule-provider 内容时,二者作用完全等价。
- rule-provider 的 behavior=classical 时支持配置 "rule配置" 下面的规则,即相比 domain 和 ipcidr 额外支持
DOMAIN-SUFFIX
,SRC-PORT
,PROCESS-NAME
等等 - no-resolve: 遇到 ip 地址的规则时,跳过域名的 dns 解析。目标地址是域名的话就会跳过此 ip 规则,作用是可以防止墙内 dns 污染
@potoo0 听起来感觉各有利弊, rule-provider更灵活, 而且方便查看里面的规则. geosite的话配置文件就很简洁. 那么它们的执行效率其实没差吧? 是不是都是提前把规则加载到内存里去了, 然后每次都按顺序比对.
@potoo0 听起来感觉各有利弊, rule-provider更灵活, 而且方便查看里面的规则. geosite的话配置文件就很简洁. 那么它们的执行效率其实没差吧? 是不是都是提前把规则加载到内存里去了, 然后每次都按顺序比对.
@NewEpoch2020 粗略看了源码,匹配效率没差,都需要展开一行行逐个判断是否命中。
不同的是:
- geosite 是在启动时按需加载,按需就是说只有 rule 里引用的才会实际加载。比如 geosite 有 100 个文件(分组)只使用了其中一个组如 google,那就只会加载 google 这一个组。
- rule-provider 启动时全部加载,不管 rule 里有没有引用,考虑实际中乱加不使用的 rule-provider 人应该不多,浪费不了多少内存。
相关源码位置:
- geosite 按需加载:
- rule-provider 加载:
测试入口: rules_test.txt