
Résolveur DNS portable en Rust — domaines locaux .numa, blocage des publicités, remplacements pour développeurs
Votre DNS, 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 rétablissement automatique, et scellez chaque requête sortante avec ODoH (RFC 9230) afin qu'aucune entité unique ne voie à la fois qui vous êtes et ce que vous avez demandé — le tout depuis votre ordinateur portable, sans compte cloud ni Raspberry Pi requis.
Construit de zéro en Rust. Zéro bibliothèque DNS. Mise en cache, blocage de publicités et domaines de services locaux dès la sortie de la boîte. Résolution récursive optionnelle depuis les serveurs de noms 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.). Lancez numa relay et le même binaire devient aussi un point de terminaison ODoH public — la liste DNSCrypt sélectionnée ne compte actuellement qu'un seul relais survivant, donc chaque déploiement de Numa élargit matériellement l'écosystème. Un binaire d'environ 8 Mo, tout intégré. Le parseur de protocole réseau a été écrit à la main comme projet d'apprentissage ; les fonctionnalités ultérieures (résolveur récursif, DNSSEC, tableau de bord) ont été construites avec l'aide de l'IA.

Trois façons de commencer, du moins engageant au plus engageant. Seule la troisième modifie le DNS de votre système.
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
Ouvrez http://localhost:5380 et connectez-vous avec n'importe quel nom d'utilisateur et ce jeton. Le port 5553 contourne ce qui occupe déjà le port 53 sur l'hôte. numa.numa ne se résoudra pas ici, car l'hôte n'utilise pas Numa pour le DNS. Nettoyez avec docker rm -f numa.
Installez le binaire :
# 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)
Numa écoute sur le port 53, mais votre système conserve son résolveur actuel jusqu'à ce que vous exécutiez numa install, donc testez avec dig @127.0.0.1 example.com. Le tableau de bord est à http://localhost:5380. Si le port 53 est pris (systemd-resolved sur Ubuntu/Mint), définissez bind_addr dans numa.toml ou utilisez Docker.
| Plateforme | Installation | Désinstallation |
|---|---|---|
| macOS | sudo numa install | sudo numa uninstall |
| Linux | sudo numa install | sudo numa uninstall |
| Windows | numa install (admin) + reboot | numa uninstall (admin) + reboot |
install enregistre un service, pointe le DNS système vers Numa et fait confiance à son CA local. uninstall annule les trois. Une fois installé, le tableau de bord est aussi à http://numa.numa.
Sur macOS et Linux, numa s'exécute comme service système (launchd/systemd). L'unité systemd est non privilégiée (DynamicUser=yes, seulement CAP_NET_BIND_SERVICE) ; le démon launchd s'exécute en tant que root. numa install reconfigure systemd-resolved via un drop-in que numa uninstall supprime ; tout autre processus occupant le port 53 (dnsmasq, y compris celui de NetworkManager) doit être arrêté manuellement. 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 router les requêtes — donc modifiez bind_addr/api_bind_addr par rapport à 127.0.0.2, pas 127.0.0.1.
Via loopback (localhost, 127.0.0.1, numa.numa), aucune connexion n'est nécessaire. Tout le reste, y compris le mappage de port Docker ou l'adresse LAN de cette machine, demande le jeton API, que Numa génère au premier démarrage. Affichez-le avec sudo numa token (un shell administrateur sous Windows) et connectez-vous avec n'importe quel nom d'utilisateur. Épinglez le vôtre avec [server] api_token ou NUMA_API_TOKEN.
uninstall restaure le DNS mais conserve le répertoire de données, donc une réinstallation conserve le même jeton et CA. Pour tout supprimer, désinstallez d'abord, puis supprimez :
| Plateforme | Ce qui reste |
|---|---|
| macOS | le binaire, /usr/local/var/numa, /usr/local/var/log/numa.log |
| Linux | le binaire (/usr/local/bin/numa depuis install.sh), /var/lib/numa, /etc/numa |
| Windows | le binaire, %PROGRAMDATA%\numa |
Les installations via gestionnaire de paquets suppriment le binaire avec brew uninstall, pacman -R ou cargo uninstall. Sur Linux, numa install copie un binaire qu'il ne peut pas exécuter depuis son emplacement d'origine (par ex. ~/.cargo/bin) vers /usr/local/bin/numa, et la désinstallation laisse cette copie.
Supprimez aussi ~/.config/numa si vous avez créé une configuration utilisateur, et le chemin [server] data_dir si vous en avez défini un.
Nommez vos services de développement au lieu de mémoriser des numéros de port :
curl -X POST localhost:5380/services \
-d '{"name":"frontend","target_port":5173}'
Maintenant https://frontend.numa fonctionne dans votre navigateur — cadenas vert, certificat valide, passthrough WebSocket pour HMR. Pas de mkcert, pas de nginx, pas de /etc/hosts.
Ajoutez un 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 traqueurs via Hagezi Pro, actualisé quotidiennement. 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, juste avec la mise en cache et le blocage de publicités en plus. Portails captifs, VPN, DNS d'entreprise — tous respectés.recursive — résolution directement depuis les serveurs de noms racines. Aucune dépendance en amont, aucune entité unique ne voit votre schéma de requêtes complet. 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 joignable, sinon forward via DoH vers Quad9 (https://9.9.9.9/dns-query), qui voit alors vos requêtes. Utilisez forward avec votre propre [upstream] pour choisir un autre fournisseur.DNSSEC valide la chaîne de confiance complète : signatures RRSIG, vérification DNSKEY, délégation DS, preuves de déni NSEC/NSEC3. Lire comment ça fonctionne →