numa:584⭐的便携式 DNS 解析器,本地开发域名与隐私保护一应俱全
在开发过程中,你是否厌倦了记住一堆 localhost 端口号?是否担心在咖啡馆、机场等公共 WiFi 上的 DNS 查询被窥探?今天介绍的 numa 是一个用 Rust 从头编写的便携式 DNS 解析器,用一个约 8MB 的二进制文件解决了这些问题。
项目概览
| 属性 | 内容 |
|---|---|
| GitHub | razvandimescu/numa |
| Stars | 584 |
| 语言 | Rust |
| 特点 | 单二进制、本地域名、广告拦截、ODoH/DNS-over-TLS |
| 最后更新 | 今天 |
它解决了什么问题
开发者的本地域名痛点
传统的本地开发流程中,你需要:
- 记住
localhost:3000、localhost:5173、localhost:8080等各种端口号 - 使用
mkcert生成自签名证书来实现 HTTPS - 配置 nginx 反向代理
- 修改
/etc/hosts文件
numa 让这些步骤全部消失。只需一条命令:
curl -X POST localhost:5380/services \
-d '{"name":"frontend","target_port":5173}'
然后 https://frontend.numa 就能直接访问,自带有效证书和 WebSocket 透传支持。
隐私保护的 DNS 查询
传统 DNS 查询是明文传输的,你的网络提供商、公共 WiFi 运营者都能看到你在访问什么网站。numa 支持:
- ODoH (Oblivious DoH):RFC 9230 标准,没有任何单一实体能同时知道”你是谁”和”你问了什么”
- DNS-over-TLS:RFC 7858,加密客户端连接
- 递归解析:直接从根域名服务器解析,不依赖上游 DNS 提供商
核心特性
1. .numa 本地开发域名
- 自动 TLS 证书(本地 CA)
- 路径路由(如
app.numa/api→:5001) - WebSocket 透传,支持热模块替换(HMR)
- 无需修改
/etc/hosts
2. 广告拦截
- 内置 385K+ 拦截域名(基于 Hagezi Pro 列表)
- 在任何网络都有效(咖啡馆、酒店、机场)
- 跟随你的笔记本电脑,无需额外配置
3. 三种解析模式
| 模式 | 说明 |
|---|---|
| forward(默认) | 透明代理到系统 DNS,带缓存和广告拦截 |
| recursive | 直接从根域名服务器解析,无上游依赖 |
| auto | 自动探测,可用时递归,被封锁时回退到加密 DoH |
4. DNSSEC 验证
完整支持 DNSSEC 信任链验证:
- RRSIG 签名验证
- DNSKEY 验证
- DS 委托验证
- NSEC/NSEC3 否定证明
5. 局域网服务发现
多台机器运行 numa 时,它们通过 mDNS 自动发现彼此:
Machine A (192.168.1.5) Machine B (192.168.1.20)
┌─────────────────┐ ┌─────────────────┐
│ numa │◄──mDNS──►│ numa │
│ - api:8000 │ discovery │ - grafana:3000 │
└─────────────────┘ └─────────────────┘
在 Machine B 上访问 http://api.numa 会自动代理到 Machine A 的 8000 端口。
快速开始
安装
# macOS
brew install razvandimescu/tap/numa
# Linux
curl -fsSL https://raw.githubusercontent.com/razvandimescu/numa/main/install.sh | sh
# Arch Linux (AUR)
yay -S numa-git
# 所有平台
cargo install numa
运行
# 前台运行(需要 root 权限运行 53 端口)
sudo numa
# 设置为系统 DNS
sudo numa install
# 卸载
sudo numa uninstall
打开仪表盘:http://numa.numa 或 http://localhost:5380
Docker 部署
# Linux(推荐主机网络模式)
docker run -d --name numa --network host ghcr.io/razvandimescu/numa
# macOS/Windows Docker Desktop
docker run -d --name numa \
-p 53:53/udp -p 53:53/tcp -p 5380:5380 \
ghcr.io/razvandimescu/numa
同类对比
| 工具 | Stars | 本地域名 | 广告拦截 | 递归解析 | DNSSEC | 便携性 |
|---|---|---|---|---|---|---|
| Pi-hole | 56k+ | ❌ | ✅ | ❌ | ❌ | ❌(需设备) |
| AdGuard Home | 33k+ | ❌ | ✅ | ❌ | ❌ | ❌(需设备) |
| Unbound | 长历史 | ❌ | ❌ | ✅ | ✅ | ❌(服务器) |
| numa | 584 | ✅ | ✅ | ✅ | ✅ | ✅(单二进制) |
numa 的独特之处在于便携性——一个约 8MB 的二进制文件,支持 macOS、Linux、Windows,无需云账户或 Raspberry Pi。
适用场景
本地开发
- 为每个项目分配漂亮的域名(
frontend.numa、api.numa、admin.numa) - 自动 HTTPS,无需配置
- 与团队协作共享本地服务
隐私保护
- 在公共 WiFi 上加密所有 DNS 查询
- 防止 ISP 跟踪浏览历史
- 递归解析避免依赖第三方 DNS
广告拦截
- 系统级广告拦截
- 跟随笔记本电脑,任何网络都生效
- 比浏览器插件更彻底
注意事项
- 新项目的成熟度:相比 Pi-hole 和 AdGuard Home,numa 相对较新(2020 年底创建)
- root 权限:绑定 53 端口需要管理员权限
- Firefox 特殊处理:Firefox 使用自己的证书存储,需要手动信任本地 CA
总结
numa 将本地开发域名、广告拦截、DNS 隐私保护三个功能整合到一个便携的二进制文件中。如果你厌倦了记住端口号,又关心 DNS 隐私,numa 值得一试。今天运行 cargo install numa 或 brew install numa,明天你的开发环境就会变得更优雅。
| 属性 | 内容 |
|---|---|
| 仓库 | https://github.com/razvandimescu/numa |
| 许可证 | MIT |
| 语言 | Rust |
| 维护者 | @razvandimescu |