
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. Onde quer que você 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), sobrescreva qualquer hostname com reversão automática e sele cada consulta de saída com ODoH (RFC 9230) para que nenhuma parte isolada veja tanto quem você é quanto o que você perguntou — tudo do seu laptop, sem conta na nuvem ou Raspberry Pi.
Construído do zero em Rust. Zero bibliotecas DNS. Cache, bloqueio de anúncios e domínios de serviços locais prontos para uso. Resolução recursiva opcional a partir dos servidores de nomes 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 (iOS Private DNS, systemd-resolved, etc.). Execute numa relay e o mesmo binário se torna também um endpoint ODoH público — a lista curada do DNSCrypt atualmente tem apenas um relay sobrevivente, então cada implantação do Numa expande materialmente o ecossistema. Um binário de ~8MB, tudo embutido. O parser do protocolo de rede foi escrito à mão como projeto de aprendizado; recursos posteriores (resolvedor recursivo, DNSSEC, dashboard) foram construídos com assistência de IA.

Início Rápido
Três formas de começar, da menos à mais comprometedora. Apenas a terceira altera o DNS do seu sistema.
1. Experimente no Docker (nada instalado no host)
docker run -d --name numa -p 127.0.0.1:5553:53/udp -p 127.0.0.1:5553:53/tcp \
-p 127.0.0.1:5380:5380 ghcr.io/razvandimescu/numa
dig @127.0.0.1 -p 5553 example.com
docker exec numa numa token # dashboard password
Abra http://localhost:5380 e faça login com qualquer nome de usuário e esse token. A porta 5553 contorna o que já estiver ocupando a 53 no host. numa.numa não resolverá aqui, porque o host não está usando o Numa para DNS. Limpe com docker rm -f numa.
2. Execute em primeiro plano (DNS do sistema intacto)
Instale o binário:
# 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
# Nix
nix run github:razvandimescu/numa
sudo numa # Ctrl-C to stop (port 53 requires root/admin)
O Numa escuta na porta 53, mas seu sistema mantém o resolvedor atual até você executar numa install, então teste com dig @127.0.0.1 example.com. O dashboard fica em http://localhost:5380. Se a porta 53 estiver ocupada (systemd-resolved no Ubuntu/Mint), defina bind_addr em numa.toml ou use Docker.
3. Definir 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 |
install registra um serviço, aponta o DNS do sistema para o Numa e confia em sua CA local. uninstall reverte os três. Uma vez instalado, o dashboard também fica em http://numa.numa.
No macOS e Linux, o numa roda como serviço de sistema (launchd/systemd). A unit do systemd é sem privilégios (DynamicUser=yes, apenas CAP_NET_BIND_SERVICE); o daemon do launchd roda como root. numa install reconfigura o systemd-resolved através de um drop-in que numa uninstall remove; qualquer outro processo ocupando a porta 53 (dnsmasq, incluindo o do NetworkManager) precisa ser parado manualmente. No Windows, o numa inicia automaticamente no login via registro. O Windows também vincula 127.0.0.2:53 (o Dnscache embutido possui 127.0.0.1:53) e instala uma regra NRPT para rotear consultas para lá — então edite bind_addr/api_bind_addr contra 127.0.0.2, não 127.0.0.1.
Fazendo login
Via loopback (localhost, 127.0.0.1, numa.numa) nenhum login é necessário. Qualquer outra coisa, incluindo mapeamento de porta do Docker ou o endereço LAN desta máquina, solicita o token da API, que o Numa gera na primeira inicialização. Imprima-o com sudo numa token (um shell de administrador no Windows) e faça login com qualquer nome de usuário. Fixe o seu próprio com [server] api_token ou NUMA_API_TOKEN.
Removendo todo vestígio
uninstall restaura o DNS mas mantém o diretório de dados, então uma reinstalação mantém o mesmo token e CA. Para remover tudo, desinstale primeiro, depois exclua:
| Plataforma | Deixado para trás |
|---|---|
| macOS | o binário, /usr/local/var/numa, /usr/local/var/log/numa.log |
| Linux | o binário (/usr/local/bin/numa do install.sh), /var/lib/numa, /etc/numa |
| Windows | o binário, %PROGRAMDATA%\numa |
Instalações via gerenciador de pacotes removem o binário com brew uninstall, pacman -R ou cargo uninstall. No Linux, numa install copia um binário que não consegue executar de seu local original (ex.: ~/.cargo/bin) para /usr/local/bin/numa, e o uninstall deixa essa cópia.
Também exclua ~/.config/numa se você criou uma configuração de usuário, e o caminho [server] data_dir se você definiu um.
Serviços Locais
Nomeie seus serviços de desenvolvimento em vez de memorizar 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, passthrough de 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
Bloqueio de anúncios e rastreadores via Hagezi Pro, atualizado diariamente. Funciona em qualquer rede — cafeterias, hotéis, aeroportos. Viaja com seu laptop.
Três modos de resolução:
forward(padrão) — proxy transparente para o DNS do sistema existente. Tudo funciona como antes, apenas com cache e bloqueio de anúncios por cima. Portais cativos, VPNs, DNS corporativo — todos respeitados.recursive— resolve diretamente dos servidores de nomes raiz. Sem dependência de upstream, nenhuma entidade isolada vê seu padrão completo de consultas. Adicione[dnssec] enabled = truepara validação completa da cadeia de confiança.auto— sonda servidores raiz na inicialização, recursivo se alcançável, caso contrário forward sobre DoH para o Quad9 (https://9.9.9.9/dns-query), que então vê suas consultas. Useforwardcom seu próprio[upstream]para escolher um provedor diferente.
O DNSSEC valida a cadeia de confiança completa: 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 estritos como iOS Private DNS, systemd-resolved ou stubby. Dois modos: