dcompass - 纯 Rust 实现的高性能混合 DNS 服务器

2020-11-18 10:03:20 +08:00
 LEXUGE

https://github.com/LEXUGE/dcompass

具体内容都在 GitHub 里,功能大概为: 高速( 760 qps ) 自由路由规则,支持递归嵌套,且提供完整运行前功能检查 支持 DoH (未来支持 UDP ) 缓存持久化,应对恶劣网络环境 应对网络环境热切换(不会出现 SmartDNS Wi-Fi 换 4G 直接 DoH 断连的问题) IPv6 AAAA 屏蔽 选择性 SNI 发送,防止 SNI 被侦测 纯 Rust 实现 轻量域名匹配( 160 us per match )

目前自用体验良好,deploy it and forget it 自测速度快于 smartdns ( 640 qps )

nixos 用户可以看一下 https://github.com/icebox-nix/netkit.nix ,内含打包好的 dcompass 以及可以直接使用的 nixos module

9509 次点击
所在节点    DNS
69 条回复
billzhuang
2020-11-18 11:15:49 +08:00
支持下,阅读代码中
no1xsyzy
2020-11-18 11:17:06 +08:00
建议发 /go/create
lbp0200
2020-11-18 11:34:29 +08:00
异步模型用的协程吗?
LEXUGE
2020-11-18 12:15:52 +08:00
@lbp0200 (不是很了解具体术语)是基于 tokio runtime 的,目前因为 tokio 0.2 和 0.3 的迁移,upstream 是 single-threaded 的,event loop 是 multi-threaded. 未来迁移以后可能性能会更好一些
xarthur
2020-11-18 12:19:58 +08:00
支持 ipset 吗?
tpsxiong
2020-11-18 12:36:16 +08:00
支持 unbound 那样的迭代查询不
LEXUGE
2020-11-18 13:05:56 +08:00
@xarthur 目前还不支持,但是代码设计的时候就考虑到这点了
LEXUGE
2020-11-18 13:06:58 +08:00
@tpsxiong recursive query 吗,只要请求写了 recursive needed 的话上游就会支持,因为实际上这是一个 DNS 转发服务器
shynome
2020-11-18 13:13:03 +08:00
qps 要讲在什么配置下的,不同配置下的 qps 不同
LEXUGE
2020-11-18 13:17:57 +08:00
@shynome 我给两个测试用了相同语义的配置。虽然数据会有变化,但是还是能反应在相同网络环境和相同设备上的速度的。
Jirajine
2020-11-18 13:28:14 +08:00
不错,正好也想用 rust 实现一个 dns 转发器。
提几个建议:
1. 配置文件支持 yaml/toml 。
2. 把核心逻辑抽出来写成 lib,方便调用。
3. 支持更多规则,正则、abp 等。
4. 支持扩展插件,弄个 Python 脚本或者像 coredns 一样留个框架让用户自己添加代码再重编译。
Jirajine
2020-11-18 13:31:10 +08:00
以及 smartdns 特有的 过期缓存、prefetch 、速度测试等,这样就可以完全替代,解决 smartdns 仅 Linux 可用的问题。
LEXUGE
2020-11-18 13:43:57 +08:00
@Jirajine 插件还未考虑,不过核心逻辑 droute 是一个 lib,且提供 trait 支持自己实现匹配规则
Jirajine
2020-11-18 13:53:54 +08:00
@LEXUGE 我这里指的插件主要是 hook,让用户在处理请求时注入自己的自定义代码。
大概是这样:
fn process_dns(&c: Context){
plugin_A(c);
plugin_B(c);
// 用户自己实现一个函数或类型,然后插入到这里。
}
然后在你自己的核心逻辑中调用 process_dns 函数。
tpsxiong
2020-11-18 14:52:11 +08:00
@LEXUGE iterative dns query
zro
2020-11-18 15:22:43 +08:00
能不能像 dnsmasq 那样可以有 add-subnet 选项,配合上游 EDNS 。。

好像没找到其他能 add-subnet 的 DNS 转发,包括 unbound~~
LEXUGE
2020-11-18 21:40:54 +08:00
@zro 目前只做了包转发,added to the todo list
INTEL2333
2020-11-18 23:53:32 +08:00
话说大佬,能不能做个双栈 EDNS
v4 和 v6 非同一个运营商提供的时候非常难受

比如 A 记录走 8888,AAAA 记录走 2001:4860:4860::8888

或者

向 8.8.8.8 发送两次查询,EDNS 分别对应 v4 和 v6
zro
2020-11-19 00:41:47 +08:00
@INTEL2333 #18 应该跟你差不多,v6 是 HE 的,能说下你是什么方案吗?
我现在的方案不太成熟,要开两个 unbound,其中一个只查 v6 。。。
INTEL2333
2020-11-19 08:13:30 +08:00
@zro 我现在是开了 2 个 adgh

adgh1 是 v4 only

adgh2 是选优模式,上游 adgh1 和 2001:4860:4860::8888

不过出结果太慢了

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/726539

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX