🐙

Install Pi-hole

2023/10/16に公開

Install Pi-hole

Ubuntu 22.04 をインストールした Raspberry Pi 4 に Docker 版の Pi-hole をインストールします。

Pi-hole の詳細は本家の説明を読んで頂くとして、私が利用を初めたのは家の古い端末でウェブサイトを表示した際のページの表示速度を何とか早くできないか?と考えたのがきっかけです。
広告の画像や動画が表示されない分、表示が早くなってインターネットが快適になるはず。
実際、スマホではいくつかのアプリ内の広告も非表示になるので余計な情報が目に入らないだけでも快適。
家庭のネットワークに導入すると家族全員が恩恵を受けられるなら、休日に作業してても家族に言い訳できる?というのも理由かもしれません。

Environment

  • Raspberry Pi 4
  • OS: Ubuntu Server 22.04

Installation

Docker をインストールした後に Docker 版の Pi-hole をインストールします。

Install Docker

https://docs.docker.com/engine/install/ubuntu/

手順に従って、Docker が提供している Apt repository から Dokcer をインストールします。

過去に Ubuntu 標準の Docker をインストールしている場合は競合するのでアンインストールが必要です。
今回は初期セットアップなので不要でした。

for pkg in docker.io docker-doc docker-compose podman-docker containerd runc; do sudo apt-get remove $pkg; done

Apt repositroy の GPG キーをインストール

sudo apt-get update
sudo apt-get install ca-certificates curl gnupg
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
sudo chmod a+r /etc/apt/keyrings/docker.gpg

Apt repository を追加

echo \
  "deb [arch="$(dpkg --print-architecture)" signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
  "$(. /etc/os-release && echo "$VERSION_CODENAME")" stable" | \
  sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update

Docker をインストール

sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

バージョンを確認

$ docker --version

Output:

Docker version 24.0.6, build ed223bc

Free-up port 53

Ubuntu 22.04 では Port 53 が systemd-resolved によって利用されているので Pi-hole を起動する前にポートを開放します。

systemd-resolved の設定を変更

echo '
# Cloudflare DNS
DNS=1.1.1.1
DNSStubListener=no' | \
  sudo tee -a /etc/systemd/resolved.conf > /dev/null

systemd-resolved を再起動

sudo systemctl restart systemd-resolved

Port 53 が利用されていた場合、次のようなエラーが出て Pi-hole の起動に失敗します。

Error response from daemon: driver failed programming external connectivity on endpoint pihole (xxxxx): Error starting userland proxy: listen tcp4 0.0.0.0:53: bind: address already in use

Install Pi-hole Docker

Cloudflare DNS を参照。

IPv4:

  • 1.1.1.1
  • 1.0.0.1

IPv6:

  • 2606:4700:4700::1111
  • 2606:4700:4700::1001

https://github.com/pi-hole/docker-pi-hole/
https://docs.pi-hole.net/

sudo mkdir /opt/pi-hole
sudo chown $USER:$USER /opt/pi-hole
cd /opt/pi-hole

Docker compose file
file path: /opt/pi-hole/compose.yaml

version: "3"

services:
  pihole:
    container_name: pihole
    image: pihole/pihole:latest
    # network_mode: "host"  # For DHCP server
    ports:
      - "53:53/tcp"
      - "53:53/udp"
      - "80:80/tcp"
    environment:
      # https://github.com/pi-hole/docker-pi-hole#environment-variables
      TZ: 'Asia/Tokyo'
      PIHOLE_DNS_: 1.1.1.1;1.0.0.1;2606:4700:4700::1111;2606:4700:4700::1001  # Cloudflare
      DNSMASQ_LISTENING: single
      DNSSEC: true
      DHCP_ACTIVE: false
    volumes:
      - './etc-pihole:/etc/pihole'
      - './etc-dnsmasq.d:/etc/dnsmasq.d'
    # cap_add:
    #   - NET_ADMIN # Required only if you are using Pi-hole as your DHCP server
    restart: unless-stopped

Run Pi-hole

cd /opt/pi-hole
sudo docker compose up -d

Restart Pi-hole

設定ファイル compose.yaml の変更を反映させる為には container の down と up が必要になります。
stop と start または restart では設定は反映されません。

cd /opt/pi-hole
sudo docker compose down
sudo docker compose up -d

Password reset

今回の設定では Pi-hole の管理画面にログインする際のパスワードはランダムなものが設定されてるので、改めてパスワードを設定します。

sudo docker exec -it pihole pihole -a -p

Update docker image

Pi-hole の Docker image を更新する際は次のように down → pull → up の順でコマンドを実行します。

sudo docker compose down
sudo docker compose pull
sudo docker compose up -d

Static IP for eth0

DNS サーバーの IP address が変わらないように固定 IP を設定します。
現在のネットワークの Gateway (Default route) と空いてる IP address を調査して Static IP を設定します。
Docker や Pi-hole のインストール前にやった方が良かったかも。

例)

デフォルトゲートウェイ (router):

  • IPv4: 192.0.2.1
  • IPv6: 2001:db8::1

Raspberry Pi の eth0 に設定する IP アドレス:

  • 192.0.2.10
  • 2001:db8::10

DNS server (nameserver) は Cloudflare を参照:

  • 1.1.1.1
  • 1.0.0.1
  • 2606:4700:4700::1111
  • 2606:4700:4700::1001

File path: /etc/netplan/99_config.yaml

network:
  version: 2
  ethernets:
    renderer: networkd
    eth0:
      dhcp4: false
      dhcp6: false
      addresses:
        - 192.0.2.10/24
        - 2001:db8::10/32
      nameservers:
        addresses:
          - 1.1.1.1
          - 1.0.0.1
          - 2606:4700:4700::1111
          - 2606:4700:4700::1001
      routes:
        - to: default
          via: 192.0.2.1
          metric: 100
          on-link: true
        - to: default
          via: 2001:db8::1
  # wifis:  # disable wifi after confirming the eth0 works
  #   renderer: networkd
  #   wlan0:
  #     dhcp4: false
  #     dhcp6: false
  #     optional: true

Wi-Fi (wlan0) は eth0 の Static IP の動作が確認できた後に無効化します。

設定を反映

sudo netplan apply

Update DHCP configuration

最後に、ネットワークに接続しているデバイスが Pi-hole を利用するように DHCP の設定を変更します。

Discussion