
Portable DNS resolver in Rust — .numa local domains, ad blocking, developer overrides
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é.

# 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 :
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.
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.
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 = true pour 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 :
numa install l'ajoute au magasin de confiance système sur macOS, Linux (Debian/Ubuntu, Fedora/RHEL/SUSE, Arch) et Windows. Sur iOS, installez le .mobileconfig depuis numa 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 .numa dans Firefox.[dot] cert_path / key_path vers 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 Cloudflare 1.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.
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.
# 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.toml de base.packaging/relay/ — relais ODoH public, Numa + Caddy + ACME.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 →
.numa — TLS automatique, routage de chemin, proxy WebSockettls://)numa relay, RFC 9230)MIT
| 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 |
| 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 |
setup-phone, API mobile, profils mobileconfig.numa — basés sur DHT, sans registre