🔥

自宅のサーバーに独自ドメインでアクセス!Raspberry Pi + Pi-hole + Tailscaleで作る快適自宅ネットワーク

に公開

この記事では、Raspberry PiにPi-holeとTailscaleをインストールすることで、自宅のネットワーク内外から、自分で設定したドメイン名を使って自宅のサーバーやデバイスに簡単にアクセスできる環境を構築する方法を解説します。

この構成で何が便利になるの?

  • IPアドレスを覚えなくてOK: 自宅のWebサーバーやNASにアクセスする際、192.168.x.xのようなIPアドレスを覚える必要がなくなります。nas.home.mydomain.com のような分かりやすい名前でアクセスできるようになります。
  • 外出先からも安全にアクセス: Tailscaleを使うことで、VPNのように安全な通信が確保されます。カフェや外出先からでも、安心して自宅のデバイスに接続できます。
  • 広告ブロック機能: Pi-holeは強力な広告ブロッカーとしても機能します。ネットワーク全体で広告をブロックし、快適なブラウジング環境を手に入れられます。

それでは、具体的な構築手順を見ていきましょう。

Raspberry Pi セットアップ

※ここでは家に余っていた Raspberry Pi 3B+ を利用します。

まずは、Raspberry Pi Imager を使って、SDカードにRaspberry Pi OS Liteを書き込みます。有線接続を利用し、SSHで接続するように設定します。

Pi-hole のインストール

次に、DNSサーバーとして機能するPi-holeをインストールします。公式ドキュメント( https://docs.pi-hole.net/main/basic-install/ )を参考に進めます。

Pi-hole の推奨に従って、Raspberry PiのIPアドレスを固定しておきます。どのような方法でも構いませんが、私の場合はルーターのDHCP設定画面から、Raspberry PiのMACアドレスに対してIPアドレスを固定割り当てを設定しました。

以下のコマンドを実行して、インストールを開始します。

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

インストール中にいくつか質問されますが、基本的にはデフォルトのままで問題ありません。

設定が完了すると、管理画面のURLとログインパスワードが表示されるので、メモしておきましょう。
管理画面にログインすると、ダッシュボードでDNSクエリの状況などを確認できます。

次に、独自のドメイン名を解決できるように設定します。

私は ikuma.dev というドメインを所有しているので、そのサブドメインの home.ikuma.dev を自分のデバイス用のドメインとして利用することにします。

メニューの Settings > Local DNS Records から、DNSレコードを設定します。ここでは例として、hello.home.ikuma.dev というドメイン名を 127.0.0.1 (自分自身)に解決するように設定してみます。

設定が反映されているか、同じネットワーク内のPCから確認してみましょう。nslookupコマンドを使います。192.168.0.46 の部分は、Pi-holeをインストールしたRaspberry PiのIPアドレスに置き換えてください。

nslookup -type=A hello.home.ikuma.dev 192.168.0.46
Server:  pi.hole
Address:  192.168.0.46

Name:    hello.home.ikuma.dev
Address:  127.0.0.1

hello.home.ikuma.dev127.0.0.1 に解決されていれば成功です。

Tailscale の設定

次に、外出先など外部のネットワークからでも Pi-hole の DNS を利用するために、Tailscaleを設定します。

https://login.tailscale.com/admin/machines/new-linux から新しいデバイスとしてRaspberry Piを追加します。

次に、Tailscaleのネットワーク内でDNSサーバーとしてPi-holeを使うように設定します。
DNS設定ページ の Nameservers で、 Add nameserver > Custom を選択し、Pi-holeのTailscale IP アドレス( 100.x.y.z のアドレス)を指定します。また、 "Restrict to domain" を有効化し、 *.home.ikuma.dev の名前解決のときだけ Pi-hole を利用するようにします。

https://tailscale.com/kb/1054/dns#restricted-nameservers

railway.internal は筆者の環境固有の設定であり、本記事の主題とは関係ありません。

これで、Tailscaleのネットワーク内のどのデバイスからでも、 *.home.ikuma.dev の名前解決がPi-holeに問い合わせられるはずです。

早速、Tailscaleネットワークに参加済みのWindows PCから試してみます。

> nslookup hello.home.ikuma.dev 100.100.100.100
Server:  magicdns.localhost-tailscale-daemon
Address:  100.100.100.100

DNS request timed out.
    timeout was 2 seconds.

しかし、タイムアウトしてしまいました...。

Pi-holeのダッシュボードを確認すると、警告メッセージが表示されていました。

ignoring query from non-local network 100.82.219.42 (logged only once)

100.x.y.z はTailscaleのネットワークです。どうやら、TailscaleのネットワークからのDNSクエリが無視されているようです。

Pi-holeの Settings > DNS を確認すると、それらしい設定がありました。デフォルトでは、ローカルネットワーク以外からのリクエストを無視する設定になっています。

Tailscaleからのクエリを許可するために、"Permit all origins" を選択します。

These options are dangerous on devices directly connected to the Internet such as cloud instances and are only safe if your Pi-hole is properly firewalled. In a typical at-home setup where your Pi-hole is located within your local network (and you have not forwarded port 53 in your router!) they are safe to use.

"Potentially dangerous options"(潜在的に危険なオプション)と警告されますが、このPi-holeは自宅のネットワークと自分のTailscaleネットワークからしかアクセスできないため、安全です。

設定を保存して、再度試してみます。

> nslookup hello.home.ikuma.dev 100.100.100.100
Server:  magicdns.localhost-tailscale-daemon
Address:  100.100.100.100

Name:    hello.home.ikuma.dev
Address:  127.0.0.1

今度は無事に 127.0.0.1 が返ってきました!

簡単なWebサーバーで試してみる

最後に、実際にWebサーバーに独自ドメインでアクセスできるか試してみましょう。
別のRaspberry PiにTailscaleをインストールし、ポート80番で簡単なWebサーバーを起動します。

mkdir server && cd server
cat <<EOF > index.html
<h1>Hello from Raspberry Pi :)</h1>
EOF
sudo python -m http.server 80

このWebサーバーを起動したRaspberry PiのTailscale IPを、Pi-holeのLocal DNS Recordsに設定します。ここでは web.home.ikuma.dev という名前にしました。

Tailscaleネットワーク内の別のデバイスから、curlコマンドでアクセスできるか確認します。

> curl http://web.home.ikuma.dev/
<h1>Hello from Raspberry Pi :)</h1>

WebサーバーからHTMLが返ってきました!これで、どこからでも web.home.ikuma.dev という名前で自宅のWebサーバーにアクセスできるようになりました。

Discussion