はじめに
本記事は軽量LinuxディストリビューションであるDietPi上にDNSサーバを構築し、広告ブロッカーであるPi-holeを用いて、ホームネットワークのを広告をブロックする方法について記載しています。
Pi-holeを導入することで、ホームネットワーク全体の広告をブロックし、ホームデバイス使用時のインターネットがより快適かつ安全になります。
各デバイスにソフトウェアをインストールする必要はないため、DNS設定を変更するだけでインターネット接続を保護できるのでコストをかけることなく導入できます。
DietPiについては、以前書いた「最適化された最小限のDebian OS DietPiの始め方」をご参照ください。
Pi-holeとは
Pi-holeは、ネットワーク全体の広告やトラッキングをDNSレベルでブロックすることができるオープンソースの広告ブロッカーです。
Pi-holeをホームネットワークに導入し、クライアント側のDNSサーバを切り替えることで、Webサイトやスマートフォンに表示される広告を排除し、快適なウェブブラウジングを実現します。
また、疑わしいドメインに対するアクセスも遮断できるため、マルウェアやフィッシングといったサイバー攻撃のリスクを軽減するセキュリティ対策としても機能します。
Pi-holeの機能を以下に解説します。デフォルトではDNSフォワーダー1として機能しますが、Unboundもインストールすることで、Pi-holeを再帰的2なDNSサーバとして動作させることができます。
-
広告ブロック
Pi-holeは広告やトラッキング用のドメインに対して、DNSレベルでアクセスを遮断します。その結果、ブラウザが広告用のスクリプトや画像を読み込む必要がなくなるため、Webページの表示が軽量化され、体感的な読み込み速度が向上します。また、トラッカーのブロックによりプライバシー保護の効果も得られます。 -
Unbound によるフルリゾルバとキャッシュ
UnboundはルートDNSサーバから名前解決を行うフルリゾルバです。ローカルにDNSキャッシュを保持するため、同一ドメインへの再アクセス時には高速な応答が可能です。従って名前解決の全体的なパフォーマンスが向上し、外部のDNSサーバに依存しない安定した運用が実現できます。
なお、以下のようなケースでは、一時的に名前解決が遅くなります。
- Unbound の初回起動時(キャッシュが空のため)
- 未キャッシュのドメインへの初回アクセス(フルリゾルバのため、ルートから階層的に問い合わせを行う必要がある)
- qname-minimisationなどのプライバシー保護機能を有効にしている場合(追加の問い合わせ処理が発生するため)
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」を選択します。
Pi-holeとUnboundにチェックを入れます。
DNSサーバのインストールには静的IPアドレスの設定が必要ですが、既に設定済みの場合は「Skip」を選択します。
「Install」を選択します。
選択したソフトウェアのインストールを行うため「OK」を選択します。
インストールプロセスを開始します。
以下のような画面が表示されるので「OK」を押します。
再度「OK」を押します。
再度静的IPアドレスに関する設定を促されるため、既に設定済みの場合は「Continue」を選択します。
任意のインターフェースを選択します。
何も選択せずに「OK」を選択します。
ブロックリストを利用するにあたり「Yes」を選択します。
デフォルトのまま「Continue」を選択します。
パスワードを確認して「OK」を押します。
Web UIのアクセス方法を確認して「OK」を押します。
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にアクセスします。
ログインすると、以下のようなダッシュボードの画面が表示されます。
DNSクエリが発生すると、クエリ結果がダッシュボードに反映されます。
実践
広告ブロックを試してみましょう。
事前にクライアント側でDNSサーバのIPアドレスをPi-holeのIPアドレスに設定変更します。
広告ブロック
以下では、Qiitaのトップページを例に広告ブロックを試しています。
Pi-holeに切り替前は、画面右上に広告が表示されているのが分かります。
DNSサーバ切り替え後、再度アクセスすると、画面右上の煩わしい広告が表示されなくなりました。
Deny Listの登録
Deny Listに登録することで、アクセスさせたくないURLを制限できます。
特定のドメインに対するアクセスを禁止したい場合は「Query Log」より対象のクエリログを選択して「Deny」ボタンを押すと、Deny Listに登録できます。
登録したDeny Listから解除したい場合は「Domain」より対象のドメインを選択してゴミ箱のアイコンを押します。
Domain management
Domain managementでは、特定のドメインを許可または拒否する設定が可能です。
一部のWebサイトでは、広告に関するドメインがページの表示に必要な場合があります。このような場合、広告がブロックされると、ページの読み込みを停止することがあります。
特定のドメインを除外したい場合は、ホワイトリストに追加することで回避できます。例えば、Google アナリティクスを許可したい場合は、以下のように「Type」にExact allow
を指定して対象のドメインをリストに登録します。
おわりに
Pi-holeを導入して1週間が経過しました。
日にもよりますが、多かった日で合計のDNSクエリ数は約11万件、ブロック率は15.6%を記録しました。日常的に大量のDNSリクエストが発生し、その中に相当数の広告及びトラッキングに関するドメインが含まれていたことが明らかになりました。
改めてPi-holeによる広告ブロックが効果的に機能していることを確認しました。
Pi-holeに感謝します。