
numa v0.22.0
Rust製のポータブルDNSリゾルバ — .numaローカルドメイン、広告ブロッキング、開発者オーバーライド
Numa
あなたが所有する DNS。どこへ行っても。 — numa.rs
単一バイナリで動作するポータブルな DNS リゾルバ。どのネットワークでも広告をブロックし、ローカルサービスに名前を付け(frontend.numa)、任意のホスト名を自動復元付きで上書きし、すべての外向きクエリを ODoH (RFC 9230) で封じることで、誰があなたであるかと何を尋ねたかを単一の当事者が同時に見ることはありません — すべてラップトップから、クラウドアカウントも Raspberry Pi も不要です。
Rust でゼロから構築。DNS ライブラリは一切使用していません。キャッシュ、広告ブロック、ローカルサービスドメインを標準搭載。オプションでルートネームサーバーからの再帰解決と完全な DNSSEC 信頼チェーン検証、さらに暗号化されたクライアント接続(iOS Private DNS、systemd-resolved など)のための DNS-over-TLS リスナーを提供します。numa relay を実行すれば、同じバイナリがパブリック ODoH エンドポイントにもなります — 厳選された DNSCrypt リストには現在 1 つのリレーしか生き残っていないため、Numa のデプロイごとにエコシステムが実質的に拡大します。約 8MB のバイナリ 1 つに、すべてが埋め込まれています。ワイヤプロトコルパーサーは学習プロジェクトとして手書きされました。その後の機能(再帰リゾルバ、DNSSEC、ダッシュボード)は AI の支援を受けて構築されました。

クイックスタート
コミットメントの度合いが低い順に 3 つの方法があります。システム DNS を変更するのは 3 番目だけです。
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 # dashboard password
http://localhost:5380 を開き、任意のユーザー名とそのトークンでログインします。ポート 5553 は、ホスト上で既に 53 を占有しているものを回避します。ホストが DNS に Numa を使っていないため、ここでは numa.numa は解決されません。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 — 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 はポート 53 で待ち受けますが、numa install を実行するまでシステムは現在のリゾルバを使い続けるので、dig @127.0.0.1 example.com でテストしてください。ダッシュボードは http://localhost:5380 にあります。ポート 53 が使用中の場合(Ubuntu/Mint の systemd-resolved)、numa.toml で bind_addr を設定するか、Docker を使用してください。
3. システム DNS として設定
| プラットフォーム | インストール | アンインストール |
|---|---|---|
| macOS | sudo numa install | sudo numa uninstall |
| Linux | sudo numa install | sudo numa uninstall |
| Windows | numa install (管理者) + 再起動 | numa uninstall (管理者) + 再起動 |
install はサービスを登録し、システム DNS を Numa に向け、そのローカル CA を信頼します。uninstall はこの 3 つすべてを元に戻します。インストール後、ダッシュボードは 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 を保持している他のプロセス(NetworkManager のものを含む dnsmasq)は手動で停止する必要があります。Windows では、numa はレジストリ経由でログイン時に自動起動します。Windows はさらに 127.0.0.2:53 をバインドし(組み込みの Dnscache が 127.0.0.1:53 を所有しているため)、クエリをそこへルーティングする NRPT ルールをインストールします — そのため bind_addr/api_bind_addr は 127.0.0.1 ではなく 127.0.0.2 に対して編集してください。
ログイン
ループバック(localhost、127.0.0.1、numa.numa)経由ではログインは不要です。それ以外(Docker のポートマッピングやこのマシンの LAN アドレスを含む)では、Numa が初回起動時に生成する API トークンが要求されます。sudo numa token(Windows では管理者シェル)で表示し、任意のユーザー名でログインします。[server] api_token または NUMA_API_TOKEN で独自のトークンを固定できます。
すべての痕跡を削除する
uninstall は DNS を復元しますが、データディレクトリは保持するため、再インストールしても同じトークンと CA が維持されます。すべてを削除するには、まずアンインストールしてから次を削除します:
| プラットフォーム | 残るもの |
|---|---|
| macOS | バイナリ、/usr/local/var/numa、/usr/local/var/log/numa.log |
| Linux | バイナリ(install.sh からの /usr/local/bin/numa)、/var/lib/numa、/etc/numa |
| Windows | バイナリ、%PROGRAMDATA%\numa |
パッケージマネージャーによるインストールでは、brew uninstall、pacman -R、または cargo uninstall でバイナリが削除されます。Linux では、numa install は元の場所(例: ~/.cargo/bin)から実行できないバイナリを /usr/local/bin/numa にコピーし、アンインストールしてもそのコピーは残ります。
ユーザー設定を作成した場合は ~/.config/numa も、[server] data_dir パスを設定した場合はそのパスも削除してください。
ローカルサービス
ポート番号を覚える代わりに、開発サービスに名前を付けましょう:
curl -X POST localhost:5380/services \
-d '{"name":"frontend","target_port":5173}'
これで https://frontend.numa がブラウザで動作します — 緑の鍵、有効な証明書、HMR 用の WebSocket パススルー。mkcert も nginx も /etc/hosts も不要です。
パスベースのルーティング(app.numa/api → :5001)を追加したり、LAN ディスカバリでマシン間でサービスを共有したり、すべてを numa.toml で設定したりできます。
広告ブロックとプライバシー
Hagezi Pro による広告とトラッカーのブロック。毎日更新されます。どのネットワークでも動作します — カフェ、ホテル、空港。ラップトップと一緒に持ち運べます。
3 つの解決モード:
forward(デフォルト) — 既存のシステム DNS への透過プロキシ。すべてがこれまで通り動作し、その上にキャッシュと広告ブロックが加わります。キャプティブポータル、VPN、企業 DNS — すべて尊重されます。recursive— ルートネームサーバーから直接解決。上流への依存がなく、単一の主体があなたの完全なクエリパターンを見ることはありません。完全な信頼チェーン検証には[dnssec] enabled = trueを追加します。auto— 起動時にルートサーバーをプローブし、到達可能なら再帰、そうでなければ Quad9(https://9.9.9.9/dns-query)への DoH 経由でフォワードし、Quad9 があなたのクエリを見ることになります。別のプロバイダを選ぶには、独自の[upstream]でforwardを使用してください。
DNSSEC は完全な信頼チェーンを検証します: RRSIG 署名、DNSKEY 検証、DS 委任、NSEC/NSEC3 否定証明。仕組みを読む →
DNS-over-TLS リスナー(RFC 7858) — iOS Private DNS、systemd-resolved、stubby などの厳格なクライアントからポート 853 で暗号化クエリを受け付けます。2 つのモード:
- 自己署名(デフォルト) — numa がローカル CA を自動生成します。
numa installが macOS、Linux(Debian/Ubuntu、Fedora/RHEL/SUSE、Arch)、Windows のシステムトラストストアに追加し、numa uninstallが削除します。iOS ではnuma setup-phoneから.mobileconfigをインストールします。Firefox は独自の NSS ストアを保持しシステムのものを無視するため、Firefox で.numaサービスに HTTPS が必要な場合は手動で CA を信頼してください。 - 独自証明書の持ち込み —
[dot] cert_path/key_pathを公開信頼された証明書(例: numa インスタンスを指すドメインでの DNS-01 チャレンジによる Let's Encrypt)に向けます。クライアントはトラストストアの設定なしで接続します — AdGuard Home や Cloudflare1.1.1.1と同じ UX です。
ALPN "dot" は両モードでアドバタイズされ強制されます。ALPN が一致しないハンドシェイクは、クロスプロトコル混同への防御として拒否されます。
Oblivious DoH(RFC 9230) — [upstream] mode = "odoh"(レシピ)では、各クエリがターゲットへ HPKE で封じられ、リレーを通じて送信されます。リレーはあなたの IP と暗号文を見て、ターゲットは質問とリレーの IP を見て、クエリをリダイレクトするリレーは新しい宛先に復号できないものを渡します。Numa は登録可能ドメインを共有するリレーとターゲットを拒否します。ODoH はその後に開く接続を隠しません: ISP は依然として宛先 IP を見て、ECH がなければ TLS ハンドシェイクのホスト名も見ます。
スマートフォンのセットアップ — iPhone または Android を 1 ステップで Numa に向けます:
numa setup-phone
QR コードを表示します。スキャンして、プロファイルをインストールし、証明書の信頼を有効にすると、スマートフォンの DNS が TLS 経由で Numa を通るようになります。numa.toml で [mobile] enabled = true が必要です。
LAN ディスカバリ
複数のマシンで Numa を実行します。mDNS 経由で自動的に互いを発見します:
Machine A (192.168.1.5) Machine B (192.168.1.20)
┌──────────────────────┐ ┌──────────────────────┐
│ Numa │ mDNS │ Numa │
│ - api (port 8000) │◄───────────►│ - grafana (3000) │
│ - frontend (5173) │ discovery │ │
└──────────────────────┘ └──────────────────────┘
Machine B から: curl http://api.numa → Machine A のポート 8000 にプロキシされます。numa lan on で有効化します。
ハブモード: 1 つのインスタンスを bind_addr = "0.0.0.0:53" で実行し、他のデバイスの DNS をそこに向けます — 何もインストールせずに広告ブロック + .numa 解決が得られます。bind_addr は特定のインターフェースのサブセットをバインドするリストも受け付けます。ステップバイステップ: ネットワーク全体のレシピ。
Docker
# Recommended — host networking (Linux)
docker run -d --name numa --network host -v numa-data:/var/lib/numa ghcr.io/razvandimescu/numa
# Port mapping (macOS/Windows Docker Desktop)
docker run -d --name numa -p 53:53/udp -p 53:53/tcp -p 5380:5380 -v numa-data:/var/lib/numa ghcr.io/razvandimescu/numa