
numa v0.22.0
Resolutor DNS portatile in Rust — domini locali .numa, blocco pubblicità, override per sviluppatori
Numa
Il DNS che possiedi. Ovunque tu vada. — numa.rs
Un risolutore DNS portabile in un singolo binario. Blocca gli annunci su qualsiasi rete, dai un nome ai tuoi servizi locali (frontend.numa), sovrascrivi qualsiasi hostname con ripristino automatico e sigilla ogni query in uscita con ODoH (RFC 9230) in modo che nessuna singola parte veda sia chi sei sia cosa hai chiesto — tutto dal tuo laptop, senza account cloud o Raspberry Pi.
Realizzato da zero in Rust. Zero librerie DNS. Caching, blocco annunci e domini per servizi locali pronti all'uso. Risoluzione ricorsiva opzionale dai nameserver root con convalida completa della catena di fiducia DNSSEC, più un listener DNS-over-TLS per connessioni client crittografate (iOS Private DNS, systemd-resolved, ecc.). Esegui numa relay e lo stesso binario diventa anche un endpoint ODoH pubblico — l'elenco DNSSEC curato attualmente ha un solo relay sopravvissuto, quindi ogni deploy di Numa espande materialmente l'ecosistema. Un singolo binario di ~8MB, tutto incorporato.

Avvio rapido
# 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 — scarica da GitHub Releases
# Tutte le piattaforme
cargo install numa
# Docker
docker run -d --name numa --network host ghcr.io/razvandimescu/numa
# Nix
nix run github:razvandimescu/numa
sudo numa # esegui in primo piano (porta 53 richiede root/admin)
Apri la dashboard: http://numa.numa (o http://localhost:5380)
Imposta come DNS di sistema:
| Piattaforma | Installazione | Disinstallazione |
|---|---|---|
| macOS | sudo numa install | sudo numa uninstall |
| Linux | sudo numa install | sudo numa uninstall |
| Windows | numa install (amministratore) + riavvio | numa uninstall (amministratore) + riavvio |
Su macOS e Linux, numa viene eseguito come servizio di sistema (launchd/systemd). Su Windows, numa si avvia automaticamente al login tramite registro. Windows inoltre associa 127.0.0.2:53 (il Dnscache integrato possiede 127.0.0.1:53) e installa una regola NRPT per instradare le query verso di esso — quindi modifica bind_addr/api_bind_addr rispetto a 127.0.0.2, non 127.0.0.1.
Servizi locali
Assegna un nome ai tuoi servizi di sviluppo invece di ricordare i numeri di porta:
curl -X POST localhost:5380/services \
-d '{"name":"frontend","target_port":5173}'
Adesso https://frontend.numa funziona nel tuo browser — lucchetto verde, certificato valido, passaggio WebSocket per HMR. Nessun mkcert, nessun nginx, nessun /etc/hosts.
Aggiungi instradamento basato su percorso (app.numa/api → :5001), condividi servizi tra macchine tramite scoperta LAN o configura tutto in numa.toml.
Blocco pubblicità e privacy
Oltre 385.000 domini bloccati tramite Hagezi Pro. Funziona su qualsiasi rete — caffetterie, hotel, aeroporti. Viaggia con il tuo laptop.
Tre modalità di risoluzione:
forward(predefinita) — proxy trasparente al tuo DNS di sistema esistente. Tutto funziona come prima, solo con caching e blocco annunci in più. Portali captive, VPN, DNS aziendali — tutti rispettati.recursive— risolvi direttamente dai nameserver root. Nessuna dipendenza upstream, nessuna singola entità vede il tuo pattern completo di query. Aggiungi[dnssec] enabled = trueper la convalida completa della catena di fiducia.auto— sonda i server root all'avvio, ricorsivo se raggiungibile, fallback DoH crittografato se bloccato.
DNSSEC convalida l'intera catena di fiducia: firme RRSIG, verifica DNSKEY, delega DS, prove di negazione NSEC/NSEC3. Leggi come funziona →
Listener DNS-over-TLS (RFC 7858) — accetta query crittografate sulla porta 853 da client rigorosi come iOS Private DNS, systemd-resolved o stubby. Due modalità:
- Self-signed (predefinita) — numa genera automaticamente una CA locale.
numa installla aggiunge al trust store di sistema su macOS, Linux (Debian/Ubuntu, Fedora/RHEL/SUSE, Arch) e Windows. Su iOS, installa il.mobileconfigdanuma setup-phone. Firefox mantiene il proprio store NSS e ignora quello di sistema — aggiungi manualmente la fiducia alla CA lì se hai bisogno di HTTPS per i servizi.numain Firefox. - Certificato proprio — imposta
[dot] cert_path/key_pathsu un certificato pubblico attendibile (ad es., Let's Encrypt tramite sfida DNS-01 su un dominio che punta alla tua istanza numa). I client si connettono senza alcuna configurazione del trust store — stessa UX di AdGuard Home o Cloudflare1.1.1.1.
ALPN "dot" viene pubblicizzato e applicato in entrambe le modalità; un handshake con ALPN non corrispondente viene rifiutato come difesa contro confusione tra protocolli.
Configurazione telefono — collega il tuo iPhone o Android a Numa in un passaggio:
numa setup-phone
Stampa un codice QR. Scansiona, installa il profilo, attiva la fiducia del certificato — il DNS del tuo telefono ora passa attraverso Numa via TLS. Richiede [mobile] enabled = true in numa.toml.
Scoperta LAN
Esegui Numa su più macchine. Si trovano automaticamente tramite mDNS:
Macchina A (192.168.1.5) Macchina B (192.168.1.20)
┌──────────────────────┐ ┌──────────────────────┐
│ Numa │ mDNS │ Numa │
│ - api (porta 8000) │◄───────────►│ - grafana (3000) │
│ - frontend (5173) │ scoperta │ │
└──────────────────────┘ └──────────────────────┘
Dalla Macchina B: curl http://api.numa → inoltrato alla porta 8000 della Macchina A. Abilita con numa lan on.
Modalità hub: esegui un'istanza con bind_addr = "0.0.0.0:53" e punta il DNS di altri dispositivi verso di essa — ottengono blocco annunci + risoluzione .numa senza installare nulla. bind_addr accetta anche un elenco per associare un sottoinsieme specifico di interfacce.
Docker
# Consigliato — rete host (Linux)
docker run -d --name numa --network host ghcr.io/razvandimescu/numa
# Mapping delle porte (macOS/Windows Docker Desktop)
docker run -d --name numa -p 53:53/udp -p 53:53/tcp -p 5380:5380 ghcr.io/razvandimescu/numa
Dashboard a http://localhost:5380. L'immagine associa API e proxy a 0.0.0.0 di default. Sovrascrivi con una configurazione personalizzata:
docker run -d --name numa --network host \
-v /path/to/numa.toml:/root/.config/numa/numa.toml \
ghcr.io/razvandimescu/numa
Multi-arch: linux/amd64 e linux/arm64.
Ricette compose chiavi in mano:
packaging/client/— modalità client ODoH (DNS anonimo), Numa +numa.tomliniziale.packaging/relay/— relay ODoH pubblico, Numa + Caddy + ACME.
Confronto
| Pi-hole | AdGuard Home | Unbound | Numa | |
|---|---|---|---|---|
| Proxy servizi locali + TLS automatico | — | — | — | Domini .numa, HTTPS, WebSocket |
| Scoperta servizi LAN | — | — | — | mDNS, zero configurazione |
| Sovrascritture sviluppatore (API REST) | — | — | — | Ripristino automatico, scriptabile |
| Risolutore ricorsivo | — | — | Sì | Sì, con selezione SRTT |
| Convalida DNSSEC | — | — | Sì | Sì (RSA, ECDSA, Ed25519) |
| Blocco annunci | Sì | Sì | — | Oltre 385.000 domini |
| Interfaccia web admin | Completa | Completa | — | Dashboard |
| Upstream crittografato (DoH/DoT) | Necessita cloudflared | Solo DoH | Solo DoT | DoH + DoT (tls://) |
| Client crittografati (listener DoT) | Necessita sidecar stunnel | Sì | Sì | Nativo (RFC 7858) |
| Endpoint server DoH | — | Sì | — | Sì (RFC 8484) |
| Hedging delle richieste | — | — | — | Tutti i protocolli (UDP, DoH, DoT) |
| Serve-stale + prefetch | — | — | Prefetch al 90% TTL | RFC 8767, prefetch al 90% TTL |
| Inoltro condizionale | — | Sì | Sì | Sì (regole per suffisso) |
| Portatile (laptop) | No (appliance) | No (appliance) | Server | Singolo binario, macOS/Linux/Windows |
| Maturità community | 56K stelle, 10 anni | 33K stelle | 20 anni | Nuovo |
Prestazioni
Query in cache da 0,1 ms — alla pari con Unbound e AdGuard Home. La cache a livello di rete memorizza byte grezzi con patch in-place della TTL. L'hedging delle richieste elimina gli spike p99: p99 ricorsivo a freddo 538 ms vs Unbound 748 ms (−28%), σ 4× più stretto. Benchmark →
Per saperne di più
- Blog: Numa come risolutore della tua tailnet
- Blog: DNS-over-TLS da zero in Rust
- Blog: Implementare DNSSEC da zero in Rust
- Blog: Ho costruito un risolutore DNS da zero
- Riferimento configurazione — tutte le opzioni documentate inline
- API REST — sovrascritture, cache, blocco, servizi, diagnostica
- numa-metrics — cronologia durevole delle query e analisi, fuori host per design (nessuna scrittura su SD-card)
Roadmap
- Inoltro DNS, caching, blocco annunci, sovrascritture sviluppatore
- Domini locali
.numa— TLS automatico, instradamento percorsi, proxy WebSocket - Scoperta servizi LAN — mDNS, DNS + proxy cross-macchina
- DNS-over-HTTPS — upstream crittografato + endpoint server (RFC 8484)
- DNS-over-TLS — listener client crittografato (RFC 7858) + inoltro upstream (
tls://) - Oblivious DoH — modalità client anonima + relay pubblico (
numa relay, RFC 9230) - Risoluzione ricorsiva + DNSSEC — catena di fiducia, NSEC/NSEC3
- Selezione nameserver basata su SRTT
- Failover multi-forwarder — più upstream con ranking SRTT, pool di fallback
- Hedging delle richieste — richieste parallele salvano perdita di pacchetti e latenza di coda (tutti i protocolli)
- Serve-stale + prefetch — RFC 8767, aggiornamento in background a <10% TTL e su serve-stale
- Inoltro condizionale — regole per suffisso per DNS split-horizon (Tailscale, VPN)
- Riscaldamento cache — risoluzione proattiva per domini configurati
- Onboarding mobile — flusso QR
setup-phone, API mobile, profili mobileconfig - Integrazione pkarr — DNS auto-sovrano tramite Mainline DHT
- Nomi
.numaglobali — basati su DHT, nessun registrar
Licenza
MIT