跳到正文
发现
命令行工具开发者工具

SDNS:隐私优先的递归 DNS 解析器

用 Go 编写的高性能递归 DNS 解析器,带 DNSSEC 验证和 DoT/DoH/DoQ 加密传输。

admin
发布于 2026-10-30
浏览
2
访问
0
下载
0
版本
v1.9.1
平台
Windows、macOS、Linux
该作品还没有经过官方审核。访问演示、下载或复制命令前,请自行确认来源可信。

详细介绍

项目简介

SDNS 是一个用 Go 编写的递归 DNS 解析器。它从根服务器开始解析,使用 DNSSEC 信任锚验证应答并缓存结果。它同时提供 UDP、TCP 明文 DNS,以及 DNS over TLS、DNS over HTTPS(含 HTTP/3)和 DNS over QUIC 加密传输,重点关注解析过程的隐私保护。完整文档位于 sdns.dev。

主要功能

解析:从根开始的递归解析与 DNSSEC 验证、QNAME 最小化(RFC 9156)、积极使用 NSEC(RFC 8198)、NXDOMAIN 子树裁剪(RFC 8020)、失败缓存(RFC 9520)、扩展 DNS 错误(RFC 8914);可选使用经 ZONEMD 校验的本地根区副本(RFC 8806)或过期应答(RFC 8767)。

后量子:支持使用 ML-DSA-44 签名(算法 18)的 DNSSEC 验证;所有 TLS 传输默认提供 X25519MLKEM768 混合密钥交换。

传输:UDP、TCP、DoT(RFC 7858)、DoH(RFC 8484)、DoQ(RFC 9250);[ddr] 下的指定解析器发现(RFC 9462);DNS Cookie(RFC 7873、RFC 9018);加密传输上的填充应答(RFC 8467);Linux 下批量 recvmmsg/sendmmsg。

策略:响应策略区(RPZ)、黑名单、按客户端视图、访问列表、速率限制、反射攻击检测。

其他命名空间:按区条件转发、整机转发模式、Kubernetes 集群 DNS、DNS64(RFC 6147)、EDNS Client Subnet(RFC 7871)、本地服务区(RFC 6303)。

运维:Prometheus 指标、HTTP API、dnstap、限制单请求工作量的递归防火墙、启动时按机器规格推导服务上限、一次性报告所有配置问题的校验环节;cache_persist 支持热重启时保存与加载缓存。

安装与使用

go install github.com/semihalev/sdns@latest   # 需要 Go 1.27 或更新

官方还为 Linux、macOS、Windows 和 BSD 提供预编译二进制,为 Linux amd64 提供 .deb / .rpm 包;也可通过 Homebrew、Snap 安装,或使用 Docker 镜像 ghcr.io/semihalev/sdns。

生成配置并校验、启动:

sdns -t -c sdns.conf
sdns -c sdns.conf &

向它发起查询:

dig @127.0.0.1 -p 5354 example.com A +dnssec

应答中出现 ad 标志表示已通过验证。首次查询需要预热根区并获取信任锚,会比较慢,之后由缓存提供。

注意事项

默认生成的配置监听所有接口的 53 端口,并允许所有客户端查询,建议先在本地高位端口试跑,并调整 accesslist。v1.9.1 调整了 ratelimit 与 SIGHUP 的行为,升级前建议先阅读该版本的更新说明。项目以 MIT 许可证开源。


本作品整理自 GitHub 开源项目 semihalev/sdns,原作者 @semihalev,许可证 MIT。中文介绍由 AI 根据项目 README 整理,以原仓库为准。

更新记录

  1. v1.9.1当前版本

    SIGHUP 现在重新加载整份配置而非仅 TLS 证书;限速改为按缓存答案生效并返回截断应答;新增 AAAA 抑制、owner 权威视图、hosts 文件过滤三项可选功能,修复浏览器 DoH 问题。

评论