🔖

RaspberryPi に Tailscale を導入して外出先から自宅ネットワーク環境に VPN 接続する方法

2024/06/12に公開

自宅に常設してある Raspberry Pi に Tailscale をインストールと設定を行い、外出先から自宅ネットワーク環境に VPN アクセスする方法をここに記する。

背景

自宅の Raspberry Pi には Pi-VPN を導入して、外出先から自宅へ VPN 接続していたが、この方法では VPN 用のポートを常時解放する必要があり、接続するためのドメインの動的 IP を定期的に更新しなければならない。ドメインと IP を紐づける更新処理はスクリプトで自動化しているので、メンテナンスの手間はないが、ポート解放には少し抵抗を感じてしまう。そして、最近聴いているエンジニアの Podcast はTailscaleがやたら薦めてくるのもあり、試してみたいと思った。

ちなみに聴いている Podcast はこれ

前提条件

概念

Tailscale とはオープンソースの Wireguard プロトコルを使用したデバイス間の暗号化の point-to-point 接続を可能にする VPN サービスである。Tailscale は開発者や中小企業向けにきめ細かな制御や安価な価格であるため、近年じわじわと人気が出てきた。

構成は至ってシンプル。Raspberry Pi に Tailscale をインストールして、外出先でクライアントデバイスは Tailscale 経由で自宅に VPN 接続する仕組み。自分の Raspberry Pi は既に広告ブロックサービスの Adguard Home をインストール済みのため、VPN の機能と広告ブロック機能両方を備わることになる。

手順

Tailscale セットアップ

Tailscale のアカウントがまだ未作成なら、まずは以下の URL からアカウント作成を行う。

https://login.tailscale.com/start

アカウント作成後に 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 管理コンソールで以下の操作を行う。

  1. 「DNS」タブにアクセスする
  2. 「Nameservers」で Global nameservers を追加する
  3. IP は先刻保存した tailscale ip に設定する
  4. 「Override local DNS」を ON にする

操作サンプル

Raspberry Pi のキーを無期限に設定

Tailscale は定期的にマシンの再認証が必要だが、Raspberry Pi は常時接続するため、認証キーの有効期限を無効にして再認証しない設定を行う。

  1. 管理コンソールの「Machines」ページにアクセスする
  2. 対象の Raspberry Pi を選択して「・・・」をクリックする
  3. 「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 に置き換える

最後に、管理コンソールからサブネットルールを有効にする。

  1. 管理コンソールの「Machines」ページを開く
  2. 対象の Raspberry Pi を選択して「・・・」をクリックする
  3. Edit route settings」 ボタンをクリックする
  4. 設定した 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 を併用しつつ、ネットワーク速度を比較する予定。

参考

Written-By-Human-Not-By-AI-Badge-white

Discussion