33 个版本 (4 个重大变更)
0.5.4 | 2020年6月14日 |
---|---|
0.5.2 | 2020年5月30日 |
0.4.2 | 2020年3月28日 |
#9 in #doh
每月下载量 117
45KB
1K SLoC
rust-doh-proxy
简单且非常实用的 DNS over HTTPS 代理服务器。主要是一个学习 Rust 中的 async/await 的练习,但足够稳定,以至于我将它作为家中网络上的唯一 DNS 服务器使用。
简而言之,该应用程序监听本地网络上的正常/旧版 DNS UDP 和 TCP 套接字。它代理到上游 DNS over HTTPS 服务器并缓存结果。还支持简单的正向和反向主机/IP 映射,以便在本地域名上进行授权查找。
技术栈
- tokio Rust 的异步 I/O 运行时。直接使用它进行异步文件 I/O、TCP 和 UDP 套接字、计时器和超时。
- trust-dns-proto 一个将二进制 DNS 消息打包和解包到 Rust DTO 的库。忽略该库不应直接使用的警告:)
- RFC8484 DNS over HTTPS 协议用于上游请求。
- reqwest HTTP 客户端。这支持 HTTP2,基于 hyper(基于 tokio),并支持异步/等待。
- lru LRU 缓存。
如何运行此应用程序?
使用 cargo 构建后,您可以通过以下方式运行应用程序。由于此应用程序使用 env_logger,需要设置 RUST_LOG 变量以获取日志输出
RUST_LOG=info ./target/debug/rust-doh-proxy ./config/config.json
如果一切正常,您将看到这些日志,表明应用程序正在监听 127.0.0.1:10053。
[INFO rust_doh_proxy::doh::udpserver] listening on udp 127.0.0.1:10053
[INFO rust_doh_proxy::doh::tcpserver] listening on tcp 127.0.0.1:10053
然后您可以使用 dig 等工具向应用程序发出 DNS 查询
dig -p 10053 @127.0.0.1 google.com
通常 DNS 使用特权端口 53。在此示例中,此应用程序使用非特权端口 10053 以普通用户身份运行。监听地址和端口可以在配置 JSON 文件中配置。
要将此应用程序用作在端口 53 上服务的 DNS 服务器,我使用 Linux 上的 nftables 与一个 重定向规则 将传入请求从端口 53 重定向到端口 10053。
配置
有关示例,请参阅 config 目录。
Systemd
请参阅 systemd 目录中的示例用户单元文件。
交叉编译
使用 cross 在 MacOS 上编译 x86_64 Linux
交叉构建--目标架构 x86_64-未知-linux-gnu--发布版
依赖项
~13–25MB
~395K SLoC