Pi-hole

## Pi-hole とは

![cropped-mug-2018-05-patreon.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/31613/8dbb83fc-00e9-9582-295c-5c44c51ca4a1.png)

Pi-hole とは、Raspberry Pi で動作させることを前提とした広告除去ソリューションです。Raspberry Pi を前提としながらも、ほぼすべての Linux で動作させることができます。

仕組みとして Pi-hole は DNS サーバとして動作し、広告だと判断した名前解決で空白のページや小さい画像を返します。いわゆる Ad-blocker とは異なるテクノロジーで広告を除去します。

今回はこの Pi-hole を自宅に導入した際の手順とその成果を紹介します。

## Raspberry Pi Imager で SD カードに OS イメージを作成

Raspberry Pi は Raspbian だけでなく、様々な OS で動作させることができます。今回は慣れている Ubuntu Server 22.04 LTS 64bit を使用することにします。

![スクリーンショット 2023-03-22 10.57.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/31613/3861afc9-1037-018a-a85d-390aa7df95ec.png)

歯車アイコンで初期設定をしておくと、セットアップが非常に楽になるので自身の環境に合わせて必ずするようにしましょう。

![スクリーンショット 2023-03-22 14.24.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/31613/568bb2b2-8cef-974b-192d-9aad3c282c04.png)

## Ubuntu ログイン後のセットアップ

まずはパッケージを最新にします。カーネルを更新されることがあるため、最後に再起動しておくと安心です。

```shell-session
$ sudo apt update -y
...
$ sudo apt upgrade -y
...
$ sudo reboot
...
```

## 固定 IP 設定

Raspberry Pi に固定 IP を割り当てます。割り当て方はご自身の所有するルータを確認ください。おそらく MAC アドレスと IP アドレスをルータへ登録することになると思います。Ubuntu 上で以下コマンドにて確認できます（今回は 192.168.10.200 で進めます）。

```shell-session
$ ip a
...
$
```

または割当をしていない場合、Pi-hole 側で割当を行います。ルータの DHCP 範囲と重複するかも知れないので事前に割り当てておくと安全な気がします。私は念の為ルータに割り当てました。

## Pi-hole の導入

Pi-hole は Docker による導入と、Linux に直接インストールする導入の ２ 通りがあります。導入するコンピュータのリソースが豊富であれば Docker による導入が便利ですが、そうでない場合は直接インストールせざるを得ないです。例えば 8GB メモリ搭載の Raspberry Pi 4 なら Docker で、1GB しかメモリがない Raspberry Pi 3 なら直接インストール、となるでしょう。そして今回は自宅で余っている Raspberry Pi 3 の有効活用ということで直接インストールします。

以下サイトにインストール方法がまとまっていますが、これを一部変更しています（sudo を付けただけです）。

- <https://docs.pi-hole.net/main/basic-install/>

```shell-session
$ curl -sSL https://install.pi-hole.net | sudo bash
...
              ┌──────────────────────Installation Complete!────────────────────────┐
              │ Configure your devices to use the Pi-hole as their DNS server      │
              │ using:                                                             │
              │                                                                    │
              │ IPv4: 192.168.10.200                                               │
              │ IPv6: 2408:211:6e7:6900:ba27:ebff:fe12:7263                        │
              │ If you have not done so already, the above IP should be set to     │
              │ static.                                                            │
              │ View the web interface at http://pi.hole/admin or                  │
              │ http://192.168.10.200/admin                                        │
              │                                                                    │
              │ Your Admin Webpage login password is xxxxxxxx                      │
              │                                                                    │
              │                                                                    │
              │                                                                    │
              │                                                                    │
              │                                                                    │
              ├────────────────────────────────────────────────────────────────────┤
              │                             <  OK  >                               │
              └────────────────────────────────────────────────────────────────────┘
$
```

色々聞かれますが、すべて Yes や Continue で良いです。

最後に IP アドレス、管理コンソールの URL とパスワードが表示されるのでメモっておきます。

## DNS 設定

DNS 設定は、ルータに設定する方法とネットワークインターフェイスに設定する方法が考えられます。

### ルータへの設定

使用しているルータのプライマリ DNS に 192.168.10.200 を設定します。セカンダリは Google（8.8.8.8）、Cloudflare（1.1.1.1）、Quad9（9.9.9.9） を覚えていますが、今回は Google にしました。

![Aterm](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/31613/44697813-e980-dc89-35cf-fd0b32f74e7a.png)

:::note
Pi-hole 側でアップストリーム DNS が 8.8.8.8、8.8.4.4 で初期設定されているため、ルータへの設定は必須ではありませんでした。
:::

### ネットワークインターフェイス

macOS なら以下を実行し、ネットワークインターフェイスを一覧します。

```shell-session
$ netwnetworksetup -listallhardwareports | grep 'Hardware Port'
Hardware Port: Ethernet Adapter (en4)
Hardware Port: Ethernet Adapter (en5)
Hardware Port: USB 10/100/1000 LAN
Hardware Port: Ethernet Adapter (en7)
Hardware Port: Thunderbolt Bridge
Hardware Port: Wi-Fi
Hardware Port: Thunderbolt 1
Hardware Port: Thunderbolt 2
Hardware Port: Thunderbolt 3
$
```

この中から Pi-hole を使用するインターフェイスを選び（今回は `USB 10/100/1000 LAN` を使用）、以下コマンドを実行します。

```shell-session
$ networksetup -getdnsservers 'USB 10/100/1000 LAN'
xx.xx.xx.xx
$

ここに表示された IP アドレスは、このインターフェイスの元々の DNS です。これを以下コマンドに使用します。

```shell-session
$ networksetup -setdnsservers 'USB 10/100/1000 LAN' yy.yy.yy.yy xx.xx.xx.xx
$
```

yy.yy.yy.yy は Pi-hole の IP アドレス、xx.xx.xx.xx は元々の DNS です。

## 常駐設定

このままだと Raspberry Pi を再起動した際に Pi-hole が自動起動しません。以下を実施しておきます。

```shell-session
$ sudo systemctl enable pihole-FTL.service
$
```

## 成果

しばらく利用して管理コンソールを開くと、しっかりとブロックされていることがわかります。

![Screenshot_20230327-015621.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/31613/68d6e2d9-d4dc-bdd8-a7e2-667150c4c5fc.png)

管理コンソールを開いてわかったことは、28% が広告のトラフィックであるという事実でした。かなりの効果が見て取れます。導入してしばらく運用していますが、かなり快適です。

## 広告ブロック一時解除

基本的に広告はブロックしたいのですが、一時的にブロックを解除したいこともあるでしょう。そういう場合は管理コンソールから Disable Blocking を開き、ブロック解除時間を選択すれば、その期間だけブロック解除されます。

![Screenshot_20241108-024336.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/31613/a2073be5-c5c2-c006-485c-5a06b69cc229.png)