Pi-Holeとは

Pi-Hole
Pi-HoleはEUPLでライセンスされた小規模ネットワーク向けDNSシンクホールの実装である。dnsmasqからフォークした独自のFTLDNSとWebUIから構成されている。
これは自宅ネットワーク丸ごと広告ブロックできるようにするソフトウェアだ。
いちおう広告ブロッカーとして開発は進められているものの,遮断するドメインはもちろん完全に任意なのでただのキャッシュDNSサーバーとしても動かすことができる。
動機
Web上の広告を完全にブロックしていると,世間一般の感覚からズレてしまうと感じることが少なからずある。
最近とくに衝撃を受けたのは父のスマホを見せてもらったときだ。尋常ではない量の広告が画面の2/3を埋め尽くしていて,スクロールするための余白を探さなくてはならないという有り様だった。量だけでなく内容も問題で,あんなのを毎日直視してたら文字通り気が狂ってしまう。
しかし,父は頑なに広告ブロッカーを使おうとしないのだ。電気通信業に長年従事していてITリテラシーはむしろ高いほうだと思うのだが,妙に義理堅い性格のためかもしれない。義理と言ったって,現状のWeb広告に同情の余地などあるだろうか?見る者を騙し,故意に傷つけ,時間と計算資源を浪費させている。
彼らに営業の自由があるなら,私たちには見るものを選択する自由がある。
私は一計を案じ,ネットワークの上流で対策を講じることにした。実家のネットワークは事実上私がすべて管理しているので都合がいいのだ。
環境
ネットワーク図

Pi-HoleのDHCPサーバー機能は有効化せず,DNS機能だけを使う。
ルーターはYamahaのNVR700Wで,NTTのHGWからUNI出しをして使っている。小型ONUにしてもいいかもね。
あまりルーターから離れすぎるとよくないので直下のL2スイッチに繋ぐことにした。居間に置く都合上マシンはファンレスが条件になってくる。
マシン
秋葉原のPCコンフル1で手に入れたHP t420 Thin Clientを使う。
最近はめっきり廃れつつあるシンクライアント端末だが,低消費電力CPUを搭載していることが多いうえメーカーが産業向けに作る製品なだけあって信頼性は高い。サーバーにするならRPiや安物のミニPCなんかよりよほどおすすめだ。安いしね。

t420の内部
2GBのRAMはオンボードで増設不可。
miniPCIe端子は残念ながらフルスペックではないため,mSATAのSSDに対応していない。
USB SSDは秋葉原の某店にて爆安で入手したSSD-PSTA/Nを使っている。爆安といっても本体の値段の2倍だったので意味不明な不釣り合いだ。ここまで金掛けるならもうワンランク上のHP ProDeskやDell Wyse,Fujitsu FUTROのストレージ付き中古をおすすめする。ただI/Oは絶対に早いほうがいいのでUSBメモリはおすすめしない。
OSは公式でサポートされているDebianにして,専用機にするためDockerは使わず直接インストールする。
Debian GNU/Linux 12 (bookworm)
AMD GX-209JA
2GB RAM
256GB USB SSD
公式サイトによれば512MBのRAMと2GBのディスクスペースで最低限動作はするというのでRPi Zero 2 W でもいけるらしい。なんという軽量さ。
インストール
Linuxのインストールは通常通り進める。今回はホスト名をpi-hole
にしたが,pihole:pihole
というユーザー:グループがあとから作成されるため,ユーザー名は絶対にpihole
にしないように注意。
IPアドレスの固定
Pi-Holeをインストールする前にネットワークインターフェースにIPアドレスを固定する必要がある。
DHCPサーバー(ほとんどの家庭ではルーターが兼任する)の設定からMACアドレスとIPアドレスを紐づけて固定してもいいが,今回のような小規模ネットワークの場合はDHCP払い出し範囲の外側に勝手に固定IPを設定するのもアリだ。実家の場合はDHCP払い出し範囲を192.168.100.30
~
192.168.100.191
に設定しているので192.168.100.2
~
192.168.100.29
までを好きに使うことができる。
Debianでは/etc/network/interfaces
のdhcp
をstatic
に変更することによってIPアドレスを固定する。
# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).
source /etc/network/interfaces.d/*
# The loopback network interface
auto lo
iface lo inet loopback
# The primary network interface
allow-hotplug enp1s0
iface enp1s0 inet static
address 192.168.100.2
netmask 255.255.255.0
gateway 192.168.100.1
# This is an autoconfigured IPv6 interface
iface enp1s0 inet6 auto
nmcli
など他の手段で管理する場合は最低限の記述だけ残しておく。
auto lo
iface lo inet loopback
アップストリームDNSサーバーがIPv6に対応しているならIPv6は有効化しておいていいかもしれない。IPv6は固定化して使うものでもないと思うのでauto
にしておく。WebUIやSSHなどへの接続はファイアウォールで遮断したほうがいい。
インストーラーの実行
公式サイトではDockerを除いて3通りの方法が提示されているが,どれもインストーラーを実行する点は同じだ。慎重な人はリポジトリをgit cloneするかwgetでインストーラーだけダウンロードするかして実行するのがおすすめ。
ルーターの設定を変更しない限りDNSとしては機能しないので,細かい設定は後回しにしてもいい。インストールが終わるとWebUIパスワードが発行されるのでメモしておく(コマンドラインから変更することもできる)。
WebUIへはhttp://pi.hole/
でアクセスできる。ブラウザのアドレス欄に入れただけでは単に検索されてしまうことが多いのでhostsに書いておくか,必ずhttp://
をつけてアドレス欄に入力する必要がある。mDNSやIPアドレスの直打ちだとなぜかログインページににリダイレクトされないのでhttp://pi-hole.local/admin
やhttp://192.168.100.2/admin
としなければならない。
アップストリームDNSの設定
Pi-HoleにはアップストリームDNSサーバーを「プロバイダからDHCPで配信されるアドレスを自動で設定する」という方法がないため,アドレスを直接指定する必要がある。
Googleの8.8.8.8
,8.8.4.4
やCloudflareの1.1.1.1
,1.0.0.1
などオープンリゾルバを推奨する記事が多いが,オープンリゾルバはそれ自体が問題視されることも多いし,プロバイダのDNSを指定したほうがいいと思う。私自身インターネットを支配する野心を隠そうともしないBig
Techのことが嫌いという個人的な思いもあるが,DNSに限らず無料で提供されているサービスは利用者の情報をはじめ必ず何かを対価に取っていると考えているからだ。ただプロバイダのDNSがへなちょこでパフォーマンスのために変更しているという意見もみられるし,日本のISPとくにNTTグループの3社が著作権保護という名目でDNSブロッキングを実施したことを鑑みるとあまり悪く言う気にもなれない2。
なお,フレッツ光加入者向けの情報になるがインターネット接続用の「フレッツ光のDNSサーバー」というものは存在しない3。DNSそのものがインターネットへの接続を前提としたシステムなので,閉域網であるフレッツ網から外に出る通信は基本的にISPに委ねられているためだ。
プロバイダのキャッシュDNSサーバーアドレスは非公開であることもあり,ルーターから確認できなければ公式サイトなどから地道に見つけ出すしかない。
ここでひとつ有益な情報を。プロバイダが詳細なキャッシュDNSサーバー情報を公開しているかどうかを判断するためのキーワードは「マルウェアブロッキング」だ。これはプロバイダのキャッシュDNSサーバーが顧客のネットワークから既知のC&Cサーバーに対するDNS問い合わせを検知するとそれをブロックするというもの。(Pi-Holeそのものだな……)
これはどうやら総務省とISP事業者が共同でやっているACTIVE(マルウェア対策支援)というプロジェクトに関連するサービスらしく,参加企業・団体に名前のあるISPならだいたいやっているようだ(全部は調べてない)
当然なにかのトラブルが起きて顧客が名前解決ができないとなったときに「マルウェアブロッキングを無効化して原因を調べたい」という要望が想定されるので,代替のアドレスをWeb上で公開していることがあるようだ。ブロッキングに使用するほうのキャッシュDNSサーバーは非公開らしく,変更後はもちろん「マルウェアブロッキング」が使えなくなってしまうことにも注意。
ルーターをPi-Holeに差し向ける
これを行うといよいよPi-Holeがキャッシュサーバーとして稼働し始める。
普通のルーターならDNSの設定からPi-Holeのアドレス(今回は192.168.100.2
)を指定すればいい。
YamahaのNVRの場合,コマンドの実行でdns server 192.168.100.2
とdns notice order dhcp server me
を実行する。GUIから中継先DNSサーバーを指定するだけでは余計なトラフィックが発生してしまう4ので効率的なネットワーク構築のためにはPi-HoleのアドレスをDHCPで配信する必要があるためだ。server me
としておくことによってPi-Holeが落ちたときのためにNVR700WのDNSサーバーをバックアップとして控えさせている5。これさえやっておけばPCやスマホの設定を一切触る必要がない。スマホやPCの「ネットワーク設定」からDNSを確認して192.168.100.2 192.168.100.1
の順になっていれば大成功だ。

順番を間違えるとうまくいかないので注意
Linuxの場合,ネットワーク管理はディストリビューションによる差異が甚だしいので難しいが,例えばnmcliで管理しているとしてLAN内のIPアドレスを固定するためにmethodをmanual
にしているような場合にはDHCPを無視するのでipv4.dns 192.168.100.2 192.168.100.1
としてやる必要がある。/etc/resolvd.conf
を書き換えるのと同じことだが# Generated by NetworkManager
というコメントがあるなら直接書き込まないほうがいいだろう。
これだけやってまだDHCPで配信されたPi-Holeを無視する不届き者がLAN内にいる場合は直接手を下さなければならない。とくに無線LANのアクセスポイントなどは手動の設定を求まられることが多い。IoT機器は広告ブロックする必要ないだろと思うかもしれないが、Pi-Holeが真価を発揮するのはこういった詳細な設定ができない機器に対してである。広告はなくてもこっそりと利用統計情報を送信していることがあるし,そういうことをする機器に限って設定から無効にすることができない。
プライバシーの設定を確認する

他人のプライバシーは尊重しなくてはならない。自分以外も使うネットワークならばどの機器からどういうリクエストがあったかという情報はデバッグが済んだら見えないようにしておくべきだ。ただしWeb UIから見えなくなっても本体のログには残る。
ブロックリストを追加する
といってもルールが厳しすぎて使い物にならないよりむしろ緩すぎてすり抜けてくるほうが幾分マシだと思うのでPi-HoleデフォルトのStevenBlack / hostsから変更していない。それにこういう類のものはあまりカスタムしすぎるとかえってフィンガープリントになってしまうので多数派のユーザーに合わせたほうが無難だという事情もある。
広告が消せるといってもYouTubeの広告は原理上消すことができないし,Web上の広告もそのうち対策されて消せなくなるかもしれない。それに家を離れると使えなくなるのでやっぱり端末側でコントロールするべきじゃないのかとも思う。外出時にVPNで自宅を中継するとなってくるといよいよ訳がわからなくなってくるし,セキュリティ的にも素人の手におえないものになってしまう。
まとめ
広告との戦いはテクノロジーそのものとの戦いに近い。巨大企業の第一線級のエンジニアが生み出す技術に私たちは毎日コテンパンにやられている。
Pi-Holeはそうした無理筋の戦いに「勝利」するための手段ではなくて,不自由さがはびこるネットワークに古き良き自由を取り戻すための,少なくとも延命手段のような気がする。
パソコンやネットワークが好きで,新しいことにチャレンジしたい方はご家庭に設置してみてはどうだろうか。blockedとcachedを眺めてニヤニヤしよう。
AMDチップ搭載のシンクライアント端末「t420 Thin Client」が1,500円!中古品セール - AKIBA PC Hotline!↩︎
ただし,GoogleやCloudflareのDNSを利用した接続を完全に遮断するというポリシーのサイトもある。「浸透いうな」で名高い中京大学の鈴木常彦教授のサイト | Welcome to the E-ONTAP↩︎
ここに示されているのは「フレッツADSL」加入者がフレッツ網内の「サービス情報サイト」に接続するために使うDNSで,インターネット用ではない。 | DNSサーバアドレスの一覧|接続方法|サービス情報サイト(IPv4)|フレッツ公式|NTT東日本↩︎
「DNSリゾルバ-DNSサーバ」という関係で処理したいのに、 「DNSリゾルバ-DNSリカーシブサーバ-DNSサーバ」という関係になってしまい。 無駄なトラフィックを発生させてしまいますから。
汎用機であるPC(シンクライアント)よりも専用機であるルータのほうが耐障害性は高いと考えられるため,このようにしている。YamahaのNVRは計4台のDNSサーバーアドレスを配信できるが,Linuxの
resolvd.conf
にはnameserverは3つまでしか登録できないので,冗長性を持たすためにPi-Holeを増やしたとしてもあと1台くらいだろう。↩︎
ライセンス情報

Kitazawa Sakufuによる実家のネットワークにPi-Holeを導入はクリエイティブ・コモンズ [表示 4.0 国際]ライセンスの下に提供されています。