本文へ移動
購読
GUIDE#infra更新 2026.09.24

AdGuard Homeで家庭内の広告・トラッカーをDNSでブロックする(Pi-holeとの比較)

AdGuard HomeをDockerで導入し、家中の端末の広告とトラッカーをDNSで遮断。Pi-holeとの違い、ポート53の衝突、上位DNSの暗号化、IPv6ですり抜ける問題の直し方まで。

level
初級
time
約30分
stack
AdGuard Home v0.107 / Docker Compose / Ubuntu
author
@ryoma_t
// 前提条件
Docker Composeが使える常時稼働のLinux機(固定IP) / ルーターのDHCP設定を変更できること
AdGuard Homeのダッシュボードで、問い合わせの多いドメイン・ブロックされた広告ドメイン・上位DNSサーバーの応答時間を確認した画面
画像:nagoya.dev(実際の画面・実行結果をもとに作成)

AdGuard Homeとは、LANに置くDNSサーバーとして動き、広告やトラッキング用のドメインへの問い合わせにだけ 0.0.0.0 のような行き止まりの答えを返すことで、家中の端末の広告と追跡の通信をまとめて止めるオープンソースのソフトウェアです。スマホやスマートテレビのように広告ブロッカーを入れられない機器にも、端末側の設定なしで効きます。

この記事では、Docker版のAdGuard Home v0.107.79(執筆時点)を使い、Ubuntuでポート53が衝突する問題を避けて導入し、上位DNSの暗号化、LAN内の名前の書き換え、ブロックリストの設定、ルーターのDHCPでの配布までを行います。IPv6のDNS通知でブロックがすり抜ける、全員の問い合わせが1つのIPに見える、といった家庭のネットワークで実際に起きる問題の直し方も扱います。

この記事でわかること

  • DNSで広告を止める仕組みと、YouTubeの動画広告のように止められないもの
  • AdGuard HomeとPi-holeの違いと選び方
  • Dockerでの導入手順と、systemd-resolvedとのポート53の衝突の避け方
  • 上位DNS(DoH・DoT)、DNSの書き換え、ブロックリスト、ログ保存期間の初期設定
  • IPv6のDNS通知、ルーター経由の問い合わせ、ブロック解除が効かないときの対処

DNSで広告を止める仕組みと、止められないもの

端末がWebページやアプリの広告を表示するとき、まず広告配信サーバーのドメイン名をDNSで引きます。LANのDNSとして置いたAdGuard Homeは、届いた問い合わせをブロックリストと照合し、一致すれば本物のアドレスの代わりに 0.0.0.0(IPv6なら ::)を返します。端末はどこにも接続できず、広告もトラッカーも読み込まれません。一致しなければ上位のDNSサーバーに問い合わせて、普通の答えを返します。

検証環境で試すと、doubleclick.net はAレコードが 0.0.0.0、AAAAレコードが :: で返り、クエリログには既定で有効な「AdGuard DNS filter」の ||doubleclick.net^ というルールに一致したことが記録されました。www.google-analytics.com も ||google-analytics.com^ で止まり、www.youtube.com や example.com は通常どおり解決されます。

対象DNSで止まるか理由
アプリやWebページに埋め込まれた広告多くは止まる広告専用のドメインから配信されるため
アクセス解析・トラッカー多くは止まる計測専用のドメインに送信されるため
スマートテレビや家電の利用状況の送信一部は止まる送信先が専用ドメインなら止まるが、機能と同じドメインの場合は止まらない
YouTubeの動画広告止まらない動画本体と同じ配信元から届くので、止めると動画も再生できない
検索結果の広告リンク表示は残る広告は検索ページの一部。クリック後の計測ドメインが止まり、リンクが開けなくなることがある
ページ内の広告枠の空白残る見た目を消すのはブラウザ拡張の仕事

DNSでの遮断は「ネットワーク全体の土台」と考え、パソコンのブラウザには別途広告ブロック拡張を入れる、という二段構えが現実的です。YouTubeの動画広告を消す目的で導入すると期待外れに終わります。

Pi-holeとの比較:AdGuard Homeを選ぶ理由

同じ仕組みの代表的なソフトにPi-holeがあります。どちらも無料で、ブロックの効き目そのものは使うブロックリストでほぼ決まるため、違いは周辺機能と運用のしやすさです。

項目AdGuard HomePi-hole
実装Go製の単一バイナリで、Web画面も内蔵FTL(dnsmasqを元にしたDNSエンジン)とWeb画面。v6からWebサーバーを内蔵
上位への暗号化DNSDoH・DoT・DoQを標準で使える標準では平文。暗号化するならUnboundなどを組み合わせる
端末からの暗号化DNSの受付DoH・DoT・DoQのサーバーになれる(証明書が必要)標準機能にはない
端末ごとの設定クライアントごとにブロックリスト、上位DNS、セーフサーチを変えられるグループ単位でリストの適用を分けられる
リストの書式AdBlock形式(`example.com^`)とhosts形式hosts形式・ドメインの一覧が中心
DHCPサーバーありあり

上位への問い合わせを暗号化したい、子ども用のタブレットだけ設定を変えたい、といった要件を1つのソフトで満たしたいならAdGuard Homeが手軽です。すでにPi-holeを使っていて不満がないなら、乗り換える理由はあまりありません。この記事ではAdGuard Homeで進めます(Pi-holeの機能は執筆時点のv6系で比較しています)。

導入前の設計:置き場所・アドレス・止まったときの影響

AdGuard HomeはLANのすべての名前解決の入口になるので、常時稼働している機器に置き、IPアドレスを固定します。Proxmox VEのLXCコンテナ、Raspberry Pi、常時起動のミニPCなどが候補で、この記事では例として 192.168.10.53 を割り当てています。Proxmoxに置く場合のLXCの作り方はProxmox VEの構築ガイドを参照してください。

注意したいのは、AdGuard Homeが止まると家中の「インターネットが使えない」状態になることです。対策は2つあります。1つは2台目のAdGuard Homeを用意して、DHCPで2つのアドレスを配る方法です。もう1つは1台のまま運用し、止まったときにルーターのDHCPのDNS設定を戻す手順を家族にもわかる形で残しておく方法です。DHCPの2つ目のDNSに、フィルタのないルーターや公開DNSを書くのは避けてください。端末は2つのDNSを気まぐれに使い分けるため、広告が消えたり出たりして、原因の切り分けもできなくなります。

Dockerでインストールする

Ubuntuでは、systemd-resolvedが 127.0.0.53 と 127.0.0.54 の53番で待ち受けています。この状態で -p 53:53/udp のようにアドレスを省略して公開すると、Dockerは 0.0.0.0 の53番を確保しようとして、failed to bind host port 0.0.0.0:53/udp: address already in use のようなエラーで起動に失敗します(検証環境で 127.0.0.53 を指定して再現したときの文面は failed to bind host port 127.0.0.53:53/udp: address already in use でした)。resolvedを止める方法もありますが、公開するアドレスをLAN側のIPに限定すれば衝突せず、ホスト自身の名前解決にも手を入れずに済みます。

~/stacks/adguard/compose.yaml
services:
  adguardhome:
    image: adguard/adguardhome:v0.107.79
    restart: unless-stopped
    ports:
      - "192.168.10.53:53:53/tcp"
      - "192.168.10.53:53:53/udp"
      - "192.168.10.53:3000:3000/tcp"   # 初期設定ウィザード用(設定後に削除)
      - "192.168.10.53:80:80/tcp"       # 管理画面
    volumes:
      - ./work:/opt/adguardhome/work
      - ./conf:/opt/adguardhome/conf
terminal
cd ~/stacks/adguard
docker compose up -d
docker compose logs adguardhome | tail -5

conf/ には設定ファイル AdGuardHome.yaml が、work/ にはクエリログや統計、ダウンロードしたブロックリストが保存されます。公式イメージは起動オプションに --no-check-update が付いていて、アプリ内の自己更新は行いません。更新は docker compose pull && docker compose up -d で新しいイメージに入れ替えます。

http://192.168.10.53:3000 を開くと初期設定ウィザードが始まります。管理画面の待ち受けポートは80、DNSは53のままで構いません。管理者のユーザー名とパスワードを決めると、パスワードはbcryptのハッシュで AdGuardHome.yaml に保存され、管理画面が80番に移ります。ウィザードが終わったら、compose.yamlの3000番の行を消して docker compose up -d し直します。

管理画面(80番)とDNS(53番)をインターネットに公開しないでください。外から53番に届くDNSサーバーは、送信元を偽ったDNSリフレクション攻撃の踏み台として悪用されます。外出先から使いたい場合は、TailscaleなどのVPNでLANに入ってから使います。

最初にやる設定:上位DNS・LAN内の名前・ブロックリスト

初期状態の上位DNSは https://dns10.quad9.net/dns-query(Quad9のDoH)で、DoHのホスト名を引くためのブートストラップDNSにQuad9のIPアドレスが入っています。設定のDNS設定画面で、上位DNSを次のように書き換えた例です(検証環境でこの内容を登録できることを確認しています)。

上位DNSサーバー(設定 → DNS設定)
https://dns.cloudflare.com/dns-query
tls://dns.google
[/home.arpa/]192.168.10.1

https:// で始まる行はDoH、tls:// はDoTで、ISPから問い合わせの中身が見えなくなります。3行目の [/home.arpa/]192.168.10.1 は「home.arpa で終わる名前だけはルーター(192.168.10.1)に聞く」という指定で、ルーターが配ったDHCPの名前を引けるようにします。自前のUnboundがあるなら、ここに 192.168.10.2:5053 のように書けば上位をUnboundに任せられます(UnboundでキャッシュDNSサーバーを構築するガイドを参照)。ブートストラップDNSには 1.1.1.1 と 8.8.8.8 のようにIPアドレスで書いた平文のDNSを入れます。

LAN内の機器に名前を付けるなら、フィルタのメニューにあるDNS書き換えで nas.home.arpa → 192.168.10.20 のように登録します。検証では、登録直後から nas.home.arpa がそのアドレスで返りました。書き換えは上位への問い合わせより先に評価されます。

ブロックリストは、初期状態で「AdGuard DNS filter」が有効、「AdAway Default Blocklist」が登録済み・無効になっています。追加は、ブロックリストの画面から一覧で選べます。リストは多いほど良いわけではなく、増やすほど誤検知(必要なサイトまで止まる)が増えるので、最初は既定の1本に1〜2本を足す程度にとどめ、1週間ほどクエリログを見てから調整します。

クエリログの保存期間の初期値は90日、統計は1日です。家族全員が見たサイトの名前が90日分残るので、目的に合わせて7日や24時間に短くし、同居する人には「DNSのログを取っている」ことを伝えてください。設定には、ログに残す接続元IPを匿名化する項目(初期値は無効)もあります。

LAN全体に配る:ルーターのDHCPとIPv6の落とし穴

ルーターのDHCPサーバー設定で、配るDNSサーバーを 192.168.10.53 に変えます。端末は次にDHCPのリースを更新したときから使い始めるので、Wi-Fiを一度切ってつなぎ直すか、Windowsなら ipconfig /renew で反映を早めます。

ここで家庭のネットワーク特有の問題が2つあります。1つ目は、ルーターが自分自身をDNSとして配り、受けた問い合わせをAdGuard Homeへ転送する「DNSプロキシ」動作をしている場合です。この形だと、AdGuard Homeから見た問い合わせの送信元がすべてルーターになり、端末ごとの設定や統計が使えません。さらに、AdGuard Homeの初期設定には1つの送信元あたり毎秒20件の問い合わせ制限(ratelimit: 20)があるため、家中の問い合わせがルーター1台分として数えられ、混雑時に応答が返らなくなることがあります。DHCPでAdGuard Homeのアドレスを直接配れば解消します。

2つ目はIPv6です。フレッツ系の光回線でIPv6(IPoE)を使っている家庭では、ルーターがIPv6のルーター広告(RA)やDHCPv6で、自分やISPのIPv6のDNSサーバーを端末に通知していることがよくあります。端末はIPv4のDNS(AdGuard Home)とIPv6のDNSの両方を持ち、IPv6側に問い合わせた分はブロックをすり抜けます。Windowsなら ipconfig /all の「DNS サーバー」にIPv6のアドレスが並んでいないかを確認し、並んでいればルーターのIPv6設定でDNSの通知を止めるか、AdGuard HomeのIPv6アドレスを通知するよう変えます。機種によってはこの設定を変えられないので、購入前やルーター選びの際に確認しておくと安心です。回線方式の違いはIPv6 IPoE環境で自宅サーバーを公開するときの注意点にまとめています。

端末側の機能ですり抜ける場合もあります。Androidの「プライベートDNS」、ブラウザのセキュアDNS(DoH)でDNS事業者を明示している設定、iCloudプライベートリレーは、AdGuard Homeを通らずに名前を解決します。家族の端末で効かないときは、まずこれらの設定を確かめます。

つまずきポイント

コンテナが起動しない:address already in use

failed to bind host port … :53/udp: address already in use は、53番をsystemd-resolvedや別のDNSソフト(dnsmasqなど)が使っているときのエラーです。compose.yamlのポート指定に 192.168.10.53: のようにLAN側アドレスを付けます。それでも衝突する場合は、sudo ss -lunp 'sport = :53' で同じアドレスを使っているプロセスを探します。

クエリログの接続元がすべて同じIPになる

すべてルーターのIPなら前の章のDNSプロキシ動作が原因です。すべて 172.17.0.1 のようなDockerのアドレスになる場合は、ホスト自身から問い合わせているか(検証環境でホストのループバック経由で問い合わせると、送信元は 172.17.0.1 と記録されました)、Dockerの設定で送信元が書き換わっています。LANの端末からの問い合わせでも同じ表示になるなら、network_mode: host に切り替え、AdGuardHome.yaml の bind_hosts でLAN側アドレスを指定します。

ブロックを解除したのに、しばらく開けない

クエリログから「ブロック解除」を押すと、@@||www.google-analytics.com^ のような許可ルールがカスタムルールに追加されます。ところがブロックした応答には10秒のTTL(blocked_response_ttl: 10)が付いていて、検証では解除直後の問い合わせにまだ 0.0.0.0 が返り、10秒ほど後に本来のアドレスに変わりました。端末やブラウザも応答をキャッシュするので、Windowsなら ipconfig /flushdns を実行し、ブラウザを開き直してから確かめます。

特定のアプリだけ動かなくなった

ログインや決済の画面、短縮URLは、計測用のドメインを経由することがあり、そこが止まると画面が進まなくなります。クエリログをその端末のIPで絞り込み、ブロックされた行を時刻順に見れば、どのドメインが原因かはたいてい分かります。

動作確認

terminal
dig @192.168.10.53 doubleclick.net +short
dig @192.168.10.53 doubleclick.net AAAA +short
dig @192.168.10.53 example.com +short
dig @192.168.10.53 nas.home.arpa +short

1行目が 0.0.0.0、2行目が ::、3行目が実際のアドレス、4行目が書き換えで登録した 192.168.10.20 なら、ブロックと通常の解決、ローカルの名前がそろって動いています。Windowsでは nslookup doubleclick.net 192.168.10.53 でも同じ確認ができます。ダッシュボードの問い合わせ数とブロック数が増えていき、クエリログで該当の行を開くと、一致したルールとリスト名が表示されます。

よくある質問

AdGuard Homeとは何ですか?

LANに置くDNSサーバーとして動き、広告やトラッカーのドメインへの問い合わせを遮断するソフトウェアです。端末に入れるAdGuardのアプリとは別物で、無料のオープンソース(GPLv3)として公開されています。ルーターのDHCPで配れば、スマートテレビを含むLAN内のすべての機器に効きます。

AdGuard Homeは安全ですか?

ソースコードが公開されたソフトウェアで、自宅のサーバー上で動き、問い合わせの履歴は自分のサーバーにだけ保存されます。外部との通信は上位DNSへの問い合わせとブロックリストの取得が中心です。管理画面とDNSをインターネットに公開しない、管理者パスワードを強くする、の2点を守ることが前提になります。

AdGuardはロシアの会社ですか?

開発元のAdGuardはロシアで創業した企業で、執筆時点ではキプロスの法人(AdGuard Software Limited)が運営しています。最新の会社情報は公式サイトで確認してください。なお、AdGuard Homeは自分の機器で動くオープンソースのソフトで、問い合わせの内容を開発元に送る仕組みは既定では動きません。

YouTubeの広告もAdGuard Homeで消せますか?

動画の前後に入る広告は消せません。YouTubeの動画広告は動画本体と同じ配信元から届くため、DNSで止めると動画自体も再生できなくなります。DNSで止まるのは、広告専用のドメインから配信されるアプリ内広告やトラッカーです。動画広告は、アプリやブラウザ側の機能で対処する領域です。

まとめ

AdGuard Homeは、LAN側アドレスに限定してDockerで起動し、DHCPで自分のアドレスを直接配れば、家中の機器の広告とトラッカーをまとめて減らせます。効かないときに疑う順番は、ルーターのDNSプロキシ、IPv6のDNS通知、端末の暗号化DNS設定の3つで、どれもクエリログの送信元を見れば見当がつきます。止まると家中の名前解決が止まるので、復旧手順を決めてから本番に切り替えてください。

次に読む

$ subscribe --weekly
毎週月曜、企業ITとホームラボの要点を5分で。