Pi-holeの紹介 ~自宅LAN全部まとめてAd Blocking~

Pi-holeの紹介 ~自宅LAN全部まとめてAd Blocking~
Page content

Pi-holeでなにができるか

DNSフィルタリング機能を備えたDNSサーバソフトウェア、「Pi-hole」を簡単に紹介します。

Pi-holeでなにができるか。自宅LANでこれを動かしておくと、自宅LANの中にスマホやPCなどのインターネット端末が、OSを問わず多数あるとしても、それらのDNSの正引きをPi-holeでまとめてフィルタリングできます。つまりは各端末から、広告等を配信しているインターネット上のサーバ (ドメイン) へのアクセスを発生させないようにできます。

このようなネットワークレベルでの「Ad Blocking」の利点のひとつとして、子どもが使うChromebook (モバイルノート) やiPad (タブレット端末) それ自体には特殊な設定等をしなくても、端末の画面には大半のインターネット広告が表示されなくなるので、親としては比較的穏やかな気持ちで、安心して子どもの端末操作を見守っておけるようになります。

公式サイトとインストール方法

Pi-holeの公式サイトはこちら。

ラズベリーっぽいロゴやPiが付いた名称から、小型コンピュータ「Raspberry Pi」に特化したソフトウェアかな?と思わせる部分がありますが、Raspbian (Raspberry Pi OS) に限らず、Ubuntu, Debian, Fedora, CentOSへインストール可能で、Dockerコンテナも用意されています。

Pi-holeのインストール方法の詳細は、公式サイトのドキュメントでご確認ください。私の場合はUbuntuが動いているx86_64の自宅サーバに、Pi-holeを次のコマンドでインストールしました。

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

導入時の諸注意やポイント

  • Pi-holeのインストールが完了すれば、http://サーバのIPアドレス:80/ でPi-holeの管理画面へアクセスできるようになります (ポート番号80は環境によっては変更となる)
  • 自宅LAN内にDHCPサーバが複数動いていると、LAN内での混乱のもとになる可能性があるため、DHCPサーバは1台のみにするのがベターだと思います (既存のルータのDHCP機能を有効化したままにするか、既存ルータのDHCP機能は無効化してPi-holeをDHCPサーバとして有効化するか)
    • いずれの場合でも、Pi-holeのDNSサーバ機能をDHCPクライアント端末が使うためには、DHCPサーバ側の設定で、端末が使用するDNSサーバをPi-holeのIPアドレスとすることが必要です
  • Pi-hole管理画面の Group Management > Adlists に追加するリストとして、たとえば、次のサイトで配布されている「AdAway」用を流用できます

Pi-holeの効果

Pi-holeの管理画面では、次の画像のように、Pi-holeが処理したDNSクエリーの総数やブロックした割合が確認できるようになっています。私の家のLAN環境 (DHCPクライアント数20ぐらい) では平均的に、おおよそ10%強のDNSクエリーがブロックされている状態です。

参考情報: YTadsblocker

参考として、Pi-holeと組み合わせて使うこのようなスクリプトもあります。

追記 [2020-08-11]

いろいろと興味あって調べていたのだが、次のページの2020-07-11の書き込みに、こうあります。YouTubeのVideo ADsは、Pi-holeで遮断することは難しそうだとわかります。

Ultimately, youtube video ads are served from the same content domains as the videos themselves, so the only sure fire way to block ads on youtube is to block youtube all together :wink:

追記 [2021-01-23]

Pi-holeのブロックリストを簡単に追加するツールについて書きました。

外出先でもPi-holeを使うために

Pi-holeは我が家のインターネット利用に大きな安心をもたらすものだとわかり、外出先での家族の端末のDNSサーバとしても、自宅のPi-holeを利用しようと次に思いつきました。しかし、私の家 (IPv6/IPoEでDS-Lite) のように、インターネットへのポート開放ができない回線の場合は、インターネットから自宅サーバに直接アクセスさせることはおそらく難しい。

そこで、SoftEther VPNを使った、次のような仮想ネットワークを作りました。

自宅のPi-hole (SoftEther VPN Client) ----[VPN]---- WebARENAのVPS (SoftEther VPN Server) ----[VPN]---- 外出先の端末 (L2TPクライアント)

インターネット上のVPSにSoftEther VPN Serverをインストールしてサービスさせ、自宅のPi-holeサーバはそのVPN Clientとして常時VPN接続しておきます。そして、外出先で端末がL2TPクライアントとしてVPN接続を確立している状態でのDNSサーバとして、自宅Pi-holeを使用するように諸々設定しました。

これで、家族の端末が4G/LTE回線や公衆無線LANを利用中でも、VPN接続をONに切り替えるだけで、その端末では自宅LANの中と同じく透過的にPi-holeのDNSフィルタリング機能を享受できます。さらに、端末側で、DNSサーバとの通信だけではなく全ての通信がVPNを通るように設定すると、公衆無線LAN利用時の通信のトンネル化も実現できて一石二鳥です。

なお、おそらくはDNSフィルタリングとは関係なく端末がVPN接続状態かどうかの関係ですが、私の端末 (Android) のアプリのなかには、VPN接続時に、「VPN接続時には利用できません」という表示を出すものがありました。そのようなアプリを使う時には、端末でVPN接続をOFFする必要があります。

追記 (SoftEther経由でPi-holeを使う設定) [2022-07-04]

そして、外出先で端末がL2TPクライアントとしてVPN接続を確立している状態でのDNSサーバとして、自宅Pi-holeを使用するように諸々設定しました。

上記の部分に関して、「どのように設定していますか?」という質問メールをいただきました。その回答として設定のエッセンスを追記します。

  1. 自宅Pi-holeのSoftEther VPN上のIPアドレスを、DHCP取得ではなくたとえば192.168.30.2に固定する
## Ubuntuの場合
$ cat /etc/netplan/98-softether.yaml 
network:
  version: 2
  renderer: networkd
  ethernets:
    vpn_softether:
      addresses:
        - 192.168.30.2/24
      gateway4: 192.168.30.1
      nameservers:
        addresses: [192.168.30.1]
        search: []
      routes:
        - to: 192.168.30.0/24
          via: 192.168.30.1
          metric: 999

$ ip address show vpn_softether | grep 'inet '
    inet 192.168.30.2/24 brd 192.168.30.255 scope global vpn_softether
  1. SoftEther VPN Serverでの「SecureNAT機能」を有効化し、かつ、仮想DHCPサーバでの「クライアントに割り当てるDNSサーバーのアドレス」として自宅Pi-holeのSoftEther VPN上のIPアドレス (192.168.30.2) を指定する
  2. 自宅Pi-holeの「Interface settings」を「Permit all origins」へ変更する (SoftEther VPN経由での自宅Pi-holeへのアクセスは、仮想インタフェースvpn_softetherを通ってくるため)

おおよそ以上の設定で、外出先の端末をVPNクライアントとしてSoftEther VPN Serverへ接続した際、外出先端末へはSoftEtherの仮想DHCPサーバからIPアドレスが割り当てられ、かつ、外出先端末のDNSサーバとしてはデフォルトのSoftEther VPN Server自体ではなく自宅Pi-holeが利用されるようになります。