オープンリゾルバー、そして1週間後のヌルルート
ファイアウォールのルールが一つ多かった、あるいは access-control の行が allow のまま残されていた。スキャナーは数時間でそのポートを見つけ、増幅トラフィックが始まり、不正利用の報告が届き、その IP は沈黙する。デフォルトで拒否し、トンネルだけを許可し、ネットワークの外側からテストすること。

あなたのデバイスが調べるすべてのドメインは、誰か他人のファイル — ISP か、無料のパブリックリゾルバーのもの — の中にタイムスタンプ付きの1行として記録されている。そのファイルを自分の所有するマシンへ移すための6つのステップ — ルートから解決する Unbound、その手前でフィルタリングする AdGuard Home、本物の証明書による暗号化 DNS、そしてインターネットに一切さらされないポート53。この箱の費用は月額 $3.90。Debian 12 で検証済み。
全体像
再帰であり、転送ではない
閉じる
ポート53、開く前に
解決
Unbound、検証
フィルタ
AdGuard Home、DoH、DoT
到達
まずトンネル、次にクライアント
確認
リーク、DNSSEC、稼働率
ディスクを暗号化し、トラフィックをトンネルに通し、Monero で支払い、メールなしでサインアップする — それでいて、ノートPCには、考えたこともないリゾルバーに、触れるすべてのホスト名を、一度に1件ずつ、一日中平文で問い合わせさせたままにしている。名前解決は、人々が最後に強化する部分であり、そして実際に誰が何をしているかについて、最も鮮明な記録を生み出す部分でもある。
その記録に何が含まれているのかを正確に押さえておく価値がある。「DNS はブラウジングを漏らす」という言い方は、正しくはあるが雑でもあるからだ。クエリログとは、問い合わせを行った IP アドレスに紐づいた、タイムスタンプ付きのドメイン名のリストだ。読んだページそのものではなく、たいていは正確な URL でもない。それはもっと静かで、プロファイリングにとってはより都合の良いものだ — 生活の輪郭そのものだ。銀行。勤め先。4分おきにチェックインする出会い系アプリ。深夜2時に一度だけアクセスした医療系サイト。同じメッセージングクライアントに属しているために、いつも一緒にしか現れない3つのドメイン。索引がここまで優れていれば、中身などもう誰も必要としない。
その索引を保持しうる主体は4つあり、セルフホストはそれを最初の2つから4つ目へと移す。
| セットアップ | すべてのクエリを誰が見るか | 回線上で見えるもの | 匿名セット |
|---|---|---|---|
| ISP のリゾルバー、平文(デフォルト) | あなたの ISP、氏名とアカウントで | 経路上の誰からも、すべてが見える | その ISP の契約者全体 |
| パブリックリゾルバー、暗号化(DoH/DoT) | その1社に、あなたの IP と紐づけて | 宛先以外は何も見えない | 数百万人 |
| 自分のリゾルバー、アップストリームへ転送 | 選んだアップストリーム — そのまま変わらず | 宛先以外は何も見えない | 1人 |
| 自分のリゾルバー、ルートから再帰 | 誰も見えない — 各ゾーンは自分の名前しか見ない | 宛先以外は何も見えない | 1人、しかもあなただと特定できない IP 上で |
3行目こそが、人々が引っかかりがちな行だ。自分のサーバーにリゾルバーをインストールし、すべてを 1.1.1.1 に転送するよう設定しても、変わることはただ一つ — あなたのクエリが、別の IP アドレスから Cloudflare に届くようになるだけだ。ログは相変わらず存在し、相変わらず他人のものであり、そのうえあなたは、何の見返りもなく維持すべきマシンを1台増やしただけになる。
最後の列が、正直なコストであり、本ガイドではこれに二度立ち返ることになる。一つの家庭が使うリゾルバーは、そのクエリが紛れもなくその家庭のものであるリゾルバーだ。それでもこの代償を払う価値があるのは、問い合わせを行っている IP が、身元書類の紐づいていない、レンタルされた北欧のサーバーだからだ — 契約者名の付いた自宅回線でも、カード情報の登録されたハイパースケーラーのアカウントでもない。匿名セットは縮小するが、実際に断ち切られるのは、人物への結びつきの方だ。
「自分専用の DNS サーバー」という言葉の裏には、まったく異なる2種類のマシンが隠れており、ほとんどのチュートリアルは間違った方を作ってしまう。何かをインストールする前にこれを決めておくこと。それが、プライバシーツールと、他人のプライバシーポリシーの単なる代理人との違いになるからだ。
フォワーダー は、あなたのクエリを受け取り、別のリゾルバー — 典型的には Cloudflare、Google、Quad9、あるいはあなたの ISP — に渡し、返ってきたものをキャッシュする。シンプルで速いが、クエリの全体像をまるごと単一の第三者に引き渡すことになる。「では最後にアップストリームを 1.1.1.1 に設定してください」で締めくくられるガイドは、すべてこれを作っている。
再帰リゾルバー は、その作業を自分自身でこなす。mail.example.com を見つけるために、まずルートサーバーに .com を管理しているのは誰かを尋ね、次に .com サーバーに example.com を管理しているのは誰かを尋ね、最後に example.com 自身のネームサーバーにそのレコードを尋ねる。3つか4つの異なる運営者との、3つか4つの短いやり取りであり、そのうちの誰も、他の相手について何も知らされない。QNAME 最小化を有効にすればさらに徹底できる — ルートには .com についてしか尋ねず、.com サーバーには example.com についてしか尋ねない。完全な名前が明かされる相手はただ一者のみ — その名前をホストしている当人であり、どのみち30ミリ秒後にはあなたの接続を受け取ることになっていた相手だ。
| 項目 | Unbound、再帰 | 任意のフォワーダー | AdGuard Home 単体 |
|---|---|---|---|
| 単一の主体がすべてのクエリを見る | なし | はい | はい — そのアップストリームが |
| DNSSEC をローカルで検証 | はい | アップストリームからの結果を信頼 | アップストリームからの結果を信頼 |
| ブロックリストとデバイスごとのルール | ローカルゾーン経由のみ | デーモンによる | あり、Web インターフェース付き |
| クライアント向けの DoH / DoT リスナー | DoT はネイティブ対応、DoH はプロキシ経由 | デーモンによる | 両方とも標準搭載 |
| コールドスタート時のレイテンシ | 3〜4回のラウンドトリップ | 1回のラウンドトリップ | 1回のラウンドトリップ |
| 正解 | スタックにおけるプライバシー担当の半分 | 意図的なフォールバックとしてのみ | 手前に立つ、フィルタリング担当の半分 |
右側の2列は競合しているのではなく、同じ構成の二つの半分だ。AdGuard Home がポート53を受け持ち、ブロックリストを適用し、暗号化トランスポートを終端する。Unbound はその裏でループバック上に控え、名前解決を行う。どちらの半分も、相手の仕事はうまくこなせない。両者をつないでも、必要な RAM は合計で100メガバイト程度にすぎない。
このページから一つだけ持ち帰るとすれば、これにしてほしい。パブリックな DNS プロバイダーへ転送するリゾルバーは、あなたの DNS をプライベートにはしていない。それはログをホップ一つ分だけ移動させ、あなたの保守対象リストにサーバーを一台増やしただけだ。再帰こそがすべての要点だ。
まずは箱を注文する。パネルでは 注文 → VPS → Sentinel、イメージは Debian 12、使うデバイスに最も近い拠点を選ぶ — Helsinki、Stockholm、Oslo、あるいは Reykjavík のいずれか。アカウント開設にメールアドレスは不要で、請求は Monero、Bitcoin、Lightning、その他対応している資産のいずれかで決済される。これは通常以上に重要な点だ。個人用リゾルバーの価値はすべて、問い合わせを行う IP アドレスが名前にたどり着けないことにかかっているからだ。
次に 最初の1時間のハードニングチェックリストを一通り実施する — SSH 鍵のみ、パスワードログインなし、無人アップグレード — 以降の手順はすべて、まだ侵害されていない箱であることを前提としているからだ。
インターネット全体に応答してしまう再帰リゾルバーはオープンリゾルバーと呼ばれ、ポートが開いてから数時間以内に、インターネット全域をスキャンするツールに見つかってしまう。DNS は UDP 上で動作し、UDP の送信元アドレスは容易に偽装でき、60バイトのクエリから何十倍も大きな応答を作り出せる — つまりオープンリゾルバーは、第三者に対するサービス拒否攻撃のための無料の増幅装置になってしまう。その後に続く経過は常に同じだ — トラフィックが始まり、不正利用の報告が届き、その IP はヌルルートされる。これは最初の DNS サーバーが行き着く末路として、断トツで最も多いものだ。これを完全に防ぐルールは2つ — リゾルバーの設定でデフォルト拒否にすること、そしてファイアウォールで 0.0.0.0/0 からの 53/udp を絶対に許可しないこと。
だからこそファイアウォールが最初に来る。まだ何もリッスンしていないうちに設定してしまう。以下のルールは 10.8.0.0/24 上の WireGuard トンネルを前提としている — まだ構築していないなら、このページ下部にリンクされている WireGuard ガイドは15分程度の寄り道で済み、この設計全体が最も気持ちよく動くトランスポートでもある。
ufw default deny incoming
ufw allow 22/tcp # or your moved SSH port
ufw allow 51820/udp # WireGuard
ufw allow in on wg0 to any port 53 proto udp
ufw allow in on wg0 to any port 53 proto tcp
ufw enable
# DNS is NOT opened to the world. Confirm it:
ufw status numbered | grep 53
意図的に欠けているものに注目してほしい。パブリックインターフェースで53番を開くルールは存在しない。ポート53が存在するのは wg0 とループバック上だけだ。後で DNS-over-TLS や DNS-over-HTTPS を追加する場合、それらは TCP 853 と TCP 443 であり、証明書によって認証され、ステップ05で専用のルールが与えられる — いずれにせよ、平文の UDP ポートは閉じられたままになる。
では、ポートを空けておこう。 Ubuntu では — そして誰かが有効にした Debian でも — systemd-resolved がすでに 127.0.0.53:53 でリッスンしており、Unbound はバインドエラーで起動を拒否する。多くの人がこのエラーを20分ほど誤読して悩むことになる。まず確認し、スタブリスナーだけを無効化する。systemd-resolved 自体はローカルのクライアント側インターフェースとして残しておく。
ss -lunp 'sport = :53' # who owns UDP/53 right now?
mkdir -p /etc/systemd/resolved.conf.d
cat > /etc/systemd/resolved.conf.d/no-stub.conf <<'EOF'
[Resolve]
DNSStubListener=no
EOF
systemctl restart systemd-resolved
ss -lunp 'sport = :53' # should now be empty
まっさらな Debian 12 では、最初のコマンドは何も出力せず、対処すべきことも特にない。それでも一応実行しておくこと — 一瞬で終わるし、そうしなければ「アドレスはすでに使用中です」というエラーを、動いているとは知らなかったサービス相手に診断する羽目になる。
Unbound は NLnet Labs が開発した、検証・再帰・キャッシュ機能を備えたリゾルバーだ。あらゆる場所でパッケージ化されており、インターネットの相当な部分がすでにこれを動かしている。標準の状態では再帰動作をする — フォワーダーにするには、わざわざ手を加える必要がある。ルートヒントパッケージと一緒にインストールしておけば、どこからもリストを取得することなく、ルートサーバーの場所を把握できる。
apt update && apt install -y unbound dns-root-data
unbound -V | head -2
dns-root-data パッケージは、ルートヒントを /usr/share/dns/root.hints に、DNSSEC のルートトラストアンカーを /usr/share/dns/root.key にインストールし、通常のパッケージ経路を通じて両方を更新し続けてくれる。それが、地味だが正しい入手方法だ。cron ジョブで URL から root.hints をダウンロードするやり方は、いずれ気づかれないまま失敗する類のやり方だ。
/etc/unbound/unbound.conf.d/nb-resolver.conf
server:
# ---- Who may ask. Deny first, allow narrowly.
interface: 127.0.0.1@5335
interface: 10.8.0.1
access-control: 0.0.0.0/0 refuse
access-control: ::0/0 refuse
access-control: 127.0.0.0/8 allow
access-control: 10.8.0.0/24 allow
# ---- Privacy of the recursion itself.
qname-minimisation: yes
qname-minimisation-strict: no
hide-identity: yes
hide-version: yes
rrset-roundrobin: yes
# ---- DNSSEC. The anchor is maintained by the dns-root-data package.
auto-trust-anchor-file: "/var/lib/unbound/root.key"
root-hints: "/usr/share/dns/root.hints"
harden-dnssec-stripped: yes
harden-glue: yes
harden-below-nxdomain: yes
harden-large-queries: yes
harden-short-bufsize: yes
aggressive-nsec: yes
val-clean-additional: yes
# ---- Do not be a reflector, even by accident.
refuse-any: yes
ratelimit: 1000
ip-ratelimit: 200
edns-buffer-size: 1232
# ---- Cache. This is where the 4 GB actually earns its keep.
msg-cache-size: 128m
rrset-cache-size: 256m
cache-min-ttl: 60
cache-max-ttl: 86400
prefetch: yes
prefetch-key: yes
serve-expired: yes
serve-expired-ttl: 3600
# ---- Never chase a name that has no business being on the internet.
private-address: 10.0.0.0/8
private-address: 172.16.0.0/12
private-address: 192.168.0.0/16
private-address: 169.254.0.0/16
private-address: fd00::/8
private-address: fe80::/10
num-threads: 2
so-reuseport: yes
verbosity: 0
logfile: ""
remote-control:
control-enable: yes
control-interface: /run/unbound.ctl
そのうちの4行が実質的な仕事をこなしており、それぞれ一言ずつ説明する価値がある。
2つのリスナーに注目してほしい。ポート5335のループバックは、次のステップで AdGuard Home が使うものだ。10.8.0.1 はトンネルのアドレスであり、フィルタリング層を省略することにした場合、VPN 上のクライアントが Unbound に直接クエリを送れるようにしている。まだ WireGuard を動かしていないなら、この2行目のインターフェース指定は今のところ削除しておくこと — その箱に存在しないアドレスでは、Unbound は起動してくれない。
起動して、動作することを確かめる。
unbound-checkconf
systemctl restart unbound && systemctl enable unbound
apt install -y dnsutils
dig @127.0.0.1 -p 5335 nordbastion.com +short
# DNSSEC: the first must come back with the "ad" flag set,
# the second must FAIL — its signatures are deliberately broken.
dig @127.0.0.1 -p 5335 dnssec-tools.org +dnssec | grep -E 'flags:|status:'
dig @127.0.0.1 -p 5335 dnssec-failed.org | grep 'status:'
最初の応答に付く ad フラグは、Unbound がルートからそのレコードまでの署名の連鎖を検証し、それが成立していたことを意味する。2番目の応答での SERVFAIL は、検証が改ざんされた答えをあなたに渡さず拒否したことを意味する。もし2番目がアドレスを返してしまうなら、検証が有効になっておらず、まず確認すべきはトラストアンカーだ。
このステップは厳密には任意だ — Unbound だけですでにプライベートなリゾルバーになっている — が、それでもほとんどの人はこれを望むだろう。AdGuard Home は、ブロックリスト、クライアントごとのポリシー、デバッグ中に読みやすいクエリログを与えてくれるうえ、最も有用な点として、DNS-over-TLS と DNS-over-HTTPS のネイティブなリスナーを備えており、VPN の利用が現実的でないネットワークからでも、スマートフォンやブラウザがあなたのリゾルバーと話せるようになる。
この構成は連鎖であり、うまくいくかどうかはポートを正しく設定できるかにかかっている — AdGuard Home が53番を受け持ちクライアントに向き合い、Unbound は 127.0.0.1:5335 に控えてインターネットに向き合う。その箱の中で53番をリッスンしているものは、他には何もない。
curl -fsSL https://raw.githubusercontent.com/AdguardTeam/AdGuardHome/master/scripts/install.sh | sh -s -- -v
# Web interface: http://<vps>:3000 — reach it over the SSH tunnel below,
# never by opening 3000 to the internet.
ssh -N -L 3000:127.0.0.1:3000 root@<vps>
初回起動時のウィザードは、そのトンネル越しに行うこと。管理用リスナーは 127.0.0.1 かトンネルのアドレスに設定し、絶対に 0.0.0.0 にはしないこと。そして長いパスワードを設定する — このインターフェースは、あなたのネットワークが解決するすべての名前を書き換えられてしまうため、リゾルバー本体と同じくらい機密性の高いものになる。
そして、アップストリームをただ一つだけ設定する。 設定 → DNS 設定 で、デフォルトのリストを消去し、自分の Unbound インスタンスを入力する。1行だけで、他には何も入れない。もしそこにパブリックリゾルバーが残ったままなら、ステップ01でやったことがすべて無駄になる。
127.0.0.1:5335
「Parallel requests」はオフのままにしておく — アップストリームが一つしかないなら、トラフィックを二重にするだけで何の意味もない。「Use private reverse DNS resolvers」も、実際に内部ゾーンを運用しているのでなければオフにする。ブートストラップサーバーは、信頼できるものに設定しておくこと。これらはアップストリームサーバーのホスト名を解決するためだけに使われ、素の IP アップストリームであれば、そもそも一度も参照されることはない。
ブロックリスト — 狭く始める。 本能的には、リストのページですべてを有効にして、カウンターの数字を楽しみたくなるものだ。それをこらえてほしい。どのリストも、あなたのデバイスが何にアクセスしてよいかについて、誰か他人が下した判断の集まりであり、その不具合は静かでわかりにくい — ページが半分しか読み込まれない、ボタンを押しても反応しない、銀行アプリが開かない、といった具合だ。まずはデフォルトの AdGuard DNS フィルタか、OISD のようによく整備された単一の集約リストから始め、2週間ほどそれで過ごしてから、初めて追加する。許可リストを用意し、気兼ねなく使うこと。
あなたはたった今、あなたのデバイスが解決するすべての名前のリストを、他人が保持できないようにするためのマシンを作ったばかりだ — ところが AdGuard Home が真っ先に行うのは、まさにそのリストを、デフォルトで90日間保持することだ。ブロックリストを調整している間は本当に役に立つし、同時にサーバー上で最も機密性の高い、たった一つのファイルでもある。意図して決めること — 「そのデバイスは今何を求めたのか」に答えるには24時間で十分であり、調整が終わればゼロが正直な設定であり、90日間という設定は、デフォルトを放置したまま誰も下すべきではない決定だ。設定 → 一般 → クエリログ で設定し、そのついでに統計の保持期間も設定しておくこと。
ファイアウォールを、新しい構成に合わせて向け直す — トンネルインターフェース上のポート53は、今や AdGuard Home が受け持ち、Unbound はループバック上でしか到達できない。パブリックインターフェースについては何も変わらない — 依然として DNS は一切存在しない。
誰も到達できないリゾルバーは役に立たず、誰もが到達できるリゾルバーはステップ02で見た失敗モードそのものだ。優れた答えはちょうど2つあり、たいていの人は結局その両方を使うことになる — 自宅とノートPCではトンネルを、スマートフォンや UDP がフィルタリングされるネットワークでは暗号化 DNS を。
選択肢A — WireGuard 経由。 2つのうちより優れている方であり、本ガイドがしつこく WireGuard ガイドを指し示している理由でもある。ポート53はインターネットからは見えないままであり、クエリそのものがどんな形であれ信頼できないネットワークを横切ることはなく、更新すべき証明書もない。VPS がすでにあなたの VPN の出口になっているなら、これは各ピアの設定にたった1行加えるだけで済む。
# On the client, in the [Interface] section of the peer config:
DNS = 10.8.0.1
多くの人を悩ませる、ちょっとした落とし穴がある。Linux では、wg-quick はそのアドレスを resolvconf か systemd-resolved 経由で設定するが、どちらもインストールされていない場合、トンネル自体は問題なく確立される一方で、静かに何もしないまま終わってしまう。トンネルを確立した後、resolvectl status で確認するか /etc/resolv.conf を読んで確認すること — トンネルは正常に動いているのに古いリゾルバーの設定が残ったままというのは、まさにこの取り組み全体が防ごうとしているリークそのものだ。
選択肢B — DNS-over-TLS と DNS-over-HTTPS。 デバイスが常にトンネル上にいられるとは限らない場合に必要になる。どちらも証明書によって認証され、それはつまりホスト名が必要になるということだ — A レコードを VPS に向け、AdGuard Home に証明書を直接持たせるか、すでに TLS を終端しているリバースプロキシの背後に置く。リスナーは DoT が 853/tcp、DoH が 443/tcp だ。
ufw allow 853/tcp # DNS-over-TLS
ufw allow 443/tcp # DNS-over-HTTPS
# 53/udp is still NOT open on the public interface. It never will be.
ufw status
DoH のエンドポイントには、推測できないパスを与えること — AdGuard Home では /dns-query/<random> のような形で配信できる。人ごとに異なるパスにしておけば、他の全員のものは何一つ変更せずに、一人だけアクセスを取り消すことができる。これは強い意味での認証ではないが、パブリックなリスナーが、手順が一つ増えただけのオープンリゾルバーになってしまうのを防いでくれる。
| クライアント | 設定のある場所 | 使用するトランスポート |
|---|---|---|
| Android 9 以降 | 設定 → ネットワーク → プライベート DNS → ホスト名 | DNS-over-TLS のみ |
| iOS と macOS | 署名済みの .mobileconfig DNS プロファイル | DoH か DoT、システム全体に適用 |
| Windows 11 | 設定 → ネットワーク → DNS サーバーの割り当て | DoH、アダプターごと |
| Firefox | 設定 → プライバシー → DNS over HTTPS → カスタム | DoH、ブラウザのみ |
| ルーター(ネットワーク全体) | WAN DNS、または DHCP オプション6 | プレーンな DNS — だからトンネルに通す |
ルーターの行こそ、よく考えるべきものだ。DHCP 経由でリゾルバーを配れば、設定画面すら持たない機器も含めて、家中のすべてのデバイスを一度にカバーできる — しかしそうすると、ルーターから VPS までのホップは、公開インターネットを渡るプレーンな DNS になってしまい、それはまさにあなたが止めようとしていたことそのものだ。ルーター自体でトンネルを動かすか、最後の1マイルが暗号化されていないことを受け入れ、再帰の恩恵だけを勝ち取るかのどちらかになる。
最後にもう一つ、知っておく価値のある設定がある。DNS-over-HTTPS を有効にしたブラウザは、トンネルの有無にかかわらず、自身のリゾルバーを使い、システムの設定を静かに無視してしまう。Firefox も Chrome も、地域によってはこれをデフォルトで有効にして出荷している。ブラウザ側もあなたのエンドポイントに向けるか、その DoH をオフにしてオペレーティングシステムに従わせるか、どちらかにすること。
1. インターネットに対して開いていないか? これは、トンネルに参加していないマシンから実行すること — モバイルデータ通信中のスマートフォン、別の VPS、何でも構わない。タイムアウトになるのが正しく、望ましい結果だ。実際に応答が返ってくるということは、インターネット上のあらゆるスキャナーにも見つかってしまうということであり、直ちにステップ02に戻るべきだ。
dig @<public-ip-of-vps> +timeout=3 example.com
# Expected: ";; connection timed out; no servers could be reached"
2. デバイスは本当にそれを使っているか? これは最もよく失敗する確認事項であり、その失敗は目に見えない — トンネルは確立しており、設定も正しく見えるのに、オペレーティングシステムは相変わらず、カフェが DHCP で渡してきたリゾルバーに問い合わせ続けている。リゾルバー自身に、あなたを誰だと思っているか尋ね、その上で反対側からも確認すること。
# On the client — which resolver is the system actually using?
resolvectl status | grep -A2 'Current DNS' # Linux
scutil --dns | grep nameserver # macOS
# On the server — does the query actually arrive?
tail -f /var/log/syslog | grep -i unbound &
unbound-control stats_noreset | grep total.num.queries
次に、そのデバイスから公開されている DNS リークテストのページのいずれかを開き、結果を読む。あなたの VPS プロバイダーの名前が表示されれば、経路は正しい。ISP や大手のパブリックリゾルバーの名前が表示されるなら、トンネルより上流の何かが、まだ応答してしまっている。
3. 検証は本当に有効になっているか? ステップ03の2つの dig コマンドを、今度は Unbound に直接ではなく、チェーン全体 — クライアント、AdGuard Home、Unbound — を通して繰り返す。署名の壊れた名前は、ここでも失敗しなければならない。AdGuard Home の設定のどこかに2つ目のアップストリームが残ってしまっているなら、ここでそれが表面化する。
4. キャッシュはきちんと仕事をしているか? 通常利用を1日行った後、ヒット率はおよそ70〜90パーセントの範囲に収まるはずだ。それより大幅に低い場合、たいていはキャッシュが小さすぎるか、アップストリームの TTL が非常に短いために cache-min-ttl が無視されていることを意味する。忙しいネットワークでそれより大幅に高い場合は、prefetch がうまく機能している喜ばしい兆候だ。
unbound-control stats_noreset | grep -E 'total.num.(queries|cachehits)'
# hit rate = cachehits / queries
そして最後に、2つの運用上の決定が残っている。 第一に、この箱が再起動したときに何が起きるか。それを向いているすべてのデバイスは名前解決を失い、家中の全員がそれを「インターネットが壊れた」と報告するだろう。サービスを失敗時に再起動し、起動時にも開始するよう設定し、その上でわざと一度 VPS を再起動して、復帰することを確かめておく。第二に、フォールバックだ。クライアント側にパブリックリゾルバーをセカンダリとして設定し、障害時にはそのクエリが自分の管理外に出ることを受け入れるか、あるいは別の拠点の別の VPS で2台目のインスタンスを動かすか、どちらかにする。どちらも十分に理にかなっている。日曜の23時にこの問いに初めて向き合う羽目になることこそが、理にかなっていない。
systemctl enable unbound AdGuardHome
systemctl show unbound -p Restart -p RestartUSec
reboot # then, from a client: dig nordbastion.com +short
プライベートなリゾルバーは、本物の改善ではあるが、覆い隠すマントではない。それをマントとして売りつけてくる者がいれば、何か別のものを売りつけようとしていると思っていい。以上をすべて実施した後にも、なお見えたままになっているものの一覧をここに示す。残された露出の形を知っておくことこそが、本物の防御と、ただの気休めとの違いになるからだ。
接続そのものは、依然として発生する。 名前解決の1ミリ秒後、あなたのデバイスは、たった今知ったアドレスへ TCP 接続を開く。あなたの回線を見ている者には、そのアドレスが見えている。専用 IP を持つサイトにとっては、そのアドレスこそがサイトそのものだ。暗号化 DNS は問いを取り除いてくれるが、答えまでは取り除いてくれない。
TLS ハンドシェイクは、たいていサイトの名前を明かしてしまう。 Server Name Indication は、ほぼすべての HTTPS 接続の開始時に平文で送信されるため、受動的な観測者にはどのみちホスト名が読み取られてしまう。Encrypted Client Hello はこれを解決するが、普及にはむらがある — ブラウザとサイトの双方が対応していれば名前は隠されるが、そうでなければ隠されない。有効になっていると決めてかからないこと。
リゾルバーの運営者は、いまやあなた自身であり、あなたはたった一人だ。 あなたのリゾルバーが話しかけるすべての権威サーバーには、自分のゾーンについて尋ねてくる単一の IP アドレスが見えている。多くのゾーンにまたがって見れば、その IP には特徴的なパターンがあり、そのパターンとはすなわち一つの家庭だ。これは最初の章で触れた匿名セットの代償であり、それを和らげてくれる唯一のものは、その IP が名前にたどり着けないこと — 暗号通貨払いの KYC 不要 VPS であること — であり、理想を言えば、あなたのトラフィックがすでに出ていっているのと同じ IP であることだ。
プロバイダーには、いつも通りパケットが見えている。 VPS は、誰かのハードウェア上で、誰かのデータセンター内で動いている。NordBastion は顧客のトラフィックを検査しないし、透明性レポートとウォラントカナリアは、もし要求があった場合に何が起きるかを説明している — それでも、正直なアーキテクチャ上の事実として、あなたが借りているマシンは、他の誰かが物理的に手を伸ばせるマシンでもある。セルフホストによって変わるのは、製品レベルのクエリログも、アナリティクスのパイプラインも、後から改定されうるプライバシーポリシーも存在しなくなるという点だ。そこにあるのはただ、RAM の中でキャッシュを保持する1つのプロセスだけであり、それはあなたが設定し、あなたが意図して選んだ法域の中にある。
あなたが実際に手に入れたものを正確に言えば、こうなる。あなたに関する行動データの中で最も豊富かつ最も安価な情報源が、それを収集することがビジネスモデルの一部であるような主体によって、もはや収集されなくなったということだ。それは限定的な主張であり、同時に本物の主張でもある。脅威モデルが Tor を求めている場面において、このページの内容が Tor の代わりになることは何もない — そしてその場合には、下記の onion サービスガイドこそが、次に読むべき正直な選択肢だ。
| ティア | 月額 | リソース | 無理なく動かせるもの |
|---|---|---|---|
| Sentinel | $3.90 | 2 vCPU · 4 GB · 120 GB | 家庭向けのリゾルバー + WireGuard。それが正解だ。 |
| Garrison | $7.90 | 4 vCPU · 8 GB · 240 GB | それに加えて、Vaultwarden、SearXNG、バックアップ先も |
| Ravelin | $16.90 | 8 vCPU · 16 GB · 480 GB | 小規模チーム、25台のトンネルピア、その他のサービスも並行して |
| 2台目の Sentinel | $3.90 | 別の拠点で | フォールバック用のリゾルバー。障害が起きても、インターネットの停止にはならないように |
この表の中で、DNS を基準に選ばれているものは何もない。30台のデバイス向けのリゾルバーが使うキャッシュは数百メガバイト、CPU コアも1つ分に満たず、トラフィックも月に数百メガバイト程度しか動かさない。ティアは WireGuard のピア数や、その他のサービス、ディスク容量で選ぶこと — そうすればリゾルバーは、ただで便乗させてもらえる。
ファイアウォールのルールが一つ多かった、あるいは access-control の行が allow のまま残されていた。スキャナーは数時間でそのポートを見つけ、増幅トラフィックが始まり、不正利用の報告が届き、その IP は沈黙する。デフォルトで拒否し、トンネルだけを許可し、ネットワークの外側からテストすること。
AdGuard Home をインストールし、アップストリームはデフォルトのリストのまま、すべてが見事に動いている — それでいて、クエリログは相変わらず、設定欄に名前が載っている企業の元に蓄積され続けている。アップストリームは一つだけ設定し、それを自分の Unbound にすること。
resolvconf がインストールされていないために wg-quick が DNS 設定を反映できなかった、あるいはブラウザが独自の DNS-over-HTTPS を行っている。何もかも正しく見えるのに、すべての名前解決は相変わらず、あなたが今いるネットワークへ向かっている。クライアントの設定画面ではなく、リゾルバー側から確認すること。
DNS の不具合だと自ら名乗り出てくるものは何もない — ページが半分しか読み込まれない、ボタンを押しても何も起きない、といった具合だ。初日から攻撃的なリストを6つも有効にすれば、原因の特定は不可能になる。まず一つから始め、ゆっくり追加し、許可リストを用意し、問いに答えられるだけのクエリログを残しておくこと。
この構築全体は、誰かがこのリストを保持することを止めるために存在している。それなのにフィルタリング層は、それをそのままディスク上に3か月も保持してしまう。保持期間は意図して設定すること — 調整中は24時間、それが終わればゼロに — そしてそれが、あなただけでなくネットワーク上の全員をカバーしていることを忘れないこと。
リゾルバーは、他の誰かがそれに頼り始めた瞬間からインフラになる。両方のサービスを起動時に有効化し、Restart=on-failure を設定し、それを証明するためにわざと一度は再起動し、フォールバックは必要になっている最中ではなく、必要になる前に決めておくこと。
これを構築する過程で生じる11の質問 — そもそも構築する価値があるかどうかを左右する2つの質問も含めて。
違いはあり、そして最も重要な点において優れている — ただし正直な答えには二つの側面がある。得られるもの:再帰リゾルバーを使えば、クエリの全体像を一つの主体が見通すことは決してない。ルートサーバーは誰かが .com について尋ねたことを知り、.com サーバーは誰かが example.com について尋ねたことを知り、完全な名前を知るのは example.com の運営者だけだ — そして彼らの誰も、あなたが次に調べる千個の名前を見ることはない。対照的に、パブリックリゾルバーはそのすべてを、順番通りに、タイムスタンプ付きで、永久に見ており、そのリストとあなたとの間にあるのはプライバシーポリシーだけだ。失うもの:個人用リゾルバーの匿名セットは1人分しかない。大手パブリックリゾルバーを出ていくクエリは何百万人もの他人のものと混ざり合うが、あなた自身のリゾルバーを出ていくクエリは紛れもなくあなたのものだ。この代償を払う価値があるのは、リゾルバーの IP があなたの身元に結び付いていない場合であり — それはまさに、暗号通貨払いの KYC 不要 VPS が与えてくれるものであり、カード情報が登録されたハイパースケーラーには与えられないものだ。すでに VPN の出口として使っている VPS の裏にリゾルバーを置けば、匿名セットはまったく縮小しない。その IP はもとからあなたの通信を担っていたからだ。
ある名前を最初に調べるときはわずかに遅く、以後の再照会では明らかに速くなり、全体としてはおおむね相殺される。再帰リゾルバーはコールドスタート時、委任チェーン — ルート、TLD、権威サーバー — をたどる必要があり、これは誰か他人のクエリによってすでに答えがキャッシュされているパブリックリゾルバーへの1回のラウンドトリップに対して、3〜4回のラウンドトリップになる。キャッシュが温まれば — 一般家庭ならおよそ1日かかる — よく使われる名前は1ミリ秒を大きく下回る速さで RAM から返され、あなたの方が優位に立つ。prefetch を有効にしておけば、よく使われるレコードは期限切れになる前に更新され、コールドスタートの状況はほぼ姿を消す。実際にパフォーマンスを失いうる唯一の場面は CDN のジオロケーションだ。大手パブリックリゾルバーは、CDN が近くのエッジを選べるように、あなたのネットワーク位置情報の短縮版(EDNS Client Subnet)を権威サーバーに渡す。Unbound は設計上これを送らない。リゾルバーがあなたと同じ地域にあるなら、これで測定可能な変化は何も生じない。リゾルバーが Reykjavík にあり、あなたが Singapore にいるなら、一部の CDN はヨーロッパのエッジを渡してきて、それを体感することになるだろう。
暗号化トランスポートを使う場合に限り必要になる。WireGuard トンネル越しのプレーンな DNS であれば、ドメインも証明書も、公開された露出も一切必要ない — リゾルバーは 10.8.0.1 のようなプライベートアドレスで待ち受け、トンネル上のピアにのみ応答する。この構成は、本ガイドの中で最もシンプルであり、同時に最もプライベートでもある。ドメインが必要になるのは、DNS-over-TLS や DNS-over-HTTPS を使いたくなった瞬間からだ。どちらも証明書によって認証され、証明書は名前に対して発行されるものだからだ。これは、デバイスが常に VPN 上にいられない場合に選ぶべき構成でもある — 職場のノート PC、UDP をブロックするネットワーク上のスマートフォン、トンネルを維持したがらない家族などだ。ドメインを登録するなら、他の場面で慎重を期してきたのと同じ身元情報を求められない場所で登録し、WHOIS プライバシーを有効にしておくこと。
両者は異なる問題を解決しており、組み合わせは冗長ではない。Unbound はリゾルバーであり、ルートから DNS をたどり、DNSSEC の署名を検証し、結果をキャッシュする。AdGuard Home はそもそもリゾルバーではなく、Web インターフェースと暗号化リスナーを備えたフィルタリングのフロントエンドであり、ブロックしなかったものはすべてアップストリームへ転送する。AdGuard Home だけを動かせば、そのアップストリームはパブリックリゾルバーとなり、クエリの全体像は結局どこか他人のログに戻ってしまう。Unbound だけを動かせば、ブロックリストもデバイスごとのルールもインターフェースもない、正真正銘プライベートなリゾルバーが手に入る。両者を連結すれば — AdGuard が 53 番を受け持ち、Unbound が唯一のアップストリームとして 127.0.0.1:5335 で動く — ルートから応答するリゾルバーの手前に、フィルタリングと暗号化トランスポートが揃うことになる。攻撃対象領域を可能な限り小さくしたく、広告ブロックにはこだわらないのであれば、Unbound 単体でも十分に立派な選択であり、そちらこそがプライバシーを実際に届けているスタックの半分だ。
オープンリゾルバーとは、インターネット上のあらゆる送信元アドレスからのクエリに応答してしまう再帰リゾルバーのことだ。これが大問題である理由は、DNS が UDP 上で動作し、UDP の送信元アドレスは容易に偽装でき、小さなクエリから大きな応答を作り出せるからだ。攻撃者はあなたのサーバーに、送信元を被害者のアドレスに偽装した60バイトのクエリを送りつける。するとあなたのサーバーは律儀に、その何十倍も大きな応答を被害者に送りつけてしまう。これを何千ものオープンリゾルバーで掛け合わせれば、リフレクション・増幅型の DDoS 攻撃となり、あなたのサーバーはその銃口の一つになる。実際には、この経過は速く、予測可能だ — インターネット全域をスキャンするツールが、開いたばかりのポート53を数時間以内に発見し、トラフィックが始まり、不正利用の報告が届き、プロバイダーがネットワークを守るためそのIPをヌルルートする。これは仮定の話でも稀な話でもなく、最初の DNS サーバーが破綻する原因として最も多いものだ。対策の費用はファイアウォールのルール1本と設定1行で済む — デフォルトで拒否し、自分のトンネルだけを許可すること。
隠せるのは名前解決であって、アクセスそのものではない。DNS-over-TLS や DNS-over-HTTPS を使えば、ISP はもはや example.com という平文の問い合わせを目にすることはない。それでも ISP には、その1ミリ秒後にあなたが確立する接続が見えている — 宛先の IP アドレス、そして両端が Encrypted Client Hello に対応していない限り、TLS ハンドシェイクに含まれるサーバー名も平文のままだ。専用 IP を持つサイトなら、そのアドレスだけで特定できてしまうし、大規模な CDN の背後にあるサイトでもアドレスは共有されていても SNI が手がかりになる。つまり暗号化 DNS は受動的なログ収集のコストを引き上げ、最も安上がりで簡単な監視の糸口を取り除いてくれるが、ブラウジングを見えなくするわけではない。脅威モデルが ISP や敵対的なネットワークによる全面的な監視であるなら、そのために使うべき道具はトンネルだ — オペレーティングシステムがトンネルの外で ISP のリゾルバーを使い続けてしまうと VPN だけでは防げないリークを、暗号化 DNS は塞いでくれる。
想像されているよりもずっと小さくて済む。DNS の応答は数百バイトで、クエリごとの処理はハッシュ検索にすぎないため、家庭や小規模チーム向けのリゾルバーはほとんどの時間アイドル状態にある。Sentinel — 2 vCPU、4 GB、月額 $3.90 — であれば、負荷平均がゼロから動く程度で数十台のデバイスをまかなえ、その 4 GB の大半はキャッシュに充てることができる。実際に体感を改善する唯一のリソースがキャッシュだ。Unbound にメッセージキャッシュと RRset キャッシュを数百メガバイト与えれば、ヒット率は80〜90パーセントの範囲に収まるだろう。規模を大きくすべき理由があるとすればそれは DNS のせいではなく、同じ箱が WireGuard トンネルの終端にもなっていたり、Vaultwarden を動かしていたり、バックアップリポジトリを抱えていたりするからだ。帯域幅は問題にならない — よく使われる家庭用リゾルバーでも、月に動くのは数百メガバイト程度だ。
それを使うよう設定されたすべてのデバイスは名前解決ができなくなり、使っている人たちはそれを「インターネットが落ちた」と表現するだろう。これは DNS をセルフホストすることの本当の運用コストであり、後から発見するのではなく、あらかじめ決めておくべき事柄だ。防御策は3つあり、手間のかかる順に並べる。クライアント側にセカンダリのリゾルバーを設定する — Quad9 や dns0.eu のようなパブリックなものだ — そして障害時にはそのクエリが自分の管理外に出ることを受け入れる。これはほとんどの人にとって取るべき方法だ。あるいは、別の拠点の別の VPS で2台目のインスタンスを動かし、両方をリストに載せておけば、もう1台 $3.90 の箱を用意する代償で、すべてを自前のままに保てる。あるいは、トンネル上で各クライアントに小さなローカルキャッシュを動かせば、短時間の障害は気づかれずに済む。どれを選ぶにせよ、ユニットに Restart=on-failure を設定し、起動時に有効化し、わざと一度は再起動してテストしておくこと — 自力で復帰しないリゾルバーは、それを証明する瞬間として必ず最悪のタイミングを選ぶものだ。
ときどきは、壊す。そしてその扱い方こそが、長続きする構成と2週間で取り外される構成との違いになる。ブロックリストは人が判断を下しながら維持しているものであり、時折その判断が、あなたに必要なものを巻き込んでしまう — 銀行の不正検知エンドポイント、配送追跡ウィジェット、アナリティクスのドメインを経由してリダイレクトするログインフローなどだ。この種の不具合はわかりにくい。DNS の問題には見えないからだ — ページが半分しか読み込まれない、ボタンを押しても何も起きない、といった具合になる。これを解決する習慣が3つある。攻撃的なリストを6つ使うのではなく、控えめなリストを1つから始めること。許可リストを用意し、気兼ねなく追加していくこと。そして「このデバイスは今何を求め、我々は何を拒否したのか」に答えられるだけの期間、クエリログを残しておくこと — これによって、フィルタリング用リゾルバーそのものがすべてを記録するデバイスであり、その保持設定がネットワーク上の全員に代わってあなたが下しているプライバシー上の判断であることに気づくはずだ。
できるし、それこそがこれを構築する最良の理由の一つでもある — $3.90 の箱1台で、家庭全体、あるいは数人の友人たち分の DNS をまとめてきれいにできる。安全に行うための決まりは2つ。第一に、共有はトンネル経由か、認証された暗号化エンドポイント経由で行い、ポート53を世界に向けて開けることは絶対にしない。DNS-over-HTTPS を使えば、一人ひとりに別々のパスを割り当てられるので、アクセスを個別に取り消すことができ、AdGuard Home でクライアントごとに異なるフィルタリングを適用することもできる。第二に、自分が何を引き受けることになるのかを自覚しておくこと — あなたはいまや、それを使う全員分のクエリログを保持することになる。保持期間をゼロか1日に設定し、その設定内容を本人たちに伝えること。そして、もしこれがいつか自分自身のプライバシーを守るためのものであるなら、5人が使うリゾルバーは、どの1件のクエリも特定の1人に帰属させにくいリゾルバーでもある、ということも覚えておいてほしい。
まったく問題ない — プライベートでアクセス制御されたリゾルバーはごく普通のワークロードであり、利用規約もそれについて特に何も言っていない。規約が気にかけているのは、そして真面目なネットワークならどこでも気にかけているのは、オープンなリゾルバーが第三者に対する増幅リフレクターとして使われることだ。攻撃トラフィックが私たちのネットワークを出て、他者のネットワークに着弾してしまうからだ。ステップ02に従えば、それは決して起こらない — デフォルトで拒否し、トンネルだけを許可し、それ以外はレート制限すること。もし他者へのサービスとして意図的にパブリックなリゾルバーを運用したいのであれば、それは最初の不正利用報告が届いた後ではなく、事前に相談しておく価値のある話だ — 技術的な要件(応答レート制限、ANY の禁止、監視)はよく知られており、問題なのはうっかり公開してしまうことであって、意図して運用すること自体ではない。
Sentinel — 2 vCPU と 4 GB が月額 $3.90、拠点は Helsinki、Stockholm、Oslo、Reykjavík のいずれか。リゾルバーと、その裏で動かすべき WireGuard トンネル、そしてあなたが借りるのをやめると決めた他の何かにも十分な性能だ。サインアップにメールは不要、身元書類も不要、そしてあなたが調べる何についても、製品レベルのログは一切残らない。
最終レビュー · 2026-10-12 · 出典 · Unbound と AdGuard Home のドキュメント、RFC 9156(QNAME 最小化)、RFC 7858(DNS-over-TLS)、RFC 8484(DNS-over-HTTPS)、systemd-resolved(8) · 頻度 · 年次
This guide is one spoke of a larger series. The pillar walks the three privacy layers end to end — the sibling spokes below dive into the specifics.
Three independent layers — signup, payment, network — explained, legal context included, common mistakes flagged.
Your own WireGuard tunnel — server config, peer keys, kill-switch.
A v3 .onion address that survives reboots and IP changes.
自分だけのTailscaleコントロールサーバー——ACL、MagicDNS、エグジットノード、自前のDERP。
Deploy your own MCP server on a no-KYC VPS — TLS, streamable HTTP, OAuth.
プライベートホスティング、北欧で構築。