VPSにAdGuard Homeをセットアップする方法
UbuntuにAdGuard Homeをインストールし、初回ウィザードを終え、Web UIを保護し、DNS-over-HTTPSとDNS-over-TLSを有効にし、端末を自分のリゾルバへ向け、インターネット全体が悪用できるオープンDNSサーバーを避けます。

AdGuard Homeは、Webインターフェース付きのセルフホストDNSシンクホール兼、再帰に近いリゾルバです。DNSとして使うすべての端末 — スマートフォン、ノートPC、スマートTV、ほかのVPSプロジェクト — で広告、トラッカー、マルウェアドメインを遮断できます。ブラウザ拡張と違い、hostsファイルを無視するアプリにも効きます。外出先でも同じフィルタリングが欲しいとき、自宅ネットにRaspberry Piを置きたくないときに、VPSで動かす意味があります。
出荷してはいけない危険な既定は、オープンリゾルバです。UDP/TCP 53がアクセス制御なしでインターネット全体から届くと、見知らぬ人がDNS増幅にVPSを使い、濫用の苦情が来ます。このガイドではUbuntuにAdGuard Homeを入れ、暗号化DNSを意図的に公開しない限りDNSをlocalhostまたはプライベートなWireGuardインターフェースにバインドし、ダッシュボードをHTTPSにし、クラシックなポート53を世界に開けずにノートPCとスマートフォンがDNS-over-HTTPS(DoH)またはDNS-over-TLS(DoT)を使う方法を示します。
AdGuard Homeが向いていること
比較対象はたいていPi-holeです。AdGuard HomeはWeb UI内蔵の単一バイナリで、任意の暗号化DNSフロントエンドとクライアントごとの設定があります。Dockerでもsystemdサービスでも動かせます。HiddenceのVPSではプライベートVPNと相性がよく、端末がWireGuardに入り、トンネル経由でVPSへDNSを送り、ポート53を公開しません。
- すべての端末にアプリを入れずに、ネットワーク全体でブロック
- DoH(443)とDoT(853)で、公衆Wi-Fi上のDNSが平文にならない
- クエリログと統計で、どの端末がどのドメインに話しているか見える
- カスタムアップストリーム(Quad9、Cloudflare、自分のUnbound)
- フットプリントが小さい — 1 GBのVPSで家庭と数台の追加クライアントをフィルタできる
要件
DoH/DoTとダッシュボード用の信頼できる証明書が欲しいならドメインが必要です。最初はHTTPとサーバーIPで試せますが、そのままにしないでください。Ubuntuでsystemd-resolvedがすでにポート53を持っている場合は、AdGuard HomeがDNSをバインドする前に空けます。
- root/sudo付きのUbuntu 22.04または24.04 VPS
- 個人利用なら1 GB RAMで足りる
- VPSへのAレコード付きドメインまたはサブドメイン(dns.example.com)
- SSHアクセス。トンネル内だけDNSにしたい場合は任意でWireGuard
ステップ1:ポート53を空け、AdGuard Homeをインストールする
Ubuntu Serverはしばしばsystemd-resolvedを 127.0.0.53:53 のスタブとして動かします。AdGuard Homeは選んだインターフェース上の53が欲しいです。インストーラーでもできますが、明示的にやるとVPS自身のDNSが中途半端に壊れません(サーバーはパッケージ解決のためまだ名前解決が必要です)。
ssh root@YOUR_VPS_IP
apt update && apt -y upgrade
apt -y install curl ca-certificates
# See who owns port 53:
ss -tulpn | grep ':53'
# Typical Ubuntu fix: stop stub listener, point the OS at a temporary resolver
mkdir -p /etc/systemd/resolved.conf.d
cat >/etc/systemd/resolved.conf.d/adguardhome.conf <<'EOF'
[Resolve]
DNS=1.1.1.1
DNSStubListener=no
EOF
ln -sf /run/systemd/resolve/resolv.conf /etc/resolv.conf
systemctl restart systemd-resolved
curl -s -S -L https://raw.githubusercontent.com/AdguardTeam/AdGuardHome/master/scripts/install.sh | sh -s -- -vステップ2:初回ウィザード
インストーラーはURLを表示します。多くの場合は http://YOUR_IP:3000/ です。開き、長いパスワードの管理者ユーザーを作り、リッスンアドレスを選びます。公開VPSでの安全な最初の構成は、Admin Webを 127.0.0.1:3000(手前にCaddyを置く)またはTLS後の80/443、DNSリッスンを 127.0.0.1:53 とVPNインターフェースにし、0.0.0.0:53 にはしない、です。友人向けにLAN風DNSが本当に必要なら、オープンな53/udpではなく、認証付きの443/853上のDoH/DoTを優先します。
信頼できるアップストリームDNSサーバーを選びます。多くの人は https://dns.quad9.net/dns-query またはCloudflareを使います。フェイルオーバーを速くしたいなら並列リクエストを有効にします。まず既定のフィルタリストをオンにし、追加は後からです。初日に50個のリストを有効にすると、サイトが壊れたときの切り分けが不可能になります。
ステップ3:ダッシュボード用のリバースプロキシとHTTPS
ウィザードが終わると、AdGuard HomeはUIをポート80へ移すことがよくあります。サイトもホストしているとCaddyやNginxと衝突します。きれいなパターンは、AdGuard HomeのWebを 127.0.0.1:8080、DNSを 127.0.0.1:53、Caddyを443でダッシュボードとDoHの両方、です。
# In AdGuard Home settings, bind the web UI to 127.0.0.1:8080
# Example Caddyfile:
dns.example.com {
reverse_proxy 127.0.0.1:8080
}
# After Caddy is up:
curl -I https://dns.example.comステップ4:DNS-over-HTTPSとDNS-over-TLSを有効にする
Encryption設定で暗号化を有効にし、サーバー名を dns.example.com にし、AdGuard Homeを証明書ファイルへ向けます。Caddyが保存するものでも、443で待受する場合にAdGuard Home自身が取得するものでも構いません。DoHは通常 https://dns.example.com/dns-query です。DoTは dns.example.com:853 です。Caddyがすでに443を持っているなら、CaddyにTLSを終端させ、DoHパスをAdGuard Homeの平文HTTP DoHポートへリバースプロキシするか、AdGuard Homeに443を聴かせダッシュボードを別サブドメインにします。
すべての端末を変える前に、クライアントで確認します。新しいcurlがあるノートPCでは:
curl -H 'accept: application/dns-json' 'https://dns.example.com/dns-query?name=example.com&type=A'
# DoT test (kdig from knot-dnsutils, if installed):
# kdig @dns.example.com +tls-ca +tls-host=dns.example.com example.comステップ5:実際の端末をリゾルバへ向ける
Windows 11と最近のAndroidはDoHテンプレートを使えます。iOSは構成プロファイルかDoH対応クライアントです。FirefoxとChromiumもカスタムDoH URLを許可します。自宅ルーターでは、ルーターがDoT/DoHに対応しているときだけWAN DNSを設定します。そうでなければWireGuardを動かし、DNSをVPSのVPN IPにして、クラシックDNSがインターネットを横断しないようにします。
- Android 9+: プライベートDNS(DoT)→ dns.example.com
- Firefox: 設定 → ネットワーク → DNS over HTTPS → カスタムURL https://dns.example.com/dns-query
- Apple端末: 署名済みmobileconfig、またはDoH/DoT対応アプリ
- 他のVPS: resolv.confまたはsystemd-resolvedを、このAdGuardインスタンスのWireGuard IPへ
- 暗号化なしで、無作為の公衆網のDNSとしてこのVPS IPを設定しない
ステップ6:ファイアウォール — オープンな再帰DNSを閉じる
ここが嫌なサプライズを防ぎます。SSH、HTTPS、任意でDoT用の853/tcpを許可します。非常に限定的でレート制限と認証のある設計でない限り、0.0.0.0/0 から53/udpを許可しないでください。その場合でも、おそらくすべきではありません。
ufw allow OpenSSH
ufw allow 443/tcp comment 'dashboard + DoH'
ufw allow 853/tcp comment 'DoT'
# If DNS is only on WireGuard (example iface wg0, 10.8.0.1):
# ufw allow in on wg0 to any port 53 proto udp
ufw enable
ufw status verbose
# Confirm 53 is not public:
ss -tulpn | grep ':53'フィルタ、許可リスト、クライアント
AdGuardの既定DNSフィルタとマルウェアリスト1つから始めます。サイトの挙動がおかしいときはクエリログを見て、ブロックを全部切るのではなく、具体的な許可ルールを足します。クライアント名(IP、またはDoH URLのClientID)を使い、スマートTVには厳しめ、仕事用ノートには緩めのリストを適用できます。セーフサーチは本当に欲しいときだけ有効にします。頼んでいないのにGoogleの結果が書き換えられると驚く人がいます。
- クエリログ: ブロックされたドメインを見つけ、誤検知ならホワイトリスト
- クライアント設定: 端末ごとに異なるブロックリスト
- 許可しないクライアント: 自分が所有していない範囲をブロック
- レート制限: 一握り以上のユーザーに公開するならオンにする
トラブルシューティング
VPS自身がapt updateできないなら、ポート53を空けたときにローカルDNSを壊しています。上のとおりresolved.confに静的リゾルバを置きます。端末は「インターネットがある」のに広告がまだ出るなら、DNSを迂回しています(ハードコードされたリゾルバ、ブラウザのDoH、独自DNSを使うアプリ)。ダッシュボードが空なら、別インスタンスを見ているか、ウィザード後にUIが移ったあともポート3000に当たっています。
- aptが失敗: /etc/resolv.conf と systemd-resolved を確認
- ポート53使用中: ss -tulpn、スタブリスナーを無効化
- DoHの証明書エラー: ホスト名が証明書のSANと一致する必要がある
- 広告がまだ見える: ブラウザのDoHが別プロバイダへ行き、OSを上書き
- RAMが高い: クエリログ + フィルタリスト過多 — リストを削りログ保持を短く
セキュリティチェックリスト
Web UIは管理パネルです。一意のパスワード、HTTPSのみ、URLを公開しない。AdGuard Homeは更新し続けます。インストールスクリプトとUIの両方に更新経路があります。自分の端末だけがDoHを使うなら443を制限します。有名なオープンリゾルバより、DoHパスのHTTP basic authやWireGuard限定の方がずっと安全です。
- 公開の53/udpはなし
- ダッシュボードはHTTPS
- 強い管理者パスワードをパスワードマネージャーに保存
- 家族の端末はWireGuard + 内部DNSを優先
- AdGuardHome.yamlをサーバー外へバックアップ
ヒント
- アップグレードの前に毎回 /opt/AdGuardHome/AdGuardHome.yaml をバックアップ
- 専用サブドメインを使い、無関係なCMSと共有しない
- すでにCaddyを動かしているなら、443はCaddyに任せAdGuard Homeはlocalhostに
- 端末用のDoH URLを記録する — 忘れます
- SSH強化とファイアウォールのガイドと組み合わせ、VPSが『DNSだけ安全』にならないように
VPS上のAdGuard Homeは素直です。ローカルでポート53を空け、インストーラーを実行し、強い管理者パスワードでウィザードを終え、UIをHTTPSにし、DoH/DoTを有効にし、クラシックDNSを公衆インターネットから外します。端末を暗号化エンドポイントかVPN IPへ向け、フィルタは少なめから始め、壊れたらクエリログを使います。それが実際に自分で制御するプライベートリゾルバです。濫用データベースにVPSが載る公開オープンDNSではありません。