web広告をブロックするPi-holeをDockerで導入する方法

この記事では、web広告をブロック可能なPi-holeをDockerで実行する方法を紹介します。

想定する環境は下記です。

  • 自宅のLAN内にあるサーバー上にPi-holeを配置(リモートサーバー上にも構築可能)
  • Pi-holeはDockerコンテナ上で動かす
  • ホストサーバーのOSはUbuntu 22.04.2 LTS
  • Pi-holeはDNS機能のみ利用し、DHCPの機能は利用しない

Pi-holeとは

Pi-holeは、クライアント側にアプリケーションを導入することなくweb広告をブロックすることが可能なDNSシンクホールです。

DNSサーバーでの名前解決時に、既知の広告用サーバーに対する名前解決をブロックすることで、広告を減らすことができます。

もちろん、完全にweb広告をなくすことはできませんが、ある程度の広告を非表示にすることが可能となります。

公式サイト:https://pi-hole.net/

Pi-hole導入手順

Pi-holeの導入は下記の手順で行います

  1. (Ubuntuのみ)53番ポートの開放
  2. Pi-hole用のdocker-compose.yamlの作成とDockerコンテナの起動
  3. 端末のDNSの設定変更

53番ポートの解放(Ubuntuのみ)

Pi-holeでは53番ポートを利用しますが、Ubuntuではデフォルトの状態で53番ポートがsystemd-resolvedと呼ばれるsystemdサービスに利用されています。

systemd-resolvedはDNS機能を提供するサービスですが、Pi-holeでsystemd-resolvedと同様なDNS機能を提供可能なので、もともと起動しているsystemd-resolvedを停止し、53番ポートの解放を行います。

まず、現時点での状況をlsofコマンドで確認しましょう。systemd-resolvedが起動していることが確認できます。

$ sudo lsof -i :53
COMMAND   PID            USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
systemd-r 264 systemd-resolve   12u  IPv4  19135      0t0  UDP 127.0.0.53:domain
systemd-r 264 systemd-resolve   13u  IPv4  19136      0t0  TCP 127.0.0.53:domain (LISTEN)

systemd-resolvedを停止するために、まず/etc/systemd/resolved.confを編集します。

sudo vim /etc/systemd/resolved.conf

vimnanoで開いたら下記のように、DNSDNSStubListenerの行を修正します。下記の例では、DNSはCloudflareのDNS(1.1.1.1)を利用しています。

DNS=1.1.1.1
#FallbackDNS=
#Domains=
#DNSSEC=no
#DNSOverTLS=no
#MulticastDNS=no
#LLMNR=no
#Cache=no-negative
#CacheFromLocalhost=no
DNSStubListener=no
#DNSStubListenerExtra=
#ReadEtcHosts=yes
#ResolveUnicastSingleLabel=no

次に、名前解決の設定ファイル(/etc/resolv.conf)を修正します。

# 念のため現在のファイルのバックアップを作成
sudo mv /etc/resolv.conf /etc/resolv.conf.bk

# シンボリックリンクを作成
sudo ln -sf /run/systemd/resolve/resolv.conf /etc/resolv.conf

上記が終われば、サーバーを再起動しましょう。

再起動後に再びlsofコマンドで確認すると、53番ポートが解放されているはずです。

上記の設定を元に戻したい場合

上記の設定を戻したい場合は、/etc/systemd/resolved.confのファイルを再び編集し、DNSDNSStubListenerの行をコメントアウトします。

次に、作成した/etc/resolv.confのシンボリックリンクを下記のコマンドで削除し、再起動すればもとに戻ります。

sudo rm /etc/resolv.conf

Pi-hole用のdocker-compose.yamlを作成

公式のGItHubを参考に作成します。下記がそのまま利用可能です。

version: "3"

services:
  pihole:
    container_name: pihole
    image: pihole/pihole:2023.05.2
    ports:
      - "53:53/tcp"
      - "53:53/udp"
      - "8180:80/tcp"
    environment:
      TZ: 'Asia/Tokyo'
      PIHOLE_DNS_: '192.168.1.1;1.1.1.1;1.0.0.1'
      WEBPASSWORD: 'hogehoge'
    volumes:
      - '/docker/etc-pihole:/etc/pihole'
      - '/docker/etc-dnsmasq.d:/etc/dnsmasq.d'
    restart: unless-stopped

公式サンプルからの変更点は下記です。

  • DNSの機能しか利用しないので、DHCPに関わる部分は削除
  • Pi-holeのwebインタフェイスに入るポートを8180番に変
  • TimeZoneAsia/Tokyoに変更
  • PIHOLE_DNS_に、自宅のゲートウェイを指定

ファイルを作成したら、dockerコンテナを起動します。

docker compose up -d

※もしもdockerコマンドに不慣れな場合、下記を参考にしてください。

無事に起動出来たら、ウェブブラウザからコンソールにログインします。

http://<IP address>:8180/admin

IPアドレスはサーバーのIPアドレスを指定してください。docker-compose.yamlファイルに記載したパスワードを打ち込むとログインできます。

もしもPi-holeを起動しているサーバー外からコンソールにアクセスしたい場合は、ルーターでポートフォワーディングの設定を行ってください。

端末が利用するDNSの向きをPi-holeに向ける

ここは、Pi-holeの運用方法によって、設定方法が異なります。

すべての端末でPi-holeを利用したい場合は、ルーターからDNSの設定を変更しましょう。もしもルーターでDNSの向き先を変更できない場合や一部の端末でのみPi-holeを利用する場合は、各端末毎に設定する必要があります。

すべての端末でPi-holeを利用したい場合

多くの場合、ルーターでDHCPとDNSの機能を提供していて、ルーターの設定画面からDNSサーバーの設定を変更できるかと思います。

ルーターの設定画面に移動して、DNSの向き先をPi-holeを動かしているサーバーのIPアドレスにしてください。

そうすることで、そのルーターに接続しているすべての端末でPi-holeが利用可能です。

端末ごとに設定する必要もないので、簡単かと思います。

一部の端末だけPi-holeを使いたい場合

一部の端末だけPi-holeを使いたい場合や、ルーターで一括設定できない場合、それぞれの端末で変更しましょう。

WIndows/Mac/Android/iPhoneすべてで、ネットワーク設定から変更可能ですので、Googleで調べながら実施してみてください。

まとめ

Pi-holeをDockerコンテナで動かす方法を紹介しました。

web広告は邪魔なだけではなく、子供に見せるのには不適切な内容なども含まれていることがあります。

完全に遮断することはできないですが、少しでも快適なブラウジング生活が送りたいと思います。

  • この記事を書いた人

たかさん

犬と暮らすクラウドエンジニア。GCPが好きだけど良く触るのはAWSとAzureです。

-メモ
-,