Pi-hole: ホームラボで全デバイスの広告をDNSレベルでブロックする方法

HomeLab tutorial - IT technology blog
HomeLab tutorial - IT technology blog

以前、私のホームネットワークは広告だらけでした。スマートTVはバナーを表示し続け、ゲームコンソールは外部に勝手に通信し、IoTデバイスは何をしているかもわかりません。ブラウザ拡張機能はこれらには対応できません。そこでPi-holeを立ち上げてみたところ、ホームラボで過ごした時間の中でも最高の投資になりました。1台のマシン、1つの設定で、すべてカバーできます。

アプローチ比較:広告ブロックの選択肢

セットアップを決める前に、各選択肢とその弱点を把握しておくことが重要です。

ブラウザ拡張機能(uBlock Origin、AdBlock)

デスクトップユーザーの定番です。自分が管理するブラウザには有効ですが、スマートTV、ゲームコンソール、rootなしのスマートフォン、IoTデバイスには一切効果がありません。新しいデバイスを追加するたびに手動設定が必要で、ネットワーク全体の可視性もありません。

ルーターレベルのブロック(OpenWrt、pfSense + pfBlockerNG)

すでにpfSenseやOpenWrtを使っているなら、pfBlockerNGでPi-holeに近い機能を実現できます。ただし設定が複雑で、UIも使いにくく、ルーターと広告ブロックが密結合になってしまいます。DNSの調整のためだけにルーターを再起動するのは避けたいところです。

クラウドDNSフィルタリング(NextDNS、AdGuard DNS)

NextDNSのようなサービスは、専用ハードウェアなしで同様のブロック機能を提供します。便利ですが、DNSクエリが外部インフラを通過します。プライバシーのトレードオフが発生し、サービスの稼働状況に依存します。セルフホスティングを目指すホームラボでは、それは目的に反する選択です。

Pi-hole

セルフホスト型のDNSシンクホールです。ネットワーク上のすべてのデバイスがDNSリゾルバーとして使用します。デバイスが広告ドメインを照会しようとすると、Pi-holeは何も返しません。リクエストはネットワークの外に出ることなくブロックされます。一度設定すれば、デバイスごとの設定不要で、すべてのクエリがログに記録されます。

メリットとデメリット

Pi-holeの優れた点

  • ネットワーク全体をカバー — スマートTV、ゲームコンソール、プリンター、IoTセンサーを含むすべてのデバイス
  • デバイスごとの設定不要 — ルーターのDHCPをPi-holeに向けるだけで完了
  • クエリダッシュボード — ブロックされたクエリ、上位クライアント、上位ドメインのリアルタイム統計
  • カスタムブロックリスト — StevenBlack、Firebog、または任意のhostsファイルを取り込み可能
  • 簡単なホワイトリスト登録 — 誤ってブロックされた場合はコマンド1つで解除
  • 低コストで運用可能 — Raspberry Pi Zero 2Wでもホームネットワークを余裕でさばける
  • オプションのDHCPサーバー — ルーターのDHCPを置き換えてクライアントごとのホスト名を可視化

Pi-holeの弱点

  • 単一障害点 — フォールバックDNSなしでPi-holeが停止すると、ネットワーク全体のDNSが機能しなくなる
  • YouTubeの広告は回避される — Googleはコンテンツと同じドメインから広告を配信するため、DNSブロックでは区別できない
  • ハードコードされたDNSのバイパス — 一部のアプリ(一部のGoogleサービス)はDHCPのDNSを無視し、8.8.8.8などのIPを直接使用する
  • メンテナンスの手間 — ブロックリストの更新、何かが壊れた際のホワイトリストの調整が必要
  • VPNのバイパス — VPNに接続しているデバイスはDNSをVPN経由でトンネリングするため、Pi-holeを回避する

推奨セットアップ

何度か試行錯誤の末にたどり着いたセットアップです。あるとき、Pi-holeのアップデート再起動でネットワーク全体のDNSが落ちた夜があったことも含めて。冗長性は必須です。

ハードウェア

Raspberry Pi 4(2GB)が快適な選択肢です。高速で静音、低消費電力で、すでに持っている方も多いでしょう。消費電力が気になるならPi Zero 2Wでも家庭のDNSを十分にさばけます。LinuxマシンやVMでも動作します。私はProxmox上のLXCコンテナで2年間問題なく運用しています。

Docker vs. ネイティブインストール

すでにホストでDockerを動かしているなら、Docker Composeを使いましょう。アップデートはdocker compose pull && docker compose up -dの1コマンドで済み、設定をバージョン管理できます。専用のRaspberry Piでシンプルに始めたいなら、ネイティブインストーラーで5分あれば完了します。

冗長性

必ずルーターに2つのDNSサーバーを設定してください。Pi-holeをプライマリ、パブリックリゾルバー(1.1.1.1または8.8.8.8)をセカンダリとして設定します。Pi-holeがアップデートで再起動しても、DNSは自動的にフォールバックします。さらに高い可用性が必要な場合は、Gravity Syncで同期した2台のPi-holeインスタンスを運用しましょう。

導入ガイド

オプション1:Raspberry Pi OSへのネイティブインストール

Raspberry Pi OS Liteをフラッシュし、SSHで接続してから実行します:

curl -sSL https://install.pi-hole.net | bash

対話型のインストーラーがインターフェースの選択、アップストリームDNS、ブロックリストの設定を案内します。最後に管理画面のURLとパスワードが表示されます。これで完了です。

オプション2:Docker Compose(ホームラボに推奨)

作業ディレクトリを作成し、docker-compose.ymlを作成します:

services:
  pihole:
    container_name: pihole
    image: pihole/pihole:latest
    ports:
      - "53:53/tcp"
      - "53:53/udp"
      - "80:80/tcp"
    environment:
      TZ: "Asia/Tokyo"
      WEBPASSWORD: "安全なパスワードをここに設定"
    volumes:
      - "./etc-pihole:/etc/pihole"
      - "./etc-dnsmasq.d:/etc/dnsmasq.d"
    restart: unless-stopped
    dns:
      - 127.0.0.1
      - 1.1.1.1
docker compose up -d

管理パネルにはhttp://<your-pi-ip>/adminでアクセスします。

Ubuntuユーザーへ — デフォルトでポート53はsystemd-resolvedが使用しています。先に解放してください:

sudo systemctl disable --now systemd-resolved
sudo rm /etc/resolv.conf
echo "nameserver 1.1.1.1" | sudo tee /etc/resolv.conf

ルーターをPi-holeに向ける

ルーターの管理画面にログインし、DHCP設定を見つけて以下を設定します:

  1. プライマリDNS → Pi-holeの固定IP(例:192.168.1.100
  2. セカンダリDNS → フォールバック用に1.1.1.1

保存してデバイスにリースを更新させるか、手動で再接続します。1分以内にすべてのDNSトラフィックがPi-holeを通るようになります。

より良いブロックリストを追加する

デフォルトのリストはスタートとして十分ですが、真のカバレッジはコミュニティが管理するリストから得られます。管理パネルのAdlistsに移動して以下を追加してください。StevenBlackの統合リスト1つだけで、約17万件の既知の広告・トラッカードメインをカバーします:

https://raw.githubusercontent.com/StevenBlack/hosts/master/hosts
https://v.firebog.net/hosts/AdguardDNS.txt
https://v.firebog.net/hosts/Easylist.txt
https://v.firebog.net/hosts/Easyprivacy.txt

その後、gravityを更新してリストを取り込みます:

# ネイティブインストール
pihole -g

# Docker
docker exec pihole pihole -g

壊れたドメインをホワイトリストに登録する

何かが動作しなくなったら、ダッシュボードのクエリログを確認します。クライアントIPでフィルタリングし、ブロックされたエントリを探します。ブロックすべきでないものをホワイトリストに登録します:

# ネイティブ
pihole -w example.com

# Docker
docker exec pihole pihole -w example.com

Pi-holeをアップデートする

# ネイティブインストール
pihole -up

# Docker — 新しいイメージをプルして再作成
docker compose pull
docker compose up -d

1週間後に期待できること

一般的なホームネットワークでは、Pi-holeがすべてのDNSクエリの15〜25%をブロックします。スマートTV、Androidボックス、大量のIoTデバイスがあるネットワークでは35〜45%に達することもあります。これは広告だけではありません。テレメトリー、アナリティクスの通信、バックグラウンドのチェックインがずっと静かに行われていたものが、すべてシャットアウトされるのです。

クエリログは目を開かせてくれます。私のSamsung TVはアイドル中に1時間に300回以上のDNSリクエストを発行し、その多くがSamsungの広告インフラに向いています。プリンターは常にアップデートを確認し、アプリは数分ごとにアナリティクスのエンドポイントに通信しています。これらすべてがログに記録されます。自分のデバイスが実際に何をしているかを見てしまったら、Pi-holeはラボに欠かせない存在になるでしょう。

Share: