広告 消すべし 慈悲は無い - 広告ブロックDNSサーバ「Pi-hole」を使う

逸般の誤家庭によくある「買い過ぎて余った Raspberry Pi」「押入れにしまい込んだままのPC」「リソースが余っている仮想化環境」の有効活用法として、広告ブロックDNSサーバ「Pi-hole」を紹介。

広告ブロックの定番 AdBlock やプロキシ系の Proxydomo・Privoxy と比べると導入・動作検証・安定運用までのハードルがやや高めな為、Web広告に対し心の底から

な心境になった事がある人にお勧め。

About Pi-hole

Pi-hole とは?

ソフトウェアやブラウザの拡張機能を入れことなく、クライアントの DNS 設定を変更するだけで Web 広告やトラッキングを防ぐ事が可能な、DNS ベースの広告ブロック DNS サーバです。

メリット

デメリット

前準備

実行環境

24時間365日稼働が前提な為、実行環境を仮想化環境(VMware ESXi, Hyper-V, Proxmox VE 等)で用意する場合を除き、静音&低消費電力な Rapberry Pi もしくは Mini-ITX CPUオンボード 辺りがお勧め。本番運用前の動作検証は VirtualBox で試すのもありかと。中の人は「VirtualBox で Raspbian をインストールし、バックグランドで起動させる」と力業な事をしていました。

広告ブロック検証用のWeb広告多めのサイトリスト

具体的なURLやサイト名を出すとアレがナニでトラブルの元なので、「アフィリエイト ブログ 収入 OR 収益で検索すると広告多めなサイトが多数見つかる」とだけ言っておきます。

DNS切り替え可能なツール

インストール

Pi-hole インストール前に

が済んでいる事を確認の上、次の手順に進んでください。

動作環境

Pi-hole を動かす為の動作環境は

Hardware

Pi-hole is very lightweight, and does not require much processing power

  • Raspbian: Jessie / Stretch
  • Ubuntu: 16.04 / 16.10
  • Fedora: 27 / 28
  • Debian: 8 / 9
  • CentOS: 7 (not ARM)

Despite the name, you are not limited to running Pi-hole on a Raspberry Pi. Any hardware that runs one of the supported operating systems will do!

Supported Operating Systems

The following operating systems are officially supported: - ~52MB of free space - 512MB RAM

Prerequisites - Pi-hole documentation

と低めですがストレス無く運用する事を考えると、OS は最新のメジャーバージョン、Raspberry Pi ならスペックに余裕のある Raspberry Pi 3 以降、仮想化環境(VMware ESXi, Hyper-V, Proxmox VE 等)で動かすのなら

と余裕持った動作環境を。

インストール

以下の環境でインストールをしています。他のOSでインストールする場合は参考程度にしてください。

Pi-hole のインストールは以下のコマンドで。セキュリティ的にネット経由でインストーラを実行するのは不安な場合、2 or 3番目の方法を。

ネット経由で自動インストール。

curl -sSL https://install.pi-hole.net | bash

Github からリポジトリをクローンしてインストールを実行。

git clone --depth 1 https://github.com/pi-hole/pi-hole.git Pi-hole
cd "Pi-hole/automated install/"
sudo bash basic-install.sh

インストーラをダウンロードして実行。

wget -O basic-install.sh https://install.pi-hole.net
sudo bash basic-install.sh

基本デフォルトの設定のままで問題無く、インストール中に注意する事と言えば「管理画面へのログインパスワードをメモする」事ぐらい。設定変更時のファーカス位置は矢印キーで上下移動、タブで了解・取消へ移動。

Pi-hole install step 01

Pi-hole install step 02

Pi-hole install step 03

Pi-hole install step 04

Pi-hole install step 05

Pi-hole からの DNS 問い合わせ先を指定。後から変更可能、とりあえず Google を選択推奨。

Pi-hole install step 06

広告ブロックリストの有効・無効を指定。リストは後から追加可能。

Pi-hole install step 07

広告ブロックするIPプロトコルを選択。特に理由がないのであれば IPv4/Ipv6 両方を有効に。

Pi-hole install step 08

Pi-hole install step 09

IPv4 or IPv6 どちらかをルータから DHCP で動的に取得している場合にでる?(要検証@2018/11/17)

Pi-hole install step 10

IPv6 での DNS サーバのIPアドレス。

Pi-hole install step 11

Web インターフェイス(管理画面)を使用しますか?

Pi-hole install step 12

Web インターフェイス(管理画面)用に lighttpd をインストールしますか?

Pi-hole install step 13

DNS クエリをログとして保存しますか?

Pi-hole install step 14

インストールはこれで終了。Pi-hole の

が表示される。ログインパスワードは必ずメモをしておく事。

Pi-hole install step 17


pi@raspberry:~ $ curl -sSL https://install.pi-hole.net | bash

  [✗] Root user check
  [i] Script called with non-root privileges
  [i] The Pi-hole requires elevated privileges to install and run
  [i] Please check the installer for any concerns regarding this requirement
  [i] Make sure to download this script from a trusted source

  [✓] Sudo utility check

  [✓] Root user check

        .;;,.
        .ccccc:,.
         :cccclll:.      ..,,
          :ccccclll.   ;ooodc
           'ccll:;ll .oooodc
             .;cll.;;looo:.
                 .. ','.
                .',,,,,,'.
              .',,,,,,,,,,.
            .',,,,,,,,,,,,....
          ....''',,,,,,,'.......
        .........  ....  .........
        ..........      ..........
        ..........      ..........
        .........  ....  .........
          ........,,,,,,,'......
            ....',,,,,,,,,,,,.
               .',,,,,,,,,'.
                .',,,,,,'.
                  ..'''.

  [✓] Disk space check

  [✓] Update local cache of available packages

  [✓] Checking apt-get for upgraded packages... up to date!

  [i] Installer Dependency checks...
  [✓] Checking for apt-utils
  [i] Checking for dialog (will be installed)
  [✓] Checking for debconf
  [✓] Checking for dhcpcd5
  [✓] Checking for git
  [✓] Checking for iproute2
  [✓] Checking for whiptail
  [i] Using Google DNS servers
  [✓] Set IP address to 192.168.0.115
            You may need to restart after the install is complete
  [i] Found IPv6 GUA address, using it for blocking IPv6 ads
  [i] IPv4 address: 192.168.0.115/24
  [i] IPv6 address: ****:****:****:****:****:****:****:****
  [i] Web Interface On
  [i] Web Server On
  [i] Logging On.
  [✗] Check for existing repository in /etc/.pihole
  [✓] Clone https://github.com/pi-hole/pi-hole.git into /etc/.pihole

  [✗] Check for existing repository in /var/www/html/admin
  [✓] Clone https://github.com/pi-hole/AdminLTE.git into /var/www/html/admin

  [i] Main Dependency checks...
  [i] Checking for bc (will be installed)
  [✓] Checking for cron
  [✓] Checking for curl
  [i] Checking for dnsutils (will be installed)
  [✓] Checking for iputils-ping
  [i] Checking for lsof (will be installed)
  [i] Checking for netcat (will be installed)
  [✓] Checking for psmisc
  [✓] Checking for sudo
  [✓] Checking for unzip
  [✓] Checking for wget
  [i] Checking for idn2 (will be installed)
  [i] Checking for sqlite3 (will be installed)
  [✓] Checking for libcap2-bin
  [i] Checking for dns-root-data (will be installed)
  [i] Checking for resolvconf (will be installed)
  [i] Checking for lighttpd (will be installed)
  [i] Checking for php-common (will be installed)
  [i] Checking for php-cgi (will be installed)
  [i] Checking for php-sqlite3 (will be installed)
  [✓] Enabling lighttpd service to start on reboot
  [✓] Installing scripts from /etc/.pihole

  [i] Installing configs from /etc/.pihole...
  [✓] No dnsmasq.conf found... restoring default dnsmasq.conf...
  [✓] Copying 01-pihole.conf to /etc/dnsmasq.d/01-pihole.conf

  [i] Installing blocking page...
  [✓] Creating directory for blocking page, and copying files
  [✓] Backing up index.lighttpd.html

  [✓] Installing sudoer file

  [✓] Installing latest Cron script

  [✓] Installing latest logrotate script

  [i] FTL Checks...
  [✓] Detected 32bit (i686) architecture
  [i] Checking for existing FTL binary...
  [✓] Downloading and Installing FTL


  [i] Skipping firewall configuration
  [✓] man pages installed and database updated
  [i] Systemd-resolved is not enabled
  [✓] Starting lighttpd service
  [✓] Enabling lighttpd service to start on reboot
  [i] Restarting services...
  [✓] Starting pihole-FTL service
  [✓] Enabling pihole-FTL service to start on reboot
  [✓] Deleting existing list cache
  [i] Neutrino emissions detected...
  [✓] Pulling blocklist source list into range

  [i] Target: raw.githubusercontent.com (hosts)
  [✓] Status: Retrieval successful

  [i] Target: mirror1.malwaredomains.com (justdomains)
  [✓] Status: Retrieval successful

  [i] Target: sysctl.org (hosts)
  [✓] Status: Retrieval successful

  [i] Target: zeustracker.abuse.ch (blocklist.php?download=domainblocklist)
  [✓] Status: Retrieval successful

  [i] Target: s3.amazonaws.com (simple_tracking.txt)
  [✓] Status: Retrieval successful

  [i] Target: s3.amazonaws.com (simple_ad.txt)
  [✓] Status: Retrieval successful

  [i] Target: hosts-file.net (ad_servers.txt)
  [✓] Status: Retrieval successful

  [✓] Consolidating blocklists
  [✓] Extracting domains from blocklists
  [i] Number of domains being pulled in by gravity: 149651
  [✓] Removing duplicate domains
  [i] Number of unique domains trapped in the Event Horizon: 126734
  [i] Nothing to whitelist!
  [i] Number of regex filters: 0
  [✓] Parsing domains into hosts format
  [✓] Cleaning up stray matter

  [✓] Force-reloading DNS service
  [✓] DNS service is running
  [✓] Pi-hole blocking is Enabled
  [i] Web Interface password: Z0-Agg16
  [i] This can be changed using 'pihole -a -p'

  [i] View the web interface at http://pi.hole/admin or http://192.168.0.115/admin

  [i] You may now configure your devices to use the Pi-hole as their DNS server
  [i] Pi-hole DNS (IPv4): 192.168.0.115
  [i] Pi-hole DNS (IPv6): ****:****:****:****:****:****:****:****
  [i] If you set a new IP address, please restart the server running the Pi-hole

  [i] The install log is located at: /etc/pihole/install.log
    Installation Complete!

アップデート

以下のコマンドを実行。

pihole -up

設定

Settings - System

Pi-hole のネットワーク & システム情報を表示。ページ下部から、クエリログの消去・無効化、Pi-hole & OSの再起動等の操作可。

Pi-hole Admin Console - Setting : System

Settings - Blocklists

ブロックリストの表示および編集の管理画面。インストール直後に入っているブロックリストは主に海外が対象な為、日本国内 & 海外用として

から

https://warui.intaa.net/adhosts/hosts.dos
https://280blocker.net/files/280blocker_domain.txt
https://logroid.github.io/blogger/file/hosts.txt
https://sites.google.com/site/hosts2ch/ja
http://winhelp2002.mvps.org/hosts.txt
http://pgl.yoyo.org/as/serverlist.php?hostformat=hosts&showintro=0&mimetype=plaintext

を追加を。重複したドメインはアップデート or ブロックリスト追加・更新時に除去されます。

Pi-hole Admin Console - Setting : Blocklists

Settings - DNS

初期状態では IPv6 向け DNS サーバにチェックが付いてない為、 IPv6 接続環境の場合は確認を。

Pi-hole Admin Console - Setting : DNS

Settings - DHCP

DHCP の設定。

Pi-hole Admin Console - Setting : DHCP

Settings - API / Web interface

API と Web インターフェイスに適用される設定(クエリ出力の例外設定・温度の単位・メールアドレス等)を管理。

Pi-hole Admin Console - Setting : API / Web interface

Settings - Privacy

DNS クエリ表示のプライバシーレベルを設定。詳細については Privacy levels - Pi-hole documentation を参照。

Pi-hole Admin Console - Setting : Privacy

Settings - Teleporter

設定のバックアップ・リストア。

Pi-hole Admin Console - Setting : Teleporter

ホワイトリスト/ブラックリストの編集

Web 経由でブロックリスト追加・更新する以外にも、ブロックしたいドメインを個別にホワイトリスト/ブラックリストへ登録できます。

ホワイトリスト
Blocklist、もしくはブラックリスト中に含まれているが対象外としたいドメインを登録。
対象ドメイン(or サブドメイン)と「全て一致する文字列」を登録してください。
ブラックリスト
Blocklist ではブロック対象となっていないドメインを登録。
対象ドメイン(or サブドメイン)は「全て一致する文字列・ワイルドカード・正規表現」の三通りで登録できます。

ワイルドカードでの登録は「example.com とテキストボックスに入力 → Add (wildcard)のボタンを押す」と、 (^|.)example\com$ とドメイン・サブドメインを含めた正規表現パターンで登録されます。

動作に関する詳細は以下の通り(Pi-hole の Help から抜粋意訳)。

ホワイト/ブラックリスト

ホワイト/ブラックリストからドメイン(またはサブドメイン)を追加または削除します。ホワイトリストにドメインを追加する場合、既に登録されているドメインはブラックリストから削除され、その逆もあります。

正規表現を使用したブラックリストへの登録がサポートされています(^example と入力すると example で始まるドメインがブロックされます。詳細は Pi-hole regular expressions tutorial を参照してください。)あるドメインが正規表現のパターンに該当する場合でも、ホワイトリストに登録できます。

ドメインをスペースで区切ると、一度に複数のエントリをホワイト/ブラックリストに登録することができます。

Pi-hole Admin Console - Whitelist

Pi-hole Admin Console - Blacklist

Pi-hole を DNS サーバとして使う

IPv4/IPv6 のDNSサーバ アドレス設定(Windows 10 での設定例)。

Client DNS Setting for IPv4

Configure network settings to use Pi-hole(IPv4)

Client DNS Setting for IPv6

IPv6 向け DNS サーバの設定は IPv4 射影アドレスでも可。

Configure network settings to use Pi-hole(IPv6)

Piーhole Tips

開発版を使用する

リリース版(Ver 4.0)は、以下の記事にあるように「広告ブロッキングには問題無いがそれ以外の微妙な所でバグがある」為、動作確認を一通り終えたなら開発版に移行を推奨。

pihole checkout dev

リリース版に戻す

sudo rm /etc/pihole/ftlbranch
pihole checkout master

Help Us Beta Test FTLDNS – Pi-hole

管理画面へのログインパスワードを再設定する

対話式で変更するなら

pi@raspberry:~ $ pihole -a -p
Enter New Password (Blank for no password):
Confirm Password:
[✓] New password set

コマンドから直接パスワード指定して変更する場合、変更したいパスワードを secretpassword とすると

pihole -a -p secretpassword

The pihole command : Password - Pi-hole documentation

Pi-holeのブロックリストを初期状態へ戻す

sudo rm /etc/pihole/list.*
pihole -g

How can I restore Pi-hole's default blocklists? - FAQs - Pi-hole Userspace

DNSブロッキング時の応答をデフォルトから変更する

デフォルトのままで問題ありません。「DNS ブロッキング時の応答を NULL 応答から変えたい」場合だけ変更を。

以下はブロッキング時の応答を NXDOMAIN で返す場合。詳細は Blocking mode - Pi-hole documentation を参照してください。

pi@raspberry:~ $ su
パスワード:
root@raspberry:/home/pi# cd /etc/pihole/
root@raspberry:/etc/pihole# echo BLOCKINGMODE=NXDOMAIN | tee -a pihole-FTL.conf
BLOCKINGMODE=NXDOMAIN
root@raspberry:/etc/pihole# pihole restartdns

Dashboard でドメインブロック数がカウントされていない

ブロッキングを無効にしていないのであれば Web インターフェイス(管理画面)の Settings - Blocklists、もしくはCUIからブロッキングリストを更新してください。

pihole -g

No blocking domain count - pihole@Reddit

Pi-hole をフルサービスリゾルバ(キャッシュ DNS サーバ)として使う

Pi-hole をフルサービスリゾルバ(キャッシュ DNS サーバ)として使う手順を解説。

Install : Unbound

Pi-hole をインストールしたマシンに Unbound をインストール。

sudo apt install unbound

DNSルートゾーンファイルの取得。

wget -O root.hints https://www.internic.net/domain/named.root
sudo mv root.hints /var/lib/unbound/

Setting : Unbound

  1. デスクトップ上で「右クリック→新規作成→空のファイル」から pi-hole.conf を作成
  2. 作成したファイルに Pi-hole as All-Around DNS Solution - Pi-hole documentation をコピペ。
  3. /etc/unbound/unbound.conf.d/ 配下に作成したファイルを移動。

作成したファイルを移動させる際のコマンドは以下の通り。

cd /home/pi/Desktop
sudo mv pi-hole.conf /etc/unbound/unbound.conf.d/

中の人用、再インストール時の設定ファイルメモ(IPv4/IPV6両対応、負荷対応やや高め)。

# /etc/unbound/unbound.conf.d/pi-hole.conf

server:
    # ログの保存場所 & エラーレベル(0~5)の設定
    logfile: "/var/log/unbound/unbound.log"
    verbosity: 0

    port: 5353
    do-ip4: yes
    do-udp: yes
    do-tcp: yes

    # May be set to yes if you have IPv6 connectivity
    #do-ip6: no
    do-ip6: yes

    # Use this only when you downloaded the list of primary root servers!
    root-hints: "/var/lib/unbound/root.hints"

    # Trust glue only if it is within the servers authority
    harden-glue: yes

    # Require DNSSEC data for trust-anchored zones, if such data is absent, the zone becomes BOGUS
    harden-dnssec-stripped: yes

    # Add@2018/11/04
    # DNSSECの署名の検証時に参照パスの検証を行う
    # NSEC/NSEC3 Replacement Attack
    # http://www.e-ontap.com/blog/20181031.html
    harden-referral-path: yes

    # Don't use Capitalization randomization as it known to cause DNSSEC issues sometimes
    # see https://discourse.pi-hole.net/t/unbound-stubby-or-dnscrypt-proxy/9378 for further details
    use-caps-for-id: no

    # Reduce EDNS reassembly buffer size.
    # Suggested by the unbound man page to reduce fragmentation reassembly problems
    edns-buffer-size: 1472

    # TTL bounds for cache
    cache-min-ttl: 3600
    cache-max-ttl: 86400

    # Perform prefetching of close to expired message cache entries
    # This only applies to domains that have been frequently queried
    prefetch: yes

    # One thread should be sufficient, can be increased on beefy machines
    #num-threads: 1
    num-threads: 2

    # Ensure kernel buffer is large enough to not loose messages in traffic spikes
    #so-rcvbuf: 1m
    so-rcvbuf: 8m

    # Ensure privacy of local IP ranges
    # local address : IPv4
    private-address: 169.254.0.0/16
    private-address: 10.0.0.0/8
    private-address: 172.16.0.0/12
    private-address: 192.168.0.0/16

    # local address : IPv6
    private-address: fe80::/8
    private-address: fe80::/10

    # Unboud がリクエストを受け付けるのは同じマシン上の Pi-hole からだけなので access-control の設定は省略
    # デフォルトでは localhost のみ許可(allow)、残りのアクセスは拒否(refuse)される

設定ファイルを編集後、Unbound をサービスとして起動。その後、適当なドメインを dig でローカルホストのポート5353へ向けて問い合わせ、応答が返ってきたなら正常に動作。

sudo service unbound start
dig pi-hole.net @127.0.0.1 -p 5353

DNSSEC の動作検証は

dig sigfail.verteiltesysteme.net @127.0.0.1 -p 5353
dig sigok.verteiltesysteme.net @127.0.0.1 -p 5353

最初のコマンドの応答が SERVFAIL、2番目のコマンドで NOERROR が返ってくるなら正常に動作。

Setting : Pi-hole

Unbound 側の動作確認後、Piーhole : Settings - DNS の「Upstream DNS Servers」で現在使用しているパブリック DNS 側のチェックを外し、

を入力。該当項目にチェックを入れた後に設定を保存。DNSSEC 使用時はそちらにもチェックを。

Pi-hole Admin Console - Setting : DNS,Upstream Servers from Piーhole

Unbound をローカル用 DNS サーバとして使用する

Unboud をインストールしたついでに、LAN内のサーバに対してもドメイン名でアクセスできるようにしてみる。

「アクセスしたいローカルドメインとIPの対応」を /etc/unbound/unbound.conf.d/pi-hole.conf に追記、もしくは任意ファイル名(例:localdomain.conf)で作成し /etc/unbound/unbound.conf.d/ 配下に置く。

以下は、自宅ネートワークでの設定例。

server:
    # ローカルにあるサーバをドメイン名でアクセス
    local-data: "esxi.localdomain.    IN A 192.168.0.101"
    local-data: "nas.localdomain.     IN A 192.168.0.103"
    local-data: "rec.localdomain.     IN A 192.168.0.105"
    local-data: "node-js.localdomain. IN A 192.168.0.107"

    # 外部公開しているWebサーバをドメイン名でアクセス(ヘアピンNAT非対応ルータの場合)
    local-data: "example.net.   IN A 192.168.0.110"
    local-data: "example.com.   IN A 192.168.0.110"
    local-data: "example.org.   IN A 192.168.0.110"

作成後、設定をリロードし

sudo unbound-control reload

Unboud が動いているマシンから nslookup もしくは dig で応答を確認する。

dig esxi.localdomain @127.0.0.1 -p 5353
dig nas.localdomain @127.0.0.1 -p 5353
dig rec.localdomain @127.0.0.1 -p 5353
dig node-js.localdomain @127.0.0.1 -p 5353
dig example.net @127.0.0.1 -p 5353
dig example.com @127.0.0.1 -p 5353
dig example.org @127.0.0.1 -p 5353

参考記事

Pi-hole Official

Pi-hole Installation & Trial Report

Blocking List

Unbound

DNS

Tool

Other