Pi-holeを利用した名前解決(DNS)におけるホワイトリストとブラックリストによるアクセス制限・広告ブロック環境を構築する

沢山所有するデバイスの広告ブロックを簡単に

#はじめに
ネットワークを利用するとき本来利用者が必要としている情報の他に有害なデータ（マルウェア、ウイルス、ワーム、トロイの木馬またはその他の有害なコンピュータコード）やインターネット広告や保護者にとって子供に不要なコンテンツを閲覧できます。

例えばテキストベースのコンテンツを参照すると動画広告が表示され、不要なトラヒックを多く消費したり、インターネットトラッキングが行われたりします。

通常このようなことに対処するためにはiOSやWindowsやAndroid用のアプリケーションを購入などして個々に導入設定したり、インターネットプロバイダーや携帯のキャリアーが提供するサービスを購入しています。

他に安易な方法としてはそれぞれの機器内の/etc/hostsファイルを編集して名前解決をさせない方法がありました。例えば次のようにすることで名前解決ができず当該コンテンツをブロックすることができます。

```:/etc/hosts
0.0.0.0 ad.msn.com
0.0.0.0 ad.com
```

沢山所有するデバイスや、組み込み機器等の特定のアプリケーションを導入するのは困難であったり、家の中の環境と家の外の環境で同じブロックポリシーを使うために安価で簡易な環境を[pi-hol](https://pi-hole.net/)でDNSでブロックする環境を構築した時のメモを残します。


#pi-holeについて
まずpiholeについて確認しました。

## 特徴 (https://docs.pi-hole.net/ 冒頭より)
DNSシンクホール(DNS sinkhole)としてクライアンデバイスにソフトウエアをインストールせずに不要なコンテンツからデバイスを保護してくれるそうです。

冒頭で次のことをうたっています。

- Easy-to-install
- Resolute
- Responsive
- Lightweight
- Robust
- Insightful
- Versatile
- Scalable
- Modern
- Free

##動作環境 (https://docs.pi-hole.net/main/prerequisites/ より)
###ハードウェア資源

- DISK  2GB の空き容量, 4GB 推奨
- メモリ 512MB RAM

piという名前から想像されますがRaspberry Pi以外のOSでも動作します。

###サポートOS

| Distribution   | Release           | Architecture       |
|:---------------|:-----------------:|:------------------:|
| Raspberry Pi OS| Stretch / Buster / Bullseye | ARM                |
| Ubuntu         | 16.x / 18.x / 20.x /21.x| ARM / x86_64       |
| Debian         | 9 / 10 /11           | ARM / x86_64 / i386|
| Fedora         | 33 / 34           | ARM / x86_64       |
| CentOS	 | 7 / 8             | x86_64             |

###ソフトウェア資源

サポートOSのsystemd か sysvinitで動作します。

###IP Address
Pi-poleは静的IPアドレスを必要としています。DHCPサーバで予約されたものでも構いません。

### 競合や注意点
次のネットワークマネージメントのソフトウエアと競合する可能性があります。

- dhclient
- dhcpcd
- dhcpcd5
- networkmanager
- systemd-networkd
- dnsmasq

インストール途中で /etc/dhcpcd.conf /etc/dnsmasq.conf が編集されます。

###サービスごとのデフォルト利用ポート

|サービス名 |サービス| Port    |Protocol|メモ|
|:--------:|-------|--------:|:-------|-----------|
|pihole-FTL|DNS    |53       |TCP/UDP |他のDNSサービスは競合するときは停止させます
|pihole-FTL|DHCP   |67       |IPv4 UDP|オプションで選択した場合
|pihole-FTL|DHCPv6 |547      |IPv6 UDP|オプションで選択した場合
|lighttpd  |HTTP   |80       |TCP|他のWebserverが動作する場合piholeのWebサーバは動作しません。競合を解消してください。
|pihole-FTL|       |4711|TCP|**4711はlocalhostからAPI用で利用されます。他からのアクセスは禁止する設定をしてください。**

他のDNSサービス(例えばbind等)が起動している場合は競合を解消する必要があります。

IPTablesやFirewallD,ufwなどのファイアウォールの設定を適宜変える必要があります。

# 自環境への構築方針
自宅内に構築することも選択肢として考えましたが外歩きの時のスマホでの広告ブロックや自分の出歩く場所それぞれで同じ条件で使えるようにたまたま契約済のVPS(Ubuntu)上のクラウド環境に作ることにしました。

## 導入前の環境確認
ハードウェア資源,サポートOS,ソフトウェア資源,IP Addressは問題ありませんでした。
競合や注意点について、導入対象の環境ではOS標準に対してdnsmasqでDNSキャッシュだけを構築していましたので、pi-holeを導入しても問題ないと決定して作業しました。

### ポート使用状況の確認
LISTENして待ち受けているポートがあるか確認します。

```
netstat -na | grep 53
```
でもよいのですがどのプロセスが待ち受けているか不明なので

```
ss -anp sport = :53
lsof -Pan -i:53
```
で確認しておきます。

### インストールスクリプトの確認
https://install.pi-hole.net
を眺めます。特段変なことはしていないようです。変更されてしまうファイルを目視しておきます。

### 関係個所の確認
#### /etc/resolv.conf ファイル
man systemd-resolved 8

# 導入
[Installation - Pi-hole documentation](https://docs.pi-hole.net/main/basic-install/)を見てインストール、動作確認します。

Pi-holeの管理Web画面へは特定の場所からしかアクセスできないようにF/Wを設定しておきます。

## 自宅のルーター設定
ルータのDNSをVPSに向けます。

## スマホの設定
自宅以外はVPSにVPNで接続するように設定します。これにより野良猫WiFiなどにつないでも安全を担保できます。

VPSにはVPNとして軽いshadowsocksRをインストールしておきます。

# 保守
Pi-holeの管理Web画面でコツコツと自分用の設定をするだけだと大変なので

[Best 20 Pihole Blocklists Open Source Projects](https://www.opensourceagenda.com/tags/pihole-blocklists)のツールを適宜インストールします。

普段のネットワーク利用だと同じような名前解決をするので、名前解決で怪しいものを見つけたらレポートのメールを飛ばすようにしておきます。確認して問題ないと判断したらホワイトリストに追加しておきます。



###参考にした場所
https://pi-hole.net/
https://docs.pi-hole.net/
https://wiki.archlinux.jp/index.php/Pi-hole
https://qiita.com/shora_kujira16/items/31d09b373809a5a44ae5
https://qiita.com/_dakc_/items/cecdd1f37e77308e8208
https://en.wikipedia.org/wiki/Pi-hole