doh-server:DoH/ODoH 服务端代理
用 Rust 编写的 DoH 与 ODoH 服务端代理,可为任意 DNS 解析器补上加密查询能力。
- 浏览
- 1
- 访问
- 0
- 下载
- 0
- 版本
- v0.11.1
- 平台
- Linux
详细介绍
项目简介
doh-proxy(仓库名 doh-server)是一个用 Rust 编写的高性能 DoH(DNS-over-HTTPS)与 ODoH(Oblivious DoH)服务端代理。它自身不做 DNS 解析,而是部署在任意 DNS 解析器前面,为这个解析器增加 DoH 能力。项目自 2018 年 2 月起在生产环境使用,采用 MIT 许可证。
主要功能
- DoH:通过 HTTPS 加密 DNS 查询
- JSON API:兼容 Google DNS-over-HTTPS JSON API 格式
- ODoH:隐藏客户端 IP 地址,进一步提升隐私
- EDNS Client Subnet:把客户端 IP 信息转发给上游解析器,以获取地理优化的结果
- 高性能:基于 Rust 与 Tokio 构建
- 部署灵活:可独立运行并使用内置 TLS,也可放在反向代理后面
- 多 IP 支持:可指定多个外部 IP 实现负载均衡,并为每个 IP 生成独立的 DNS stamp
- 证书自动重载:TLS 证书更新后无需重启、无需停机
- 可配置缓存:可设置 TTL 的最小值与最大值,以及错误 TTL
安装与使用
Linux 平台的预编译压缩包与 Debian 包可在 releases 页面下载;从源码安装需要先安装 Rust 编译器:
cargo install doh-proxy
如不需要内置 HTTPS 支持:
cargo install doh-proxy --no-default-features
最简用法:默认监听 127.0.0.1:3000,把请求转发给本地的 DNS 解析器:
doh-proxy -H 'doh.example.com' -u 127.0.0.1:53
使用内置 TLS 独立运行:
doh-proxy -H 'doh.example.com' -u 127.0.0.1:53 -l 0.0.0.0:443 -i /path/to/fullchain.pem -I /path/to/privkey.pem
常用参数:-l 监听地址(默认 127.0.0.1:3000)、-p URI 路径(默认 /dns-query)、-c 最大客户端连接数(默认 512)、-C 每客户端最大并发请求数(默认 16)、-t 请求时间预算(默认 10 秒)、-X / -T 最大与最小 TTL。
推荐部署方式是把 doh-proxy 放在 nginx、Caddy、HAProxy 或 CDN 等负责 TLS 终止的反向代理后面,这样可以与现有网站共享 443 端口、复用证书管理,并获得反向代理提供的 HTTP/2、HTTP/3 与限流能力。例如 nginx:
location /dns-query {
proxy_pass http://127.0.0.1:3000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
JSON API 可直接用 curl 测试:
curl -H "Accept: application/dns-json" "http://localhost:3000/dns-query?name=example.com&type=1"
注意事项
- 内置 TLS 要求证书与私钥为 PEM/PKCS#8 格式;若 ECDSA 证书以
-----BEGIN EC PRIVATE KEY-----开头,需要先用openssl pkcs8转换成 PKCS#8。 - 一旦启用 HTTPS,就不再接受 HTTP 连接。仓库提供一个自签名测试证书
localhost.pem可用于测试。 - 放在 nginx 后面时,建议使用带
keepalive的upstream块复用连接,并启用proxy_next_upstream ... non_idempotent,避免后端关闭空闲连接时请求失败;DoH 与 ODoH 查询可安全重试。 - 请求超时、连接数上限等参数需根据实际负载调整,过短的超时会在压力下更早关闭空闲连接。
本作品整理自 GitHub 开源项目 DNSCrypt/doh-server,原作者 @DNSCrypt,许可证 MIT。中文介绍由 AI 根据项目 README 整理,以原仓库为准。
更新记录
- v0.11.1当前版本
同步自 GitHub Release 0.11.1
评论