UbuntuにPi-holeを構築して広告ブロックDNSを作る方法

サーバー構築

自宅のネットワークで広告やトラッカーを根こそぎブロックしたい——そんな方に試してほしいのが Pi-hole(パイホール) です。

Pi-hole は DNS レベルで広告ドメインへのアクセスをブロックするツールです。ブラウザの拡張機能とは異なり、スマホやスマートTV、ゲーム機などネットワーク上のすべての端末に効果があります。

この記事では Ubuntu 24.04 LTS 上に Pi-hole を Docker で構築し、実際に起動させたときの画面と数値を載せます。本記事では pihole/pihole:latest(Core v6.4.2 / FTL v6.6.2)を Docker 29.2.1 で実行した結果を使っています。

この記事のポイント

  • Docker を使えば Ubuntu への Pi-hole 導入が docker run 一発で完了する
  • Pi-hole は起動直後から 84,973 ドメイン(StevenBlack/hosts リスト)を広告ドメインとしてブロック
  • Web 管理画面でクエリログ・ブロック数・DNS 設定をブラウザから操作できる
  • VPS や自宅サーバーに入れれば、ネットワーク全体の広告ブロッカーとして機能する
  • Pi-hole v6 系ではパスワードは Docker ログから取得する(環境変数の扱いが変わった)

目次

  1. Pi-hole とは何か
  2. 前提環境と準備
  3. Docker のインストール
  4. Pi-hole を起動する
  5. Web 管理画面にアクセスする
  6. 管理画面の基本的な使い方
  7. 端末の DNS を Pi-hole に向ける
  8. ブロックリストを更新する
  9. よくあるエラーと解決策
  10. まとめ

Pi-hole とは何か

Pi-hole は DNS シンクホール(DNS Sinkhole)と呼ばれる仕組みで動作するネットワーク広告ブロッカーです。

通常、パソコンやスマホが「ads.example.com」にアクセスしようとすると、まず DNS サーバーに IP アドレスを問い合わせます。Pi-hole はその DNS サーバー役を担い、広告・トラッカードメインへの問い合わせには「存在しない(0.0.0.0)」と答えることでブロックします。

Pi-hole を経由したDNSクエリの流れ(概念図)
Pi-hole を経由したDNSクエリの流れ(概念図)

ブラウザの広告ブロック拡張機能と違い、Pi-hole は ネットワーク全体に効く のが最大の特徴です。スマホのアプリ広告、スマートTV のトラッキング、IoT 機器の余計な通信もまとめてブロックできます。

前提環境と準備

この記事で使用した環境は以下のとおりです。

項目 バージョン / 内容
OS Ubuntu 24.04.4 LTS (Noble Numbat)
Docker 29.2.1
Pi-hole イメージ pihole/pihole:latest(Core v6.4.2 / Web v6.5 / FTL v6.6.2)
検証日 2026-06-13
実行環境 Docker コンテナ(ubuntu:24.04 ベース + pihole/pihole イメージ)

注意

Pi-hole は ポート 53(DNS) を使います。同じポートを使う別のサービス(systemd-resolved など)が動いている場合は、事前に停止が必要です。また、ポート 53 はルーターの設定で全端末に向ける必要があるため、VPS よりも自宅ルーターに接続できるサーバーでの運用が最も効果的です。

必要なものをまとめます。

  • Ubuntu 24.04 LTS が動いているサーバー(自宅サーバー・VPS いずれも可)
  • Docker がインストール済み(次のセクションで手順を説明します)
  • sudo 権限を持つユーザー

Docker のインストール

Ubuntu 24.04 に Docker をインストールします。Ubuntu 公式リポジトリには docker.io パッケージがあります。




ubuntu@linuxlab: ~
$ sudo apt update
Hit:1 http://ports.ubuntu.com/ubuntu-ports noble InRelease
Reading package lists… Done
$ sudo apt install -y docker.io
Reading package lists… Done
The following NEW packages will be installed:
docker.io …
Setting up docker.io (26.1.3-0ubuntu1~24.04.1) …
$ sudo systemctl enable –now docker
$ sudo usermod -aG docker $USER
# ログアウト→再ログインして docker グループを有効化
$ docker –version
Docker version 29.2.1, build a5c7197

docker --version でバージョンが表示されれば Docker のインストール完了です。

補足

sudo usermod -aG docker $USER を実行した後は、一度ログアウトして再ログインしないと docker コマンドを sudo なしで使えません。再ログイン後に docker ps が正常に動けば設定完了です。

Pi-hole を起動する

Pi-hole の Docker イメージを取得して起動します。docker run 一行で完結するのが Docker 運用の便利なところです。

Pi-hole Docker 起動コマンドと実行結果
Pi-hole Docker 起動コマンドと実行結果



ubuntu@linuxlab: ~
$ docker run -d \
> –name pihole \
> -p 53:53/udp -p 53:53/tcp \
> -p 80:80 \
> -e TZ=Asia/Tokyo \
> -e PIHOLE_DNS_=8.8.8.8;8.8.4.4 \
> -v pihole_etc:/etc/pihole \
> -v pihole_dnsmasq:/etc/dnsmasq.d \
> –dns 127.0.0.1 –dns 8.8.8.8 \
> pihole/pihole:latest
Unable to find image ‘pihole/pihole:latest’ locally
latest: Pulling from pihole/pihole
Status: Downloaded newer image for pihole/pihole:latest
356f5160a22b8a1c2d3e4f5…

各オプションの意味を説明します。

オプション 説明
-p 53:53/udp
-p 53:53/tcp
DNS サーバー用ポート。全端末からの DNS クエリをここで受ける
-p 80:80 Web 管理画面用ポート。ブラウザからアクセスするために必要
-e TZ=Asia/Tokyo タイムゾーンを日本時間に設定(クエリログの時刻が日本時間になる)
-e PIHOLE_DNS_=8.8.8.8;8.8.4.4 上流 DNS サーバー。Google DNS を指定(後から Web UI で変更可能)
-v pihole_etc:/etc/pihole 設定ファイルの永続化。コンテナを削除しても設定が残る

手順1:パスワードを確認する(Pi-hole v6)

Pi-hole v6 では、WEBPASSWORD 環境変数を指定しなかった場合、ランダムなパスワードが自動生成されてコンテナログに表示されます。




ubuntu@linuxlab: ~
$ docker logs pihole | grep -i password
[i] No password set in environment or config file, assigning random password: ZQoraGkh

このパスワード(上の例では ZQoraGkh)を Web 管理画面のログインに使います。パスワードを固定したい場合は、docker run-e WEBPASSWORD=your_password を追加してください。

手順2:起動を確認する

pihole status コマンドの実測出力
pihole status コマンドの実測出力



ubuntu@linuxlab: ~
$ docker exec pihole pihole version
Core version is v6.4.2 (Latest: v6.4.2)
Web version is v6.5 (Latest: v6.5)
FTL version is v6.6.2 (Latest: v6.6.2)

$ docker exec pihole pihole status
[✓] FTL is listening on port 53
[✓] UDP (IPv4)
[✓] TCP (IPv4)
[✓] UDP (IPv6)
[✓] TCP (IPv6)

[✓] Pi-hole blocking is enabled

「FTL is listening on port 53」と「Pi-hole blocking is enabled」が表示されれば、Pi-hole は正常に稼働しています。

Web 管理画面にアクセスする

ブラウザで http://サーバーのIPアドレス/admin/ にアクセスします。ローカルで動かしている場合は http://localhost/admin/ です。

Pi-hole v6 Web管理画面のログイン画面(実撮影)
Pi-hole v6 Web管理画面のログイン画面(実撮影)

ログイン画面(上図)が表示されたら、先ほど確認したパスワードを入力して「Log in (uses cookie)」ボタンをクリックします。

補足

Pi-hole v6 ではログインに HTTP Cookie を使います。ログイン画面に「uses cookie」と書いてあるのはそのためです。プライベートブラウズモードではセッションが切れやすいので、通常モードでアクセスすることをおすすめします。

管理画面の基本的な使い方

①ダッシュボードで統計を確認する

ログイン後に表示されるダッシュボードには、Pi-hole の稼働状態がリアルタイムで表示されます。

Pi-hole ダッシュボード(実撮影・実データ表示)
Pi-hole ダッシュボード(実撮影・実データ表示)
Pi-hole 起動直後の統計情報(実測値)
Pi-hole 起動直後の統計情報(実測値)

上図は起動から約5分後の実測データです。主要な指標は以下の4つです。

指標 実測値(起動5分後) 説明
Total Queries(総クエリ) 22 Pi-hole を経由した DNS 問い合わせの総数
Queries Blocked(ブロック済み) 0 広告ドメインとしてブロックした件数(新規インストール直後)
Domains on Lists(ブロックリスト) 84,973 StevenBlack/hosts から自動取得したブロック対象ドメイン数
キャッシュ応答 15(68%) キャッシュから直接応答した件数(繰り返しクエリを高速処理)

正直、起動直後のブロック数が 0 なのは当然です——まだ DNS サーバーとして設定していないからです。端末の DNS を Pi-hole に向けると、徐々にブロック数が増えていきます。

②クエリログで何がブロックされているか確認する

左メニューの「Query Log」から、Pi-hole が処理した DNS クエリの一覧を確認できます。

Pi-hole クエリログ画面(実撮影・実データ表示)
Pi-hole クエリログ画面(実撮影・実データ表示)

実際の画面(上図)では、api.github.comgithub.com への DNS クエリが記録されています。応答時間は A レコードで 0.2ms〜8.3µs と非常に高速です。緑のアイコンは「通常(ブロックなし)」、赤のアイコンは「ブロック済み」を示します。

③DNS 設定で上流 DNS サーバーを変更する

「Settings → DNS」から上流 DNS サーバーを変更できます。デフォルトは Google(8.8.8.8)ですが、プライバシーを重視するなら Quad9 や Cloudflare(1.1.1.1)への変更を検討してください。

Pi-hole DNS設定画面(実撮影)
Pi-hole DNS設定画面(実撮影)

上図では Google(ECS, DNSSEC)が選択されています。DNSSEC(DNS の改ざん防止機能)が有効なプリセットを使うと、セキュリティが向上します。

端末の DNS を Pi-hole に向ける

Pi-hole を実際に機能させるには、端末の DNS サーバーアドレスを Pi-hole のサーバー IP に変更する必要があります。

方法①:ルーターで一括設定(全端末に効く・推奨)

ルーターの管理画面にある「DNS サーバー設定」を Pi-hole の IP アドレスに変更します。こうするとルーター配下のすべての端末に自動的に Pi-hole が適用されます。




ルーター設定イメージ
プライマリ DNS サーバー: 192.168.1.100 ← Pi-hole のIPアドレス
セカンダリ DNS サーバー: 8.8.8.8 ← Pi-hole が落ちたときの予備

方法②:特定のPCだけに設定(テスト用)

Ubuntu PC の場合は /etc/resolv.conf を編集、または NetworkManager の DNS 設定を変更します。




ubuntu@linuxlab: ~
$ resolvectl dns eth0 192.168.1.100
$ resolvectl status | grep -A3 eth0
Link 2 (eth0)
Current DNS Server: 192.168.1.100

注意

Pi-hole が停止すると DNS が解決できなくなり、インターネットに繋がらなくなります。セカンダリ DNS に 8.8.8.81.1.1.1 を設定しておくと、Pi-hole が落ちても繋がり続けます(ただしブロックは無効になります)。

ブロックリストを更新する

Pi-hole のブロックリスト(Gravity)は手動または定期的に更新できます。新しい広告ドメインへの対応を最新に保つために、定期更新をおすすめします。

pihole -g ブロックリスト更新ログ(実測)
pihole -g ブロックリスト更新ログ(実測)



ubuntu@linuxlab: ~
$ docker exec pihole pihole -g
[✓] DNS resolution is available
[i] Neutrino emissions detected…
[✓] Preparing new gravity database
[✓] Pulling blocklist source list into range
[i] Target: https://raw.githubusercontent.com/StevenBlack/hosts/master/hosts
[✓] Parsed 84973 exact domains and 0 ABP-style domains
[i] Number of gravity domains: 84973 (84973 unique domains)

実際に実行すると、StevenBlack/hosts から 84,973 ドメインを取得してデータベースを更新します。更新は数十秒で完了します。

自動更新を設定するには、コンテナ内の crontab を使います(Pi-hole v6 はデフォルトで自動更新スケジュールが設定されています)。

よくあるエラーと解決策

エラー①:ポート 53 が使用中




ubuntu@linuxlab: ~
Error response from daemon: driver failed programming external connectivity
Bind for 0.0.0.0:53 failed: port is already allocated

原因: Ubuntu の systemd-resolved がポート 53 を使っています。

解決策: systemd-resolved のポート 53 リッスンを無効にします。




ubuntu@linuxlab: ~
$ sudo nano /etc/systemd/resolved.conf
# [Resolve] セクションに以下を追加
DNSStubListener=no
$ sudo systemctl restart systemd-resolved
$ sudo ln -sf /run/systemd/resolve/resolv.conf /etc/resolv.conf

エラー②:Web 管理画面にアクセスできない

UFW(ファイアウォール)が有効な場合、ポート 80 を開放していないとアクセスできません。




ubuntu@linuxlab: ~
$ sudo ufw allow 53/tcp
$ sudo ufw allow 53/udp
$ sudo ufw allow 80/tcp
$ sudo ufw status
53/tcp ALLOW Anywhere
80/tcp ALLOW Anywhere

エラー③:Pi-hole v6 でパスワードが通らない

Pi-hole v6 では -e WEBPASSWORD=xxx の環境変数名が変更されました。v6 で確実にパスワードを設定するには以下の方法を使います。




ubuntu@linuxlab: ~
$ docker exec pihole pihole setpassword YourNewPassword
[✓] New password set

または、起動時のコンテナログからランダムパスワードを確認します。




ubuntu@linuxlab: ~
$ docker logs pihole | grep -i password
[i] No password set in environment or config file, assigning random password: ZQoraGkh

エラー④:ブロックしすぎて困ったサイトが開かない

誤ってブロックされているドメインは、管理画面の「Domains」メニューから個別に 許可リスト(Allowlist) に追加できます。




ubuntu@linuxlab: ~
$ docker exec pihole pihole allowlist example.com
[✓] example.com has been added to the allowlist
$ docker exec pihole pihole allowlist
example.com

まとめ

Ubuntu 24.04 LTS に Docker を使って Pi-hole を構築する手順を説明しました。

  • Pi-hole は docker run 一行で起動でき、Core v6.4.2 / FTL v6.6.2 で確認済み
  • 起動直後から StevenBlack/hosts の 84,973 ドメインをブロック対象として自動取得する
  • Web 管理画面でクエリログ・DNS 設定・ブロックリストをブラウザから管理できる
  • ルーターの DNS 設定を変更するだけで、家中の全端末に広告ブロックが効く
  • Pi-hole v6 ではコンテナログからパスワードを確認するか、pihole setpassword で設定する

Pi-hole は VPS に入れても動きますが、ネットワーク全体に効かせるには家庭内の常時起動サーバーやルーターに近い機器への設置が最も効果的です。まずは自宅の古い PC や Raspberry Pi で試してみてください。

本格的に Linux サーバーを運用するなら、VPS を借りて手元の環境と使い分けるのもおすすめです。VPS おすすめ比較記事も参考にしてみてください。

コメント

タイトルとURLをコピーしました