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

9223 次点击
所在节点    DNS
69 条回复
LEXUGE
2020-11-21 19:02:42 +08:00
目前支持的架构有 x86_64-unknown-linux-musl, armv7-unknown-linux-musleabihf, armv5te-unknown-linux-musleabi, x86_64-pc-windows-gnu, x86_64-apple-darwin, aarch64-unknown-linux-musl 。
已经测试的设备有:windows, linux, raspberry pi 3B+ (openwrt,使用 aarch64 ),都可以直接下载运行
可能有问题的架构:apple-darwin (不知道为什么, GitHub Action 的 Catalina 编译出来 linker 会炸)
未来可能会支持: mips
大部分的架构都使用了 musl 静态编译,尽可能无依赖,欢迎测试
有新的架构想加入 release 编译的 list 可以留言
fengjianxinghun
2020-11-21 20:00:44 +08:00
我也有个类似的。。。
静态插件是这样
pub static GLOBAL_MODULE_TABLES:Lazy<Mutex<Vec<Box<dyn Fn() -> Box<dyn PFilter<Output=PAction> + Send> + Send>>>> = Lazy::new(|| .....

然后在 async/await hook 点生成新的 trait PFilter 对象
fengjianxinghun
2020-11-21 20:10:36 +08:00
还有,既然是 rust 。按照传统,建议支持 toml 配置。
ysc3839
2020-11-21 20:13:18 +08:00
请问目前有实现 overture 的功能吗?
希望实现先查询 A DNS,如果返回的 IP 数据匹配某个列表再去查询 B DNS,并返回 B DNS 的结果。
目前似乎只有 overture 能实现这样的逻辑。
LEXUGE
2020-11-21 21:46:03 +08:00
@fengjianxinghun 求链接? toml 考虑支持
@ysc3839 后期打算加入复杂服务端的配置(如 DoH 服务端),以及更加自由的路由配置(有点搞得像 table 了),这样可以部署在自己的服务器上
LEXUGE
2020-11-21 21:48:25 +08:00
@ysc3839 这么做其实有 blacklist 的意思,但是 IP blacklist 很难维护且感觉过滤效果不好。目前 dcompass 只支持 prequery 的 routing.
ysc3839
2020-11-21 21:54:47 +08:00
@LEXUGE 这里的 list 是中国的 IP 地址,感觉是比较好维护的。主要是为了解决 CDN 的问题。
LEXUGE
2020-11-22 15:37:28 +08:00
@ysc3839 加入 todo list
LEXUGE
2020-11-30 11:34:24 +08:00
新增加了 mock test,忽略掉网络因素下 qps 为 100000 。
实际测试(网络环境好时):2500 qps
在网络环境差且请求量大时,增加了可选的 ratelimit (使用 token bucket 实现)

下一步将设计一个简单灵活的路由规则语法
JBaker
2020-12-03 11:24:56 +08:00
请问有中文的说明文件吗?
实在不想再看英文的帮助了(躺)
JBaker
2020-12-03 11:43:34 +08:00
问一下,chche_size 的单位是什么呢?条目?字节? MB ?
==============
我觉得还能接着加功能
- 比如对 纯 ipv6 用户 还有 教育网用户(ipv6 免流的) 添加“如果有 ipv6 地址,则只返回 ipv6 地址”的控制项(例如可以叫做 ipv6_only 或者 disable_ipv4)
- 比如自定义 DNS 解析结果的 hosts
- 比如,如果没有加配置文件进来,就弹出界面,傻瓜式地生成配置文件 (能偷懒为何要费劲写 json 呢?还容易打错字。)
- 比如,指定日志文件和缓存文件的保存位置(我想存到内存盘里)
- 比如,添加“以服务方式安装和自启动”(脚本可以抄 dnscrypt 的 service_install.bat)

暂时就想到这么多。折腾是永不停止的。折腾完,程序运行就慢下来了 ohhhhhhh
JBaker
2020-12-03 11:49:08 +08:00
上一行是 cache_size,又打错字了。
还有,如果我的 upstream 填的是 根服务器的 IP,能正确的处理请求吗?
还有,我想同时监听 127.0.0.1:53 和 [::1]:53,该怎么填?花括号"address":{"127.0.0.1:53","[::1]:53"}还是 "address": ["127.0.0.1:53","[::1]:53"],亦或者是"address": "127.0.0.1:53","address": "[::1]:53",写两行?
JBaker
2020-12-03 13:38:56 +08:00
Error: 远程主机强迫关闭了一个现有的连接。 (os error 10054)
issues/2
我就随便打开一个网站就这样了。
LEXUGE
2020-12-03 15:58:49 +08:00
@JBaker 前两个都可以通过未来的路有规则实现。
生成配置可能没有,不过如果不喜欢 json 未来可以支持 TOML 。
缓存文件持久化意义不大,DNS 结果很容易过期的...日志可以考虑
服务的话 linux 下我写了 systemd service unit,windows 我不太会,欢迎 PR
cache_size 的单位是 per record.
LEXUGE
2020-12-04 08:28:42 +08:00
@JBaker 已修复(
原因是某些应用会发多个请求,却在第一个请求收到后就走掉了,导致 socket 挂了(
LEXUGE
2020-12-05 16:15:23 +08:00
已实现自由组合路由规则
不过目前还没有增加 ipcidr 和 geoip 的 matcher,暂时没办法实现 IP 分流,但是逻辑上已经实现了
LEXUGE
2020-12-08 10:59:29 +08:00
@ysc3839
目前新增加了 GeoIP matcher (自带数据库),可以轻松实现 clash 的防污染逻辑
```yaml
table:
- tag: start
if: any
then:
- query: domestic
- check_secure
- tag: check_secure
if:
geoip:
- CN
else:
- query: secure
- end
```
ylx
2020-12-14 17:52:17 +08:00
能不能给个通用用户的配置
开箱即用的
zgzh
2020-12-17 15:37:41 +08:00
@LEXUGE 最新版本"disable_ipv6": true, 无效,还是可以解析出 IPV6,是不是取消了?
LEXUGE
2020-12-17 22:09:14 +08:00
@zgzh 是的,为了灵活适应需求,我把所有的这些选项做成了路由插件,可以自由组合,如果要禁用 IPv6 可以使用 Qtype(AAAA) 来匹配并使用 disable 来设置禁用,具体见 https://gist.github.com/LEXUGE/f629c9229851c5ad5816469de2495eca

目前配置变动可能比较频繁,未来可能会加入多个 inbounds 的选项,也会有 breaking change,不过我会不 break

如果有使用方面的问题,可以发 https://github.com/LEXUGE/dcompass/discussions,回复比较及时

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

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

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

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

© 2021 V2EX