
Rust製のポータブルDNSリゾルバ — .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の単一バイナリ、すべて内蔵。

# 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
# Docker
docker run -d --name numa --network host ghcr.io/razvandimescu/numa
# Nix
nix run github:razvandimescu/numa
sudo numa # フォアグラウンドで実行(ポート53はroot/管理者権限が必要)
ダッシュボードを開く: **http://numa.numa**(または`http://localhost:5380`)
システムDNSとして設定:
macOSとLinuxでは、numaはシステムサービス(launchd/systemd)として実行されます。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ではありません。
ポート番号を覚える代わりに、開発サービスに名前をつけましょう:
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 経由で385K以上のドメインをブロック。どのネットワークでも動作—コーヒーショップ、ホテル、空港。ラップトップと一緒に持ち運べます。
3つの解決モード:
forward(デフォルト)— 既存のシステムDNSへの透過プロキシ。すべて以前と同じように動作し、キャッシュと広告ブロックが追加されるだけ。キャプティブポータル、VPN、企業DNS—すべて尊重。recursive — ルートネームサーバーから直接解決。上流に依存せず、単一のエンティティがクエリパターン全体を見ることはない。完全なチェーンオブトラスト検証のために [dnssec] enabled = true を追加。auto — 起動時にルートサーバーをプローブ。到達可能なら再帰、ブロックされている場合は暗号化DoHフォールバック。DNSSECは完全なチェーンオブトラストを検証: RRSIG署名、DNSKEY検証、DS委任、NSEC/NSEC3 denial証明。仕組みを読む →
DNS-over-TLSリスナー(RFC 7858)— iOS Private DNS、systemd-resolved、stubbyなどのstrictクライアントからのポート853での暗号化クエリを受け付け。2つのモード:
numa install がmacOS、Linux(Debian/Ubuntu、Fedora/RHEL/SUSE、Arch)、Windowsのシステムトラストストアに追加。iOSでは、numa setup-phone から.mobileconfig をインストール。Firefoxは独自のNSSストアを保持しシステムのものを無視するため、.numa サービスのHTTPSが必要な場合は手動でCAを信頼。[dot] cert_path / key_path を公開信頼された証明書(例: Numaインスタンスを指すドメインに対するDNS-01チャレンジによるLet's Encrypt)に設定。クライアントはトラストストアの設定なしで接続—AdGuard HomeやCloudflare 1.1.1.1 と同じUX。ALPN "dot" が両モードでアドバタイズおよび強制され、ALPN不一致のハンドシェイクはクロスプロトコル混乱防止として拒否。
電話のセットアップ — iPhoneまたはAndroidをワンステップでNumaにポイント:
numa setup-phone
QRコードを印刷。スキャンしてプロファイルをインストール、証明書の信頼を切り替え—電話のDNSがTLS経由でNumaを経由するようになります。numa.toml で [mobile] enabled = true が必要。
複数のマシンでNumaを実行。mDNSを介して自動的に相互発見:
マシンA (192.168.1.5) マシンB (192.168.1.20)
┌──────────────────────┐ ┌──────────────────────┐
│ Numa │ mDNS │ Numa │
│ - api (port 8000) │◄───────────►│ - grafana (3000) │
│ - frontend (5173) │ discovery │ │
└──────────────────────┘ └──────────────────────┘
マシンBから: curl http://api.numa → マシンAのポート8000にプロキシ。numa lan on で有効化。
ハブモード: 1つのインスタンスを bind_addr = "0.0.0.0:53" で実行し、他のデバイスのDNSをそこにポイント—インストールなしで広告ブロック + .numa 解決を取得。bind_addr はリストも受け入れ、特定のインターフェースのサブセットにバインド可能。
# 推奨 — ホストネットワーキング(Linux)
docker run -d --name numa --network host ghcr.io/razvandimescu/numa
# ポートマッピング(macOS/Windows Docker Desktop)
docker run -d --name numa -p 53:53/udp -p 53:53/tcp -p 5380:5380 ghcr.io/razvandimescu/numa
ダッシュボードは http://localhost:5380。イメージはデフォルトでAPIとプロキシを 0.0.0.0 にバインド。カスタム設定で上書き:
docker run -d --name numa --network host \
-v /path/to/numa.toml:/root/.config/numa/numa.toml \
ghcr.io/razvandimescu/numa
マルチアーキテクチャ: linux/amd64 と linux/arm64。
ターンキーコンポーズレシピ:
packaging/client/ — ODoHクライアントモード(匿名DNS)、Numa + スターター numa.toml。packaging/relay/ — 公開ODoHリレー、Numa + Caddy + ACME。キャッシュクエリ0.1ms — UnboundやAdGuard Homeに匹敵。ワイヤレベルキャッシュは生バイトをその場でTTLパッチングして保存。リクエストヘッジングによりp99スパイクを排除: コールド再帰p99 538ms vs Unbound 748ms(−28%)、σ 4倍タイト。ベンチマーク →
.numa ローカルドメイン — 自動TLS、パスルーティング、WebSocketプロキシtls://)numa relay、RFC 9230)MIT
| プラットフォーム | インストール | アンインストール |
|---|
| macOS | sudo numa install | sudo numa uninstall |
| Linux | sudo numa install | sudo numa uninstall |
| Windows | numa install (管理者) + 再起動 | numa uninstall (管理者) + 再起動 |
| Pi-hole | AdGuard Home | Unbound | Numa |
|---|
| ローカルサービスのプロキシ + 自動TLS | — | — | — | .numa ドメイン、HTTPS、WebSocket |
| LANサービスディスカバリ | — | — | — | mDNS、設定不要 |
| 開発者オーバーライド(REST API) | — | — | — | 自動復元、スクリプト可能 |
| 再帰リゾルバ | — | — | はい | はい(SRTT選択付き) |
| DNSSEC検証 | — | — | はい | はい(RSA、ECDSA、Ed25519) |
| 広告ブロック | はい | はい | — | 385K+ ドメイン |
| Web管理UI | フル | フル | — | ダッシュボード |
| 暗号化上流(DoH/DoT) | cloudflaredが必要 | DoHのみ | DoTのみ | DoH + DoT(tls://) |
| 暗号化クライアント(DoTリスナー) | stunnelサイドカーが必要 | はい | はい | ネイティブ(RFC 7858) |
| DoHサーバーエンドポイント | — | はい | — | はい(RFC 8484) |
| リクエストヘッジング | — | — | — | 全プロトコル(UDP、DoH、DoT) |
| Serve-stale + プリフェッチ | — | — | TTL 90%でプリフェッチ | RFC 8767、TTL <10%でバックグラウンドリフレッシュおよびstale serve時 |
| 条件付き転送 | — | はい | はい | はい(サフィックスごとのルール) |
| ポータブル(ラップトップ) | いいえ(アプライアンス) | いいえ(アプライアンス) | サーバー | 単一バイナリ、macOS/Linux/Windows |
| コミュニティ成熟度 | 56Kスター、10年 | 33Kスター | 20年 | 新しい |
setup-phone QRフロー、モバイルAPI、mobileconfigプロファイル.numa ネーム — DHTバックアップ、レジストラ不要