
numa v0.22.0
Resolvedor de DNS portátil em Rust — domínios locais .numa, bloqueio de anúncios, sobreposições para desenvolvedores
Numa
DNS que você possui. Em qualquer lugar que vá. — numa.rs
Um resolvedor DNS portátil em um único binário. Bloqueie anúncios em qualquer rede, nomeie seus serviços locais (frontend.numa), substitua qualquer hostname com reversão automática e sele todas as consultas de saída com ODoH (RFC 9230) para que nenhuma parte veja tanto quem você é quanto o que perguntou — tudo do seu laptop, sem conta na nuvem ou Raspberry Pi necessário.
Construído do zero em Rust. Zero bibliotecas DNS. Cache, bloqueio de anúncios e domínios de serviço local prontos para uso. Resolução recursiva opcional a partir dos servidores raiz com validação completa da cadeia de confiança DNSSEC, além de um listener DNS-over-TLS para conexões de clientes criptografadas (DNS Privado do iOS, systemd-resolved, etc.). Execute numa relay e o mesmo binário se torna também um endpoint ODoH público — a lista curada do DNSSEC atualmente tem um relay sobrevivente, então cada implantação do Numa expande materialmente o ecossistema. Um binário de ~8 MB, tudo embutido.

Início Rápido
# macOS
brew install razvandimescu/tap/numa
# Linux
curl -fsSL https://raw.githubusercontent.com/razvandimescu/numa/main/install.sh | sh
# Arch Linux
pacman -S numa
# Windows — download from GitHub Releases
# All platforms
cargo install numa
# Docker
docker run -d --name numa --network host ghcr.io/razvandimescu/numa
# Nix
nix run github:razvandimescu/numa
sudo numa # run in foreground (port 53 requires root/admin)
Abra o painel: http://numa.numa (ou http://localhost:5380)
Defina como DNS do sistema:
| Plataforma | Instalar | Desinstalar |
|---|---|---|
| macOS | sudo numa install | sudo numa uninstall |
| Linux | sudo numa install | sudo numa uninstall |
| Windows | numa install (admin) + reboot | numa uninstall (admin) + reboot |
No macOS e Linux, o numa executa como um serviço de sistema (launchd/systemd). No Windows, o numa inicia automaticamente ao login via registro. O Windows também vincula 127.0.0.2:53 (o Dnscache integrado possui 127.0.0.1:53) e instala uma regra NRPT para direcionar consultas a ele — portanto, edite bind_addr/api_bind_addr para 127.0.0.2, não 127.0.0.1.
Serviços Locais
Nomeie seus serviços de desenvolvimento em vez de lembrar números de porta:
curl -X POST localhost:5380/services \
-d '{"name":"frontend","target_port":5173}'
Agora https://frontend.numa funciona no seu navegador — cadeado verde, certificado válido, passagem WebSocket para HMR. Sem mkcert, sem nginx, sem /etc/hosts.
Adicione roteamento baseado em caminho (app.numa/api → :5001), compartilhe serviços entre máquinas via descoberta LAN, ou configure tudo em numa.toml.
Bloqueio de Anúncios e Privacidade
Mais de 385 mil domínios bloqueados via Hagezi Pro. Funciona em qualquer rede — cafeterias, hotéis, aeroportos. Viaja com seu laptop.
Três modos de resolução:
forward(padrão) — proxy transparente para seu DNS de sistema existente. Tudo funciona como antes, apenas com cache e bloqueio de anúncios adicionados. Portais cativos, VPNs, DNS corporativo — todos respeitados.recursive— resolve diretamente dos servidores raiz. Sem dependência upstream, nenhuma entidade vê seu padrão completo de consultas. Adicione[dnssec] enabled = truepara validação completa da cadeia de confiança.auto— testa servidores raiz na inicialização, recursivo se acessível, fallback DoH criptografado se bloqueado.
DNSSEC valida toda a cadeia de confiança: assinaturas RRSIG, verificação DNSKEY, delegação DS, provas de negação NSEC/NSEC3. Leia como funciona →
Listener DNS-over-TLS (RFC 7858) — aceita consultas criptografadas na porta 853 de clientes rigorosos como DNS Privado do iOS, systemd-resolved ou stubby. Dois modos:
- Auto-assinado (padrão) — o numa gera uma CA local automaticamente.
numa installa adiciona ao armazenamento de confiança do sistema no macOS, Linux (Debian/Ubuntu, Fedora/RHEL/SUSE, Arch) e Windows. No iOS, instale o.mobileconfigdenuma setup-phone. O Firefox mantém seu próprio armazenamento NSS e ignora o do sistema — confie na CA manualmente lá se precisar de HTTPS para serviços.numano Firefox. - Traga seu próprio certificado — aponte
[dot] cert_path/key_pathpara um certificado publicamente confiável (por exemplo, Let's Encrypt via desafio DNS-01 em um domínio apontando para sua instância numa). Os clientes se conectam sem qualquer configuração de armazenamento de confiança — mesma UX do AdGuard Home ou Cloudflare1.1.1.1.
ALPN "dot" é anunciado e aplicado em ambos os modos; um handshake com ALPN incompatível é rejeitado como defesa contra confusão entre protocolos.
Configuração do telefone — aponte seu iPhone ou Android para o Numa em um passo:
numa setup-phone
Imprime um código QR. Escaneie-o, instale o perfil, alterne a confiança do certificado — o DNS do seu telefone agora passa pelo Numa via TLS. Requer [mobile] enabled = true no numa.toml.
Descoberta LAN
Execute o Numa em várias máquinas. Elas se encontram automaticamente via mDNS:
Machine A (192.168.1.5) Machine B (192.168.1.20)
┌──────────────────────┐ ┌──────────────────────┐
│ Numa │ mDNS │ Numa │
│ - api (port 8000) │◄───────────►│ - grafana (3000) │
│ - frontend (5173) │ discovery │ │
└──────────────────────┘ └──────────────────────┘
Da Máquina B: curl http://api.numa → proxy para a porta 8000 da Máquina A. Ative com numa lan on.
Modo hub: execute uma instância com bind_addr = "0.0.0.0:53" e aponte o DNS de outros dispositivos para ela — eles recebem bloqueio de anúncios + resolução .numa sem instalar nada. bind_addr também aceita uma lista para vincular um subconjunto específico de interfaces.
Docker
# Recomendado — rede de host (Linux)
docker run -d --name numa --network host ghcr.io/razvandimescu/numa
# Port mapping (macOS/Windows Docker Desktop)
docker run -d --name numa -p 53:53/udp -p 53:53/tcp -p 5380:5380 ghcr.io/razvandimescu/numa
Painel em http://localhost:5380. A imagem vincula a API e o proxy a 0.0.0.0 por padrão. Substitua com uma configuração personalizada:
docker run -d --name numa --network host \
-v /path/to/numa.toml:/root/.config/numa/numa.toml \
ghcr.io/razvandimescu/numa
Multi-arquitetura: linux/amd64 e linux/arm64.
Receitas compose prontas para uso:
packaging/client/— modo cliente ODoH (DNS anônimo), Numa +numa.tomlinicial.packaging/relay/— relay ODoH público, Numa + Caddy + ACME.
Comparação
| Pi-hole | AdGuard Home | Unbound | Numa | |
|---|---|---|---|---|
| Proxy de serviço local + TLS automático | — | — | — | Domínios .numa, HTTPS, WebSocket |
| Descoberta de serviço LAN | — | — | — | mDNS, zero config |
| Substituições do desenvolvedor (API REST) | — | — | — | Reversão automática, scriptável |
| Resolvedor recursivo | — | — | Sim | Sim, com seleção SRTT |
| Validação DNSSEC | — | — | Sim | Sim (RSA, ECDSA, Ed25519) |
| Bloqueio de anúncios | Sim | Sim | — | 385K+ domínios |
| Interface web de administração | Completo | Completo | — | Painel |
| Upstream criptografado (DoH/DoT) | Precisa de cloudflared | Apenas DoH | Apenas DoT | DoH + DoT (tls://) |
| Clientes criptografados (listener DoT) | Precisa de stunnel sidecar | Sim | Sim | Nativo (RFC 7858) |
| Endpoint servidor DoH | — | Sim | — | Sim (RFC 8484) |
| Hedging de requisições | — | — | — | Todos os protocolos (UDP, DoH, DoT) |
| Servir obsoleto + pré-busca | — | — | Pré-busca em 90% TTL | RFC 8767, pré-busca em 90% TTL |
| Encaminhamento condicional | — | Sim | Sim | Sim (regras por sufixo) |
| Portátil (laptop) | Não (aparelho) | Não (aparelho) | Servidor | Binário único, macOS/Linux/Windows |
| Maturidade da comunidade | 56K estrelas, 10 anos | 33K estrelas | 20 anos | Novo |
Desempenho
Consultas em cache de 0,1ms — iguala Unbound e AdGuard Home. O cache em nível de bytes armazena bytes brutos com correção de TTL no local. O hedging de requisições elimina picos p99: recursivo frio p99 538ms vs Unbound 748ms (−28%), σ 4× mais apertado. Benchmarks →
Saiba Mais
- Blog: Numa como seu resolvedor de tailnet
- Blog: DNS-over-TLS do zero em Rust
- Blog: Implementando DNSSEC do zero em Rust
- Blog: Construí um resolvedor DNS do zero
- Referência de configuração — todas as opções documentadas inline
- API REST — substituições, cache, bloqueio, serviços, diagnósticos
- numa-metrics — histórico de consultas durável e análises, off-host por design (sem gravações em cartão SD)
Roteiro
- Encaminhamento DNS, cache, bloqueio de anúncios, substituições do desenvolvedor
- Domínios locais
.numa— TLS automático, roteamento de caminho, proxy WebSocket - Descoberta de serviço LAN — mDNS, DNS entre máquinas + proxy
- DNS-over-HTTPS — upstream criptografado + endpoint servidor (RFC 8484)
- DNS-over-TLS — listener cliente criptografado (RFC 7858) + encaminhamento upstream (
tls://) - Oblivious DoH — modo cliente anônimo + relay público (
numa relay, RFC 9230) - Resolução recursiva + DNSSEC — cadeia de confiança, NSEC/NSEC3
- Seleção de nameserver baseada em SRTT
- Failover multi-encaminhador — múltiplos upstreams com classificação SRTT, pool de fallback
- Hedging de requisições — requisições paralelas resgatam perda de pacotes e latência de cauda (todos os protocolos)
- Servir obsoleto + pré-busca — RFC 8767, atualização em segundo plano em <10% TTL e ao servir obsoleto
- Encaminhamento condicional — regras por sufixo para DNS split-horizon (Tailscale, VPNs)
- Aquecimento de cache — resolução proativa para domínios configurados
- Integração móvel — fluxo QR
setup-phone, API móvel, perfis mobileconfig - Integração pkarr — DNS autossoberano via Mainline DHT
- Nomes
.numaglobais — suportado por DHT, sem registrador
Licença
MIT