この記事では、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の導入は下記の手順で行います
- (Ubuntuのみ)53番ポートの開放
- Pi-hole用のdocker-compose.yamlの作成とDockerコンテナの起動
- 端末の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
vim
やnano
で開いたら下記のように、DNS
とDNSStubListener
の行を修正します。下記の例では、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
のファイルを再び編集し、DNS
とDNSStubListener
の行をコメントアウトします。
次に、作成した/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
番に変 TimeZone
をAsia/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広告は邪魔なだけではなく、子供に見せるのには不適切な内容なども含まれていることがあります。
完全に遮断することはできないですが、少しでも快適なブラウジング生活が送りたいと思います。