
numa v0.23.0
Résolveur DNS portable en Rust — domaines locaux .numa, blocage des publicités, remplacements pour développeurs
Numa
DNS que vous possédez. Partout où vous allez. — numa.rs
Un résolveur DNS portable dans un seul binaire. Bloquez les publicités sur n'importe quel réseau, nommez vos services locaux (frontend.numa), remplacez n'importe quel nom d'hôte avec restauration automatique, et scellez chaque requête sortante avec ODoH (RFC 9230) afin qu'aucune partie ne puisse voir à la fois qui vous êtes et ce que vous avez demandé — le tout depuis votre ordinateur portable, sans compte cloud ni Raspberry Pi nécessaire.
Construit de zéro en Rust. Zéro bibliothèque DNS. Mise en cache, blocage de publicités et domaines de services locaux prêts à l'emploi. Résolution récursive optionnelle depuis les serveurs racines avec validation complète de la chaîne de confiance DNSSEC, plus un écouteur DNS-over-TLS pour les connexions client chiffrées (iOS Private DNS, systemd-resolved, etc.). Exécutez numa relay et le même binaire devient également un point de terminaison ODoH public — la liste DNSCrypt organisée ne contient actuellement qu'un seul relais fonctionnel, donc chaque déploiement de Numa élargit matériellement l'écosystème. Un seul binaire d'environ 8 Mo, tout est intégré.

Démarrage rapide
# 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 — télécharger depuis GitHub Releases
# Toutes les plateformes
cargo install numa
# Docker
docker run -d --name numa --network host ghcr.io/razvandimescu/numa
# Nix
nix run github:razvandimescu/numa
sudo numa # exécution en avant-plan (le port 53 nécessite root/administrateur)
Ouvrez le tableau de bord : http://numa.numa (ou http://localhost:5380)
Définir comme DNS système :
| Plateforme | Installation | Désinstallation |
|---|---|---|
| macOS | sudo numa install | sudo numa uninstall |
| Linux | sudo numa install | sudo numa uninstall |
| Windows | numa install (admin) + redémarrage | numa uninstall (admin) + redémarrage |
Sur macOS et Linux, numa s'exécute en tant que service système (launchd/systemd). Sur Windows, numa démarre automatiquement à la connexion via le registre. Windows lie également 127.0.0.2:53 (le Dnscache intégré possède 127.0.0.1:53) et installe une règle NRPT pour y acheminer les requêtes — modifiez donc bind_addr/api_bind_addr pour utiliser 127.0.0.2, pas 127.0.0.1.
Services locaux
Nommez vos services de développement au lieu de retenir des numéros de port :
curl -X POST localhost:5380/services \
-d '{"name":"frontend","target_port":5173}'
Désormais, https://frontend.numa fonctionne dans votre navigateur — cadenas vert, certificat valide, passage WebSocket pour HMR. Pas de mkcert, pas de nginx, pas de /etc/hosts.
Ajoutez du routage basé sur le chemin (app.numa/api → :5001), partagez des services entre machines via la découverte LAN, ou configurez tout dans numa.toml.
Blocage des publicités et confidentialité
Plus de 385 000 domaines bloqués via Hagezi Pro. Fonctionne sur n'importe quel réseau — cafés, hôtels, aéroports. Voyage avec votre ordinateur portable.
Trois modes de résolution :
forward(par défaut) — proxy transparent vers votre DNS système existant. Tout fonctionne comme avant, avec en plus la mise en cache et le blocage des publicités. Les portails captifs, VPN, DNS d'entreprise sont tous respectés.recursive— résolution directe depuis les serveurs racines. Aucune dépendance amont, aucune entité ne voit l'intégralité de votre modèle de requêtes. Ajoutez[dnssec] enabled = truepour une validation complète de la chaîne de confiance.auto— sonde les serveurs racines au démarrage : récursif si accessible, secours DoH chiffré si bloqué.
DNSSEC valide la chaîne de confiance complète : signatures RRSIG, vérification DNSKEY, délégation DS, preuves de refus NSEC/NSEC3. Lisez comment cela fonctionne →
Écouteur DNS-over-TLS (RFC 7858) — accepte les requêtes chiffrées sur le port 853 de clients stricts comme iOS Private DNS, systemd-resolved ou stubby. Deux modes :
- Auto-signé (par défaut) — numa génère automatiquement une autorité de certification locale.
numa installl'ajoute au magasin de confiance système sur macOS, Linux (Debian/Ubuntu, Fedora/RHEL/SUSE, Arch) et Windows. Sur iOS, installez le.mobileconfigdepuisnuma setup-phone. Firefox utilise son propre magasin NSS et ignore celui du système — faites confiance au CA manuellement si vous avez besoin de HTTPS pour les services.numadans Firefox. - Apportez votre propre certificat — indiquez
[dot] cert_path/key_pathvers un certificat de confiance publique (ex. Let's Encrypt via challenge DNS-01 sur un domaine pointant vers votre instance numa). Les clients se connectent sans aucune configuration de magasin de confiance — même expérience qu'AdGuard Home ou Cloudflare1.1.1.1.
ALPN "dot" est annoncé et appliqué dans les deux modes ; une poignée de main avec ALPN non correspondant est rejetée comme défense contre la confusion inter-protocoles.
Configuration téléphone — pointez votre iPhone ou Android vers Numa en une étape :
numa setup-phone
Affiche un code QR. Scannez-le, installez le profil, activez la confiance du certificat — le DNS de votre téléphone transite désormais par Numa via TLS. Nécessite [mobile] enabled = true dans numa.toml.
Découverte LAN
Exécutez Numa sur plusieurs machines. Elles se découvrent automatiquement 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 │ │
└──────────────────────┘ └──────────────────────┘
Depuis Machine B : curl http://api.numa → proxy vers le port 8000 de Machine A. Activez avec numa lan on.
Mode Hub : exécutez une instance avec bind_addr = "0.0.0.0:53" et pointez le DNS des autres périphériques vers elle — ils bénéficient du blocage des publicités + résolution .numa sans rien installer. bind_addr accepte également une liste pour lier un sous-ensemble spécifique d'interfaces.
Docker
# Recommandé — réseau hôte (Linux)
docker run -d --name numa --network host ghcr.io/razvandimescu/numa
# Mappage de ports (macOS/Windows Docker Desktop)
docker run -d --name numa -p 53:53/udp -p 53:53/tcp -p 5380:5380 ghcr.io/razvandimescu/numa
Tableau de bord sur http://localhost:5380. L'image lie l'API et le proxy à 0.0.0.0 par défaut. Remplacez avec une configuration personnalisée :
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 et linux/arm64.
Recettes compose clé en main :
packaging/client/— mode client ODoH (DNS anonyme), Numa +numa.tomlde base.packaging/relay/— relais ODoH public, Numa + Caddy + ACME.
Comparaison
| Pi-hole | AdGuard Home | Unbound | Numa | |
|---|---|---|---|---|
| Proxy de service local + TLS automatique | — | — | — | Domaines .numa, HTTPS, WebSocket |
| Découverte de services LAN | — | — | — | mDNS, aucune configuration |
| Remplacements développeur (API REST) | — | — | — | Restauration automatique, scriptable |
| Résolveur récursif | — | — | Oui | Oui, avec sélection SRTT |
| Validation DNSSEC | — | — | Oui | Oui (RSA, ECDSA, Ed25519) |
| Blocage de publicités | Oui | Oui | — | Plus de 385 000 domaines |
| Interface d'administration Web | Complète | Complète | — | Tableau de bord |
| Amont chiffré (DoH/DoT) | Nécessite cloudflared | DoH uniquement | DoT uniquement | DoH + DoT (tls://) |
| Clients chiffrés (écouteur DoT) | Nécessite sidecar stunnel | Oui | Oui | Natif (RFC 7858) |
| Point de terminaison serveur DoH | — | Oui | — | Oui (RFC 8484) |
| Hedging de requêtes | — | — | — | Tous les protocoles (UDP, DoH, DoT) |
| Serve-stale + préchargement | — | — | Préchargement à 90% TTL | RFC 8767, préchargement à 90% TTL |
| Transfert conditionnel | — | Oui | Oui | Oui (règles par suffixe) |
| Portable (ordinateur portable) | Non (appliance) | Non (appliance) | Serveur | Binaire unique, macOS/Linux/Windows |
| Maturité communautaire | 56K étoiles, 10 ans | 33K étoiles | 20 ans | Nouveau |
Performances
Requêtes en cache en 0,1 ms — comparable à Unbound et AdGuard Home. Le cache au niveau fil stocke les octets bruts avec correction TTL en place. Le hedging de requêtes élimine les pics p99 : p99 récursif à froid 538 ms contre 748 ms pour Unbound (−28 %), σ 4× plus serré. Benchmarks →
En savoir plus
- Blog : Numa comme résolveur de votre tailnet
- Blog : DNS-over-TLS from Scratch in Rust
- Blog : Implementing DNSSEC from Scratch in Rust
- Blog : I Built a DNS Resolver from Scratch
- Référence de configuration — toutes les options documentées en ligne
- API REST — remplacements, cache, blocage, services, diagnostics
- numa-metrics — historique et analyses durables des requêtes, hors hôte par conception (pas d'écritures sur carte SD)
Feuille de route
- Transfert DNS, mise en cache, blocage des publicités, remplacements développeur
- Domaines locaux
.numa— TLS automatique, routage de chemin, proxy WebSocket - Découverte de services LAN — mDNS, DNS + proxy inter-machines
- DNS-over-HTTPS — amont chiffré + point de terminaison serveur (RFC 8484)
- DNS-over-TLS — écouteur client chiffré (RFC 7858) + transfert amont (
tls://) - Oblivious DoH — mode client anonymisé + relais public (
numa relay, RFC 9230) - Résolution récursive + DNSSEC — chaîne de confiance, NSEC/NSEC3
- Sélection de serveur de noms basée sur SRTT
- Basculement multi-transfert — plusieurs amonts avec classement SRTT, pool de secours
- Hedging de requêtes — requêtes parallèles pour rattraper les pertes de paquets et la latence de queue (tous les protocoles)
- Serve-stale + préchargement — RFC 8767, rafraîchissement en arrière-plan à <10 % TTL et lors de la réponse périmée
- Transfert conditionnel — règles par suffixe pour DNS à horizon partagé (Tailscale, VPN)
- Réchauffement du cache — résolution proactive pour les domaines configurés
- Intégration mobile — flux QR
setup-phone, API mobile, profils mobileconfig - Intégration pkarr — DNS auto-souverain via DHT Mainline
- Noms globaux
.numa— basés sur DHT, sans registre
Licence
MIT