RaspberryPi に Tailscale を導入して外出先から自宅ネットワーク環境に VPN 接続する方法
自宅に常設してある Raspberry Pi に Tailscale をインストールと設定を行い、外出先から自宅ネットワーク環境に VPN アクセスする方法をここに記する。
背景
自宅の Raspberry Pi には Pi-VPN を導入して、外出先から自宅へ VPN 接続していたが、この方法では VPN 用のポートを常時解放する必要があり、接続するためのドメインの動的 IP を定期的に更新しなければならない。ドメインと IP を紐づける更新処理はスクリプトで自動化しているので、メンテナンスの手間はないが、ポート解放には少し抵抗を感じてしまう。そして、最近聴いているエンジニアの Podcast はTailscale
がやたら薦めてくるのもあり、試してみたいと思った。
ちなみに聴いている Podcast はこれ
前提条件
- RaspberryPi の初期セットアップが完了している
- Adguard Home か Pi-Holeが導入済み
概念
Tailscale とはオープンソースの Wireguard プロトコルを使用したデバイス間の暗号化の point-to-point 接続を可能にする VPN サービスである。Tailscale は開発者や中小企業向けにきめ細かな制御や安価な価格であるため、近年じわじわと人気が出てきた。
構成は至ってシンプル。Raspberry Pi に Tailscale をインストールして、外出先でクライアントデバイスは Tailscale 経由で自宅に VPN 接続する仕組み。自分の Raspberry Pi は既に広告ブロックサービスの Adguard Home をインストール済みのため、VPN の機能と広告ブロック機能両方を備わることになる。
手順
Tailscale セットアップ
Tailscale のアカウントがまだ未作成なら、まずは以下の URL からアカウント作成を行う。
アカウント作成後に Raspberry Pi でインストールコマンドを実行する。
curl -fsSL https://tailscale.com/install.sh | sh
インストールが完了すると認証する必要があるため、以下のコマンドを実行し、ブラウザで表示される URL をアクセスし、認証作業を完了させる。
sudo tailscale up --accept-dns=false
参考画面
DNS 設定
Tailscale のセットアップが完了した次に、Raspberry Pi を DNS サーバーとして構成する必要がある。まずは Raspberry Pi の Tailscale の IP アドレスを以下のコマンドで取得する。
tailscale ip
取得した IP を控え、Tailscale の Web 管理コンソールで以下の操作を行う。
- 「DNS」タブにアクセスする
- 「Nameservers」で Global nameservers を追加する
- IP は先刻保存した tailscale ip に設定する
- 「Override local DNS」を ON にする
操作サンプル
Raspberry Pi のキーを無期限に設定
Tailscale は定期的にマシンの再認証が必要だが、Raspberry Pi は常時接続するため、認証キーの有効期限を無効にして再認証しない設定を行う。
- 管理コンソールの「Machines」ページにアクセスする
- 対象の Raspberry Pi を選択して「・・・」をクリックする
- 「disable key expiry」をクリックする
操作サンプル
サブネット構成
自宅ネットワークのデバイスにアクセスするために、Raspberry Pi にサブネット ルーターを構成する。
以下のコマンドで IP 転送を有効にする。
echo 'net.ipv4.ip_forward = 1' | sudo tee -a /etc/sysctl.d/99-tailscale.conf
echo 'net.ipv6.conf.all.forwarding = 1' | sudo tee -a /etc/sysctl.d/99-tailscale.conf
sudo sysctl -p /etc/sysctl.d/99-tailscale.conf
構成が完了したら、次のコマンドで tailscale を起動する。
sudo tailscale up --accept-dns=false --accept-routes --advertise-routes=192.168.x.0/24,192.168.y.0/24
192.168.x.0/24
は自分のローカル ネットワーク CIDR に置き換える
最後に、管理コンソールからサブネットルールを有効にする。
- 管理コンソールの「Machines」ページを開く
- 対象の Raspberry Pi を選択して「・・・」をクリックする
- Edit route settings」 ボタンをクリックする
- 設定した subnet routers にチェックをつけて、保存する
操作サンプル
パフォーマンス構成
Linux 6.2 以降のカーネルかつ Tailscale バージョン 1.54 以降を使用する場合は、以下の設定をするとトランスポート層のオフロードを介して UDP スループットが向上を期待できる。
NETDEV=$(ip route show 0/0 | cut -f5 -d' ')
sudo ethtool -K $NETDEV rx-udp-gro-forwarding on rx-gro-list off
クライアント接続
これまでの設定が順調であれば、自分のクライアントデバイス(iOS, Android ...)は Tailscale のアプリをインストールして認証すれば外出先から自宅ネットワークにアクセスでき、広告も遮断される。
そして、以下の画像のような設定をしておくと、自宅の WiFi 以外は自動的に VPN 起動してくれてとても便利である。
まとめ
Raspberry Pi + Adguard Home + Tailscale を組み合わせることで、クライアントデバイスに広告ブロックアプリを導入しなくても簡単に快適なネットワーク環境が実現できた。しかも、自宅ルーターにポート解放は不要のメリットはかなり大きい。しばらくは、Tailscale と Wireguard を併用しつつ、ネットワーク速度を比較する予定。
Discussion