NeeNetです。
今回は、TailscaleとPi-holeを利用して、プライベートDNS環境を構築したいと思います。
ソフトウェア紹介
Pi-holeとは
Pi-holeは、ネットワークレベルで広告をブロックするオープンソースのDNSサーバーソフトです。
主な特徴は以下の通りです。
- DNS sinkhole方式:広告配信ドメインへのDNSクエリをブロックする
- ネットワーク全体を保護:接続されている全デバイス(スマホ、PC、タブレット、IoT機器など)の広告を一括ブロックする
- ブラウザ拡張不要:アプリやブラウザに個別の広告ブロッカーのインストールが不要
- Web管理画面:ブロックした統計情報やブラックリスト管理がWebのUIで簡単に設定できる
- 軽量:Raspberry Piのような低スペックデバイスでも動作可能
すなわち、Pi-holeをDNSサーバーとして設定することで、通信時に広告のドメインをブロックし、結果として広告が配信されなくなります。
Tailscaleとは
Tailscaleは、WireGuardベースの簡単に使えるVPN(仮想プライベートネットワーク)サービスです。
主な特徴は以下の通りです。
- ゼロコンフィグVPN:複雑なネットワーク設定が不要で数分でセットアップできる
- P2P接続:可能な限りデバイス間で直接接続を行う(低遅延)
- NAT越え:ルーターのポート開放が不要
- 暗号化:WireGuardによる高速で安全な通信
- クロスプラットフォーム:Windows、Mac、Linux、iOS、Android対応
- 無料プランでも動作:個人利用なら最大100台まで無料
従来のVPNと比較し、自前でVPNサーバーを立てる必要が無く、メッシュネットワークにより全デバイスが相互に接続できるという利点があります。
| 項目 | Tailscale | 従来のVPN |
| 暗号化 | ✓ WireGuard | ✓ OpenVPN等 |
| 通信保護 | ✓ | ✓ |
| 設定の簡単さ | ◎ | △ |
| 速度 | ◎ 高速 | ○ やや遅い |
| コスト | 無料(個人) | 有料が多い |
今回のシステム構成
Pi-holeとTailscaleを組み合わせることで、外出先からでも自宅のPi-hole経由でインターネットにアクセスし、広告ブロックの恩恵を受けられるようになります。
また、WireGuardプロトコルにより通信が暗号化されるため、Raspberry PiをTailscaleのExit Nodeに設定すれば、外出先でフリーWi-Fiに接続しても通信の内容を秘匿でき、エンドツーエンドで暗号化されるため中間者攻撃も防ぐことができるため、セキュリティを担保することができます。
今回の構成図を記載すると次の通りです。

設定手順
Raspberry Piの初期設定
まず、microSDにOSイメージを書き込むところから始めます。
イメージの書き込みには公式のRaspberry Pi Imagerを利用します。
インストールがまだな方はこちらのリンクから、インストールを行って下さい。

Raspberry Pi Imagerのインストールが完了したら、起動して今回書き込むRaspberry Piのデバイスの種類を選択します。
当方が今回利用するのはRaspberry Pi 3 Model B+なので「Raspberry Pi 3」を選択しました。

次にOSを選択します。
使用しているデバイスが64-bit OSに対応していれば一番上のものを選択されると良いかと思いますが、当方が利用しているRaspberry Pi 3 Model B+は32-bit OSの方が安定するため、「Raspberry Pi OS (32-bit)」を選択します。

次にストレージを選択します。
Raspberry Piで使用するmicroSDカードを選択して下さい。

次からはカスタム設定となります。
まずホスト名になりますが、今回は単純に「raspberrypi」とします。

次にローカライズの設定ですが、以下の通り「Tokyo (Japan)」で設定を行います。

次にユーザ名とパスワードになります。
ご自身のお好きなものを設定して下さい。(今回手元の環境ではユーザ名は単に「pihole」としました)

次のWi-Fiについては、今回当方は有線接続をするため設定しません。必要な方はSSIDやパスワード等の情報を入力して下さい。
次のリモートアクセスについてはSSHの有効可を行っておきます。

次のRaspberry Pi Connectについても今回は利用しないため設定しません。
最後にこれまでの設定を確認し、『Write』ボタンを押します。

正常に書き込みが完了すればこの手順は終了です。

Tailscaleの初期設定
Tailscaleのアカウントを持ってない方は先にアカウントを作成しておきます。
スマートフォンやPCを利用し、Googleアカウント等のIDプロバイダを利用しサインアップを行って下さい。

Pi-holeのインストール・設定
先程イメージの作成を行ったmicroSDカードをRaspberry Piに挿入し、起動をして下さい。
Raspberry Piの起動が完了したら、PowerShell等のターミナルを利用して、Raspberry PiにSSHで接続を行います。
$ ssh pihole@raspberrypi接続できたら以下のように、 指定したユーザー名でのセッションが確立できると思います。

接続ができたら、まずパッケージのアップデートを行います。
$ sudo apt update
$ sudo apt upgrade -yアップデートが完了したら、以下コマンドでPi-holeのインストールを行います。
$ curl -sSL https://install.pi-hole.net | bashインストール途中で静的IPの設定有無について確認する画面が出ます。

ルーターのDHCPの設定等でRaspberry Piが固定のローカルIPを使用できるよう設定した後、『Continue』を押して下さい。
UpstreamのDNSプロバイダはお好きなものを選択して下さい。

※Pi-holeは設定で指定されたリストにある広告のみをブロックします。それ以外については、ここで指定したDNSサーバーにリクエストを渡します。(特段好みが無ければGoogleで良いと思います)
その他ロギングに関する設定なども、ご自身の好みに合わせて設定してください。
インストールが完了すると、Pi-holeの管理画面にログインするためのパスワードが表示されると思うので、忘れずにメモしておきます。
インストールが成功していると、http:<Raspberry PiのローカルIP>:80/adminにアクセスすると、以下のような画面が表示されるかと思います。

インストール時にメモしていたパスワードで、ログインを行います。
ログインが完了すると、以下のような画面が表示されると思います。

なお、Pi-holeでブロックするドメインのリストについては、デフォルトで週1で自動更新されるようになっております。
補足
Pi-holeのWeb UIにログインする際のパスワードを変更したい場合は、以下コマンドを実行下さい。
$ sudo pihole setpassword <YOUR_PASSWORD>Tailscaleのインストール・設定
次に、Raspberry PiにTailscaleのインストールを行います。
Raspberry PiにSSHで接続した状態で、以下コマンドを実行して下さい。
$ curl -fsSL https://tailscale.com/install.sh | shインストールが完了したら、Tailscaleクライアントを有効化しますが、今回Raspberry Pi が DNS サーバーであるため、テールネットのDNS設定を自動的に使用しないようにします。
$ sudo tailscale up --accept-dns=false※ tailscale up コマンドを初めて実行すると、ターミナルにURLが表示されます。そのURLをブラウザに貼り付け、先のアカウント作成時に使用したアカウントと同じものでログインしてください。
ログインに成功すると、以下のようになります。

設定ファイルの作成
次に、設定ファイルを作成します。
$ sudo nano /etc/dnsmasq.d/99-tailscale.confファイルが開けたら、以下の設定を記載します。
interface=eth0
interface=tailscale0
no-dhcp-interface=tailscale0※保存して終了は『Ctrl+X → Y → Enter』になります。
設定が完了したら、Pi-holeのリロードを行います。
$ sudo pihole reloaddns確認のため、以下コマンドを実行します。
# Tailscale IPを確認
$ tailscale ip -4
# DNSクエリをテスト
$ nslookup google.com 100.x.x.x結果が返ってこれば成功です。

テールネットのDNSサーバーとしてRaspberry Piを設定
次に、テールネットのDNSサーバーとしてRaspberry Piを設定します。
Tailscaleの管理コンソールの『DNS』に移動し、 『Nameservers』セクションで『Add nameserver』を選択し、『Custom』を選択します。

次に、Raspberry PiのTailscaleのIPアドレスを入力し、『Save』を選択します。

※Exit NodeとしてRaspberry Piを指定したい場合は『Use with exit node』のトグルも有効にして下さい。
設定できたら、『Override DNS servers』のトグルも有効可しておきます。

これで全ての設定が完了です。
確認
Tailscaleのクライアントアプリを利用し、VPN接続を行います。(以下はAndroidデバイスでの接続例)

VPN接続した状態で広告付きのWebサイトにアクセスし、広告が表示されなければ成功です。
最後に
今回は、TailscaleとPi-holeを利用して、プライベートDNS環境を構築してみました。
上記ではTailscaleのテイルネットワークに設定するDNSサーバーをPi-holeとしましたが、ローカルエリアネットワーク内であればルーターのDNSサーバーの設定として、Raspberry PiのローカルIPを指定することでルーターにアクセスする全てのデバイスの広告をブロックすることも可能です。
また、Raspberry PiにインストールしたTailscaleとPi-holeはRaspberry Piの再起動時に自動で立ち上がるようになっています。(以下、確認コマンド)
# Pi-holeの自動起動確認(enabledであれば有効)
$ sudo systemctl is-enabled pihole-FTL
# Tailscaleの自動起動確認(enabledであれば有効)
$ sudo systemctl is-enabled tailscaled参考になりましたら幸いです。

