Raspberry Pi + DietPiで作る広告ブロックDNSサーバ　 Pi-holeで実現する広告ブロック術

# はじめに
本記事は軽量LinuxディストリビューションであるDietPi上にDNSサーバを構築し、広告ブロッカーであるPi-holeを用いて、ホームネットワークのを広告をブロックする方法について記載しています。

Pi-holeを導入することで、ホームネットワーク全体の広告をブロックし、ホームデバイス使用時のインターネットがより快適かつ安全になります。

各デバイスにソフトウェアをインストールする必要はないため、DNS設定を変更するだけでインターネット接続を保護できるのでコストをかけることなく導入できます。

:::note
DietPiについては、以前書いた「[最適化された最小限のDebian OS 　DietPiの始め方](https://qiita.com/Brutus/items/df4f930d38b40047a2fe)」をご参照ください。
:::

## Pi-holeとは
**Pi-hole**は、ネットワーク全体の広告やトラッキングをDNSレベルでブロックすることができるオープンソースの広告ブロッカーです。

Pi-holeをホームネットワークに導入し、クライアント側のDNSサーバを切り替えることで、Webサイトやスマートフォンに表示される広告を排除し、快適なウェブブラウジングを実現します。

また、疑わしいドメインに対するアクセスも遮断できるため、マルウェアやフィッシングといったサイバー攻撃のリスクを軽減するセキュリティ対策としても機能します。

![pi-hole.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221759/767780cd-97eb-43f3-888c-920f45832644.png)

Pi-holeの機能を以下に解説します。デフォルトではDNSフォワーダー[^1]として機能しますが、Unboundもインストールすることで、Pi-holeを再帰的[^2]なDNSサーバとして動作させることができます。

- **広告ブロック**
Pi-holeは広告やトラッキング用のドメインに対して、DNSレベルでアクセスを遮断します。その結果、ブラウザが広告用のスクリプトや画像を読み込む必要がなくなるため、Webページの表示が軽量化され、体感的な読み込み速度が向上します。また、トラッカーのブロックによりプライバシー保護の効果も得られます。

- **Unbound によるフルリゾルバとキャッシュ**
UnboundはルートDNSサーバから名前解決を行うフルリゾルバです。ローカルにDNSキャッシュを保持するため、同一ドメインへの再アクセス時には高速な応答が可能です。従って名前解決の全体的なパフォーマンスが向上し、外部のDNSサーバに依存しない安定した運用が実現できます。

なお、以下のようなケースでは、一時的に名前解決が遅くなります。

- Unbound の初回起動時（キャッシュが空のため）
- 未キャッシュのドメインへの初回アクセス（フルリゾルバのため、ルートから階層的に問い合わせを行う必要がある）
- qname-minimisationなどのプライバシー保護機能を有効にしている場合（追加の問い合わせ処理が発生するため）

[^1]:クライアントから受け取ったDNSクエリを、自身で再帰的に解決することなく、あらかじめ設定された別のDNSサーバーに転送するだけのDNSサーバ
[^2]:クライアントからのDNSクエリに対して、ルートDNSサーバからTLD、権威DNSサーバまで順に問い合わせを行い、最終的なIPアドレスを取得してクライアントに返すDNSサーバ

::: note
qname-minimisationは、DNSのプライバシーを高めるための機能です。DNSクエリに含まれる情報を必要最小限にとどめることで、不要な情報の漏洩を防ぐ仕組みです。

例えば、`www.example.com`の場合、従来のフルリゾルバではすべての中間DNSサーバに対して、FQDNを問い合わせます。しかし、ルートDNSサーバは`com`の権威サーバしか知らないため、`www.example.com`全体を知る必要はありません。従ってこのような完全修飾ドメイン名が含まれるクエリは、中間DNSサーバに過剰な情報を提供しています。

qname-minimisationを有効にすることで、リゾルバは段階的に名前解決を行います。はじめにルートDNSに対して`com`の問い合わせを行います。次に権威DNSサーバに対して`example.com`を問い合わせます。最後に`www.example.com`をexample.comのDNSサーバに問い合わせします。

よって、DNSサーバにはそれぞれ必要な情報しか渡さないことによりプライバシーを保護しますが、問い合わせ回数が増えるため、未キャッシュのドメインでは名前解決にやや時間がかかります。
:::

## Pi-holeのインストール
Pi-holeのインストール方法を以下に記載します。

DietPi Softwareより「Search Software」または「Browse Software」からインストールを行います。以下では「Browse Software」からインストールを行なっています。

はじめに「Browse Software」を選択します。

![スクリーンショット 2025-05-27 23.16.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221759/cd5e6b34-68ad-4d0f-bbbe-b0f98e7f4cfd.png)

Pi-holeとUnboundにチェックを入れます。

![スクリーンショット 2025-05-27 23.18.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221759/dbe0ae64-5bf0-45a9-829e-50f89fc0fd8c.png)

DNSサーバのインストールには静的IPアドレスの設定が必要ですが、既に設定済みの場合は「Skip」を選択します。

![スクリーンショット 2025-05-27 23.19.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221759/f985327b-e04d-423e-a29f-1ca54abfdea1.png)

「Install」を選択します。

![スクリーンショット 2025-05-27 23.20.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221759/4a002cff-9671-4638-b934-19b1efd8caf8.png)

選択したソフトウェアのインストールを行うため「OK」を選択します。

![スクリーンショット 2025-05-27 23.21.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221759/79d30a69-1414-49d8-966e-3b9ef9a979b0.png)

インストールプロセスを開始します。

![スクリーンショット 2025-05-27 23.24.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221759/7066af1d-dbf7-47eb-ad76-cd3cdc5a3e6a.png)

以下のような画面が表示されるので「OK」を押します。

![スクリーンショット 2025-05-27 23.25.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221759/5d421c19-d1b3-4453-8932-0c72d9a4cf9c.png)

再度「OK」を押します。

![スクリーンショット 2025-05-27 23.25.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221759/593b6bac-bf7b-480e-a99d-5ea78de00f15.png)

再度静的IPアドレスに関する設定を促されるため、既に設定済みの場合は「Continue」を選択します。

![スクリーンショット 2025-05-27 23.26.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221759/b97aa2d0-9ee7-43c2-88de-cfa51f544e40.png)

任意のインターフェースを選択します。

![スクリーンショット 2025-05-27 23.27.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221759/bf203215-7849-452e-b1b1-7edabae15f49.png)

何も選択せずに「OK」を選択します。

![スクリーンショット 2025-05-27 23.28.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221759/5f0641b1-850f-489e-bbf9-9efda80e6107.png)

ブロックリストを利用するにあたり「Yes」を選択します。

![スクリーンショット 2025-05-27 23.28.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221759/44d3b056-a829-404e-8646-aba6e54a94d0.png)

デフォルトのまま「Continue」を選択します。

![スクリーンショット 2025-05-27 23.29.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221759/338066f4-4646-4b1c-bbe5-a73b16cef799.png)

パスワードを確認して「OK」を押します。

![スクリーンショット 2025-05-27 23.30.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221759/cd77804c-abd0-4c85-b2ea-7ddf56ae2658.png)

Web UIのアクセス方法を確認して「OK」を押します。

![スクリーンショット 2025-05-27 23.32.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221759/f1dd2e2b-a5c6-49c7-b552-42d38588a486.png)

::: note
Pi-holeのWeb UIは以下のURLよりアクセスできます。また、デフォルトの認証情報は`dietpi`です。

- HTTP:`http://<IP>:8089/admin/`
- HTTPS:`https://<IP>:8489/admin/`

`/var/log/pihole/pihole.log`へのDNSクエリのログ記録が無効になりました。これはWeb UIとデータベースのクエリログには影響しませんが、`pihole -t/pihole tail`コマンドを実行してもDNSクエリが表示されなくなります。このコマンドを使用したい場合、または他の理由で`/var/log/pihole/pihole.log`にクエリログが必要な場合は、Web UIのプライバシー設定または`sudo pihole-FTL --config dns.queryLogging true`で再度有効にすることができます。

データベースへのDNSクエリのログ記録が2日間に短縮されました。これはWeb UIのプライバシー設定または`sudo pihole-FTL --config database.maxDBdays 7`を実行すことで、7日間に変更できます。
:::

インストール完了後、他のPCなどからブラウザを起動してWeb UIにアクセスします。

![スクリーンショット 2025-05-27 23.33.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221759/b8bd9594-bf6c-4114-91c1-e092ac19cbcc.png)

ログインすると、以下のようなダッシュボードの画面が表示されます。

![スクリーンショット 2025-05-27 23.33.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221759/2cd1b723-b38b-4fc6-bb93-23fea5cee0fd.png)

DNSクエリが発生すると、クエリ結果がダッシュボードに反映されます。

![スクリーンショット 2025-05-27 23.36.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221759/b8fbfea9-24a2-42de-be36-f4d5d6a2fe13.png)

## 実践
広告ブロックを試してみましょう。

事前にクライアント側でDNSサーバのIPアドレスをPi-holeのIPアドレスに設定変更します。

### 広告ブロック
以下では、Qiitaのトップページを例に広告ブロックを試しています。

Pi-holeに切り替前は、画面右上に広告が表示されているのが分かります。

![スクリーンショット 2025-05-27 23.44.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221759/d6ab525f-08a9-47d8-b8be-fadc4d55443d.png)

DNSサーバ切り替え後、再度アクセスすると、画面右上の煩わしい広告が表示されなくなりました。

![スクリーンショット 2025-05-27 23.48.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221759/00ffbce3-afbf-4983-80cc-d290e96670a0.png)

### Deny Listの登録
Deny Listに登録することで、アクセスさせたくないURLを制限できます。

特定のドメインに対するアクセスを禁止したい場合は「Query Log」より対象のクエリログを選択して「Deny」ボタンを押すと、Deny Listに登録できます。

![スクリーンショット 2025-05-30 20.26.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221759/64d534af-f6dc-467b-89e8-6324816452d8.png)

登録したDeny Listから解除したい場合は「Domain」より対象のドメインを選択してゴミ箱のアイコンを押します。

![スクリーンショット 2025-05-30 20.34.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221759/7b79effe-5082-4887-9077-f0a5599262ae.png)

### Domain management
Domain managementでは、特定のドメインを許可または拒否する設定が可能です。

一部のWebサイトでは、広告に関するドメインがページの表示に必要な場合があります。このような場合、広告がブロックされると、ページの読み込みを停止することがあります。

特定のドメインを除外したい場合は、ホワイトリストに追加することで回避できます。例えば、Google アナリティクスを許可したい場合は、以下のように「Type」に`Exact allow`を指定して対象のドメインをリストに登録します。

![スクリーンショット 2025-06-13 9.52.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221759/9bec5827-edbc-404b-849b-7345232499d9.png)

# おわりに
Pi-holeを導入して1週間が経過しました。

日にもよりますが、多かった日で合計のDNSクエリ数は約11万件、ブロック率は15.6%を記録しました。日常的に大量のDNSリクエストが発生し、その中に相当数の広告及びトラッキングに関するドメインが含まれていたことが明らかになりました。

改めてPi-holeによる広告ブロックが効果的に機能していることを確認しました。

Pi-holeに感謝します。

## 参考
- [DietPi and the new Pi-hole version 6](https://dietpi.com/blog/?p=3866)
- [About Pi-hole](https://docs.pi-hole.net/)