UbuntuにAdGuard Homeをインストール・設定してLAN全体の広告ブロックとDNSセキュリティを実現する

Ubuntu tutorial - IT technology blog
Ubuntu tutorial - IT technology blog

問題:広告とDNSトラッキングが家中のネットワークに侵入している

以前、uBlock OriginをブラウザごとにインストールしていたことがあってーーノートPC、スマートフォン、TVボックスと一台一台設定したのに、それでもAndroidアプリやスマートTVでは広告が普通に流れていた。理由は単純で、拡張機能はブラウザにしかフックできず、ネイティブアプリからのDNSクエリは直接外部に飛んでしまい、何もフィルタリングされないからだ。

さらに言えば、IPカメラ、WiFi電球、ロボット掃除機といったデバイスも、メーカーのサーバーへのテレメトリーを一日中こっそり送り続けている。試しに安物のXiaomiカメラのトラフィックをキャプチャしてみたら、起動後たった10分の間に約15もの異なるドメインへクエリを飛ばしていた。それらのデバイスに拡張機能をインストールする方法はない。

すべてに対処できる唯一の方法は、自分で管理するDNSサーバーを家庭内ネットワークに置き、クエリが外部へ出る前にフィルタリングすることだ。AdGuard Homeはまさにそれをやってくれる。

AdGuard Homeとは何か、なぜPi-holeではなくこれを選ぶのか

AdGuard HomeはDNSシンクホールだ——デバイスと実際のDNSサーバー(8.8.8.8など)の間に入り、クエリされるドメインを一つひとつチェックする。そのドメインがブロックリストに載っていれば、本当のアドレスの代わりに0.0.0.0を返す。ドメインが解決できないため、広告は読み込まれない。

Pi-hole(こちらも非常に人気がある)と比べて、AdGuard Homeの方が便利だと感じる点がいくつかある:

  • DNS-over-HTTPS(DoH)とDNS-over-TLS(DoT)が標準搭載——cloudflaredを別途インストールする必要がない
  • Web UIがよりモダンで、設定ファイルを手動で編集するのではなくウィザードで設定できる
  • DHCPサーバーが統合されている(オプション)
  • 単一バイナリで、PHPやlighttpdを引きずらない

CentOSからUbuntuに乗り換えた頃、aptのバージョンロックがyumとどう違うのかに慣れるまで丸一週間かかった。AdGuard Homeはバイナリ形式でインストールするため、依存関係の問題を完全に回避できる——Ubuntu 20.04、22.04、24.04で何も心配せず動く。

実践:UbuntuへのAdGuard Homeインストール

事前要件

  • Ubuntu Server 20.04/22.04/24.04(Desktopでも動くが、Serverの方がノイズが少ない)
  • LAN内の固定IP——必須。ルーターや各デバイスがこのIPにDNSを向けるため
  • ポート53がsystemd-resolvedに占有されていないこと

ステップ1:ポート53を解放する

Ubuntuはデフォルトでsystemd-resolved127.0.0.53:53でリッスンしている。AdGuard Homeはこのポートが必要なので、先にスタブリゾルバーを無効にする:

# ポート53が使用中か確認する
sudo ss -tlnp | grep ':53'

# systemd-resolvedのスタブリスナーを無効にする
sudo sed -i 's/#DNSStubListener=yes/DNSStubListener=no/' /etc/systemd/resolved.conf

# /etc/resolv.conf のシンボリックリンクを削除して再作成する
sudo rm /etc/resolv.conf
sudo ln -s /run/systemd/resolve/resolv.conf /etc/resolv.conf

# サービスを再起動する
sudo systemctl restart systemd-resolved

# ポート53が空いているか確認する
sudo ss -tlnp | grep ':53'

ステップ2:AdGuard Homeをダウンロード・インストールする

# 最も手軽な方法——アーキテクチャを自動検出して適切なバイナリをダウンロードするスクリプト
curl -s -S -L https://raw.githubusercontent.com/AdguardTeam/AdGuardHome/master/scripts/install.sh | sh -s -- -v

# curlをshにパイプしたくない場合は手動インストール(より安全):
wget https://github.com/AdguardTeam/AdGuardHome/releases/latest/download/AdGuardHome_linux_amd64.tar.gz
tar -xzf AdGuardHome_linux_amd64.tar.gz
cd AdGuardHome
sudo ./AdGuardHome -s install

スクリプトが自動的にバイナリをダウンロードし、systemdサービスとして登録してすぐに起動する。完了後、Web UIはポート3000、DNSはポート53で動作する。

ステップ3:Web UIで設定する

ブラウザを開き、http://<サーバーのIP>:3000にアクセスする。ウィザードはシンプルだ:

  1. ネットワークインターフェース:DNSをリッスンするインターフェースを選択——通常はすべて、またはLANインターフェース。Web UIはポート3000のままか、好みに応じて80に変更できる。
  2. 管理者アカウントの作成:ユーザー名とパスワードを設定する。admin/adminは使わないこと。
  3. ウィザード完了後、ログインして設定 → DNS設定に進む。

ステップ4:DoHでアップストリームDNSを設定する

平文DNSをDNS-over-HTTPSに置き換えることで、アップストリームへのクエリが暗号化され、ISPに何を問い合わせているか読まれなくなる:

# Web UI → 設定 → DNS設定 → アップストリームDNSサーバー
# デフォルトをすべて削除して以下を追加:
https://dns.cloudflare.com/dns-query
https://dns.google/dns-query

# Cloudflareを優先したい場合:
https://1.1.1.1/dns-query
https://1.0.0.1/dns-query

「負荷分散」にチェックを入れると、AdGuardが最もレイテンシの低いサーバーを自動選択する。

ステップ5:ブロックリストを追加する

フィルター → DNSブロックリスト → ブロックリストを追加 → リストから選択に進む。よく使う4つのリスト:

  • AdGuard DNS filter——公式リスト、誤検知が最も少ない
  • EasyList——一般的なWeb広告
  • EasyPrivacy——トラッキングスクリプト
  • Malware Domain List——マルウェア配布ドメインをブロック

更新をクリックしてダウンロードする。この4つのリストを合わせると約50万〜80万ドメインがブロックされる——十分な効果がありながら、誤検知も許容範囲に収まる。

ステップ6:ルーターのDNSをAdGuard Homeに向ける

これが核心となるステップだ。デバイスごとに設定する代わりに、ルーターのDHCP設定でDNSサーバーを変更する——新しくIPを取得したすべてのデバイスが自動的にAdGuardを使うようになる:

# ルーターの設定例(ファームウェアによって異なる):
# プライマリDNS: 192.168.1.x  (AdGuardを動かしているUbuntuマシンのIP)
# セカンダリDNS: 1.1.1.1    (AdGuardがダウンした場合のフォールバック)

# ルーターを変更する前に、Ubuntuマシン上でまずテストする:
sudo resolvectl dns eth0 127.0.0.1
sudo resolvectl domain eth0 ~.

# クエリがAdGuardを経由しているか確認する:
dig @127.0.0.1 doubleclick.net
# 0.0.0.0 が返ってきたら正しくブロックされている

ステップ7:ファイアウォールを設定する

# DNSとWeb UIのポートを開放する
sudo ufw allow 53/tcp
sudo ufw allow 53/udp
sudo ufw allow 3000/tcp   # Web UI(80に変更した場合は80)

# DoT(DNS-over-TLS)を使う場合:
sudo ufw allow 853/tcp

sudo ufw reload

動作確認

ルーターが新しいDNSでDHCPを配布し始めたら、ダッシュボードタブを開くとクエリログがリアルタイムで流れているのが見える。広告の多いページを開いて観察すると、広告ネットワークのドメインがブロック済みのステータスで表示される。

# ターミナルから簡単にテストする:
nslookup ads.google.com 192.168.1.x
# → Server: 192.168.1.x
# → Address: 0.0.0.0  ← ブロックされている

nslookup github.com 192.168.1.x
# → Server: 192.168.1.x
# → Address: 20.207.73.82  ← 正常に解決されている

誤検知への対処——誤ってブロックされたドメインをホワイトリストに追加する

一部のCDNやAPIエンドポイントが誤ってブロックされることがある。フィルター → カスタムフィルタリングルールに進み、AdBlock構文で除外ルールを追加する:

# カスタムルールのホワイトリスト形式:
@@||domain.com^          # ドメイン全体を許可する
@@||sub.domain.com^      # 特定のサブドメインのみ許可する

# 実際によく誤検知されるドメインの例:
@@||cdn.jsdelivr.net^
@@||fonts.googleapis.com^

まとめ

AdGuard Homeの優れた点は、ブラウザ拡張機能よりはるかに低いレイヤーでブロックできることだ——DNSの段階で、デバイスが広告サーバーに1バイトも送信する前に遮断する。一度インストールするだけで、家中のネットワーク——スマートTV、IPカメラ、Androidスマートフォン——がすべてフィルタリングされ、各デバイスに手を加える必要がない。

一点だけ事前に考慮しておきたいのは、AdGuard Homeは24時間365日稼働するサーバーが必要なことだ。消費電力3〜5WのRaspberry Pi 4が理想的だが、NAS上の小さなLXDコンテナでも問題ない。重要なのは、ルーターのセカンダリDNSには必ず1.1.1.18.8.8.8を設定しておくことだ——サーバーがダウンしてフォールバックがなければ、家全体のインターネットが切断される。また、外部からのアクセスを受けるサーバーを運用するなら、Fail2banでブルートフォース攻撃への対策も合わせて検討しておきたい。

Share: