Назад к обновлениям
New releaseAug 20, 2026

numa v0.23.0

Портативный DNS-резолвер на Rust — локальные домены .numa, блокировка рекламы, переопределения для разработчиков

Поделиться

Numa

CI crates.io License: MIT

DNS, которым владеете вы. Везде, куда бы вы ни пошли. — numa.rs

Портативный DNS-резолвер в одном бинарнике. Блокируйте рекламу в любой сети, давайте имена локальным сервисам (frontend.numa), переопределяйте любое имя хоста с автооткатом и запечатывайте каждый исходящий запрос с помощью ODoH (RFC 9230), чтобы ни одна сторона не видела одновременно, кто вы и что вы запросили — всё с вашего ноутбука, без облачного аккаунта и без Raspberry Pi.

Написан с нуля на Rust. Ноль DNS-библиотек. Кэширование, блокировка рекламы и локальные домены сервисов из коробки. Опциональное рекурсивное разрешение от корневых серверов имён с полной валидацией цепочки доверия DNSSEC, плюс слушатель DNS-over-TLS для зашифрованных клиентских подключений (iOS Private DNS, systemd-resolved и т. д.). Запустите numa relay — и тот же бинарник становится публичной конечной точкой ODoH: в курируемом списке DNSCrypt сейчас остался всего один работающий релей, так что каждый развёрнутый Numa ощутимо расширяет экосистему. Один бинарник ~8 МБ, всё встроено. Парсер протокола был написан вручную как учебный проект; более поздние возможности (рекурсивный резолвер, DNSSEC, дашборд) создавались с помощью ИИ.

Дашборд Numa

Быстрый старт

Три способа — от наименее до наиболее основательного. Только третий меняет системный DNS.

1. Попробовать в Docker (на хосте ничего не устанавливается)

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            # пароль к дашборду

Откройте http://localhost:5380 и войдите с любым именем пользователя и этим токеном. Порт 5553 обходит всё, что уже занимает 53 на хосте. numa.numa здесь не разрешится, потому что хост не использует Numa для DNS. Удалить: docker rm -f numa.

2. Запуск на переднем плане (системный DNS не трогается)

Установите бинарник:

# 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 — скачайте из GitHub Releases
# Все платформы
cargo install numa

# Nix
nix run github:razvandimescu/numa
sudo numa                              # Ctrl-C для остановки (порт 53 требует root/администратора)

Numa слушает порт 53, но система сохраняет текущий резолвер, пока вы не выполните numa install, так что проверяйте через dig @127.0.0.1 example.com. Дашборд доступен по адресу http://localhost:5380. Если порт 53 занят (systemd-resolved в Ubuntu/Mint), задайте bind_addr в numa.toml или используйте Docker.

3. Назначить системным DNS

ПлатформаУстановкаУдаление
macOSsudo numa installsudo numa uninstall
Linuxsudo numa installsudo numa uninstall
Windowsnuma install (администратор) + перезагрузкаnuma uninstall (администратор) + перезагрузка

install регистрирует службу, направляет системный DNS на Numa и добавляет его локальный CA в доверенные. uninstall отменяет все три действия. После установки дашборд также доступен по адресу http://numa.numa.

В macOS и Linux numa работает как системная служба (launchd/systemd). Юнит systemd непривилегированный (DynamicUser=yes, только CAP_NET_BIND_SERVICE); демон launchd работает от root. numa install перенастраивает systemd-resolved через drop-in, который удаляется при numa uninstall; любой другой процесс, занимающий порт 53 (dnsmasq, включая NetworkManager), нужно останавливать вручную. В Windows numa автоматически запускается при входе через реестр. Windows также привязывается к 127.0.0.2:53 (встроенный Dnscache владеет 127.0.0.1:53) и устанавливает правило NRPT для маршрутизации запросов туда — поэтому правьте bind_addr/api_bind_addr относительно 127.0.0.2, а не 127.0.0.1.

Вход в систему

Через loopback (localhost, 127.0.0.1, numa.numa) вход не требуется. В любом другом случае, включая проброс портов Docker или LAN-адрес этой машины, запрашивается API-токен, который Numa генерирует при первом запуске. Выведите его командой sudo numa token (в Windows — из оболочки администратора) и войдите с любым именем пользователя. Задайте свой собственный через [server] api_token или NUMA_API_TOKEN.

Удаление всех следов

uninstall восстанавливает DNS, но сохраняет каталог данных, поэтому при переустановке сохраняются тот же токен и CA. Чтобы удалить всё, сначала выполните uninstall, затем удалите:

ПлатформаЧто остаётся
macOSбинарник, /usr/local/var/numa, /usr/local/var/log/numa.log
Linuxбинарник (/usr/local/bin/numa из install.sh), /var/lib/numa, /etc/numa
Windowsбинарник, %PROGRAMDATA%\numa

Установки через пакетные менеджеры удаляют бинарник с помощью brew uninstall, pacman -R или cargo uninstall. В Linux numa install копирует бинарник, который не может запустить из исходного расположения (например, ~/.cargo/bin), в /usr/local/bin/numa, и uninstall оставляет эту копию.

Также удалите ~/.config/numa, если вы создавали пользовательский конфиг, и путь [server] data_dir, если вы его задавали.

Локальные сервисы

Давайте имена своим dev-сервисам вместо запоминания номеров портов:

curl -X POST localhost:5380/services \
  -d '{"name":"frontend","target_port":5173}'

Теперь https://frontend.numa работает в браузере — зелёный замок, валидный сертификат, проброс WebSocket для HMR. Без mkcert, без nginx, без /etc/hosts.

Добавьте маршрутизацию по путям (app.numa/api → :5001), делитесь сервисами между машинами через LAN-обнаружение или настройте всё в numa.toml.

Блокировка рекламы и приватность

Блокировка рекламы и трекеров через Hagezi Pro, обновляется ежедневно. Работает в любой сети — кофейни, отели, аэропорты. Путешествует вместе с вашим ноутбуком.

Три режима разрешения:

  • forward (по умолчанию) — прозрачный прокси к вашему текущему системному DNS. Всё работает как раньше, только с кэшированием и блокировкой рекламы поверх. Captive-порталы, VPN, корпоративный DNS — всё учитывается.
  • recursive — разрешение напрямую от корневых серверов имён. Никакой зависимости от вышестоящих, ни одна сущность не видит полную картину ваших запросов. Добавьте [dnssec] enabled = true для полной валидации цепочки доверия.
  • auto — проверка корневых серверов при запуске: рекурсивно, если доступны, иначе forward через DoH к Quad9 (https://9.9.9.9/dns-query), который тогда видит ваши запросы. Используйте forward со своим [upstream], чтобы выбрать другого провайдера.

DNSSEC проверяет полную цепочку доверия: подписи RRSIG, верификацию DNSKEY, делегирование DS, доказательства отсутствия NSEC/NSEC3. Читайте, как это работает →

Слушатель DNS-over-TLS (RFC 7858) — принимает зашифрованные запросы на порту 853 от строгих клиентов, таких как iOS Private DNS, systemd-resolved или stubby. Два режима:

Категории