compassd / dcompass

A high-performance programmable DNS component aiming at robustness, speed, and flexibility
GNU General Public License v3.0
283 stars 23 forks source link

[FEAT] 希望能支持 v2ray 项目的数据文件。 #95

Open wy16W2pIilK1xgqN opened 2 years ago

wy16W2pIilK1xgqN commented 2 years ago

国内用户很多需要使用基于域名和IP的数据分流,用户自行维护这些数据比较麻烦。

v2ray项目的子项目 ,维护了 域名和IP 的分类数据,使用 V2Ray dat 格式文件。 该文件维护良好,被众多项目和用户使用。 希望开发者能完整支持。

另外,对于软件用的各种数据文件,希望能够检查变化,自动重新载入。 这样就能避免修改数据后重启软件了。

项目链接 https://github.com/v2fly/domain-list-community https://github.com/Loyalsoldier/geoip https://github.com/Loyalsoldier/v2ray-rules-dat

LEXUGE commented 2 years ago

可以考虑支持dat格式,但这需要我手动去逆向一下dat文件是如何编码的。

自动重新载入可能需要重新设计并发模型。目前数据文件是在init阶段只创建一次的,如果需要自动重载会有较大的performance penalty以及更大的内存占用。我暂时没想到更好的办法

wy16W2pIilK1xgqN commented 2 years ago

谢谢回复。 编程的我不懂,应该不需要逆向,v2 项目应该有开源Go代码的,数据编码没啥秘密, 只是如何 用Rust 实现 就需要开发者费心了。 有类似的基于GO的DNS项目,也许能带来一些灵感。 https://github.com/IrineSistiana/mosdns

对于自动载入,我的想法是并不需要保证实时性和内存占用,主要是要避免用户干预。 可以搞成类似于自动重启,只要保留缓存就行了。

大体逻辑是,dcompass 周期检查文件,发现文件变动后, 拉起一个新的实例(或者线程、进程之类的,术语我不太懂)载入数据。 新实例完成启动前,旧的继续处理,拉起完成后新数据流向新实例。

然后在清理旧的实例就行了,过程中主要是要保证解析缓存不丢失,就行了。

以后的优化就是 尽量传递已有数据,减少读取文件。

这么做最多也就内存占用短时间内翻倍罢了。 我想一般用户是能接受的。

snylonue commented 1 year ago

@LEXUGE 想试着实现一下 v2ray 数据支持,请问项目里域名匹配相关的代码有那些

LEXUGE commented 1 year ago

可以参考maxmind读取实现的相关代码。但是鉴于v2ray格式包含域名和IP,所以可能还需要加入dmatcher 之类的。