在开发过程中,你是否厌倦了记住一堆 localhost 端口号?是否担心在咖啡馆、机场等公共 WiFi 上的 DNS 查询被窥探?今天介绍的 numa 是一个用 Rust 从头编写的便携式 DNS 解析器,用一个约 8MB 的二进制文件解决了这些问题。

项目概览

属性内容
GitHubrazvandimescu/numa
Stars584
语言Rust
特点单二进制、本地域名、广告拦截、ODoH/DNS-over-TLS
最后更新今天

它解决了什么问题

开发者的本地域名痛点

传统的本地开发流程中,你需要:

  • 记住 localhost:3000localhost:5173localhost: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.numahttp://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-hole56k+❌(需设备)
AdGuard Home33k+❌(需设备)
Unbound长历史❌(服务器)
numa584✅(单二进制)

numa 的独特之处在于便携性——一个约 8MB 的二进制文件,支持 macOS、Linux、Windows,无需云账户或 Raspberry Pi。

适用场景

本地开发

  • 为每个项目分配漂亮的域名(frontend.numaapi.numaadmin.numa
  • 自动 HTTPS,无需配置
  • 与团队协作共享本地服务

隐私保护

  • 在公共 WiFi 上加密所有 DNS 查询
  • 防止 ISP 跟踪浏览历史
  • 递归解析避免依赖第三方 DNS

广告拦截

  • 系统级广告拦截
  • 跟随笔记本电脑,任何网络都生效
  • 比浏览器插件更彻底

注意事项

  • 新项目的成熟度:相比 Pi-hole 和 AdGuard Home,numa 相对较新(2020 年底创建)
  • root 权限:绑定 53 端口需要管理员权限
  • Firefox 特殊处理:Firefox 使用自己的证书存储,需要手动信任本地 CA

总结

numa 将本地开发域名、广告拦截、DNS 隐私保护三个功能整合到一个便携的二进制文件中。如果你厌倦了记住端口号,又关心 DNS 隐私,numa 值得一试。今天运行 cargo install numabrew install numa,明天你的开发环境就会变得更优雅。


属性内容
仓库https://github.com/razvandimescu/numa
许可证MIT
语言Rust
维护者@razvandimescu