LinuxでTailscaleを使ったMesh VPNの構築:ポート開放不要でCGNATを回避し、リモートサーバーに接続する方法

Network tutorial - IT technology blog
Network tutorial - IT technology blog

NATとポートフォワーディングという悩み

ホームラボと3台の商用VPSを半年間運用して、異なるネットワーク間の接続を維持することの難しさを痛感しました。以前は、自宅のマシンにSSH接続するたびに、ルーターのポート開放やDDNSの設定に苦労していました。ポート22を10分間開放しただけで、システムログは世界中からのボットネットによる「訪問」の痕跡でいっぱいになってしまいます。

WireGuardやOpenVPNを手動で構築したことがある方なら、設定ファイルや鍵の管理がいかに大変かよくわかるでしょう。サーバーがプロバイダーのCGNAT(キャリアグレードNAT)配下にある場合はさらに絶望的で、ルーターの設定を変更する権限すらありません。それが、私が個人システムとクライアントのプロジェクトすべてをTailscaleに移行した理由です。

リモート接続手法の比較

なぜMesh VPNが「理想の選択」なのか、代表的な3つの手法を比較してみましょう:

  • ポートフォワーディング + DDNS:伝統的な方法ですがリスクが高いです。ハッカーにポートスキャンを許してしまいます。ルーターがパブリックIPを持っていない場合、この方法はほぼ無力です。
  • 従来のVPN(WireGuardのセルフホスト):暗号化によりセキュリティは良好です。ただし、少なくとも1つのノードが固定IPを持つか、ポートを開放する必要があります。このハブ・アンド-スポーク型のモデルは、負荷が高い時に中心ノードで帯域がボトルネックになりやすいです。
  • Mesh VPN (Tailscale, ZeroTier):デバイス同士が直接接続する(ピアツーピア)。厄介なNATを自動的にバイパスします。データはデバイス間を直接流れるため、同じ仮想ローカルネットワーク内では遅延が1〜5ms程度に抑えられます。

なぜ他のソリューションではなくTailscaleを選んだのか?

TailscaleはWireGuardをベースにしたインテリジェントなオーバーレイ層です。WireGuard의圧倒的なスピードとセキュリティを維持しつつ、面倒な手動設定を排除しています。特にMagicDNS機能には非常に満足しています。100.x.y.zというIPアドレスを覚える代わりに、ssh user@ubuntu-serverと入力するだけで自動的に接続を解決してくれます。

ID管理もシングルサインオン(SSO)のおかげで非常に楽です。GoogleやGitHubのアカウントで直接ログインできます。VPN用のユーザー作成やパスワード管理が不要になり、非常にシンプルです。

LinuxへのTailscaleインストール手順(2分で完了)

Linuxへのインストールは非常にスムーズです。ここではUbuntu 22.04での例を紹介しますが、他のディストリビューションでも同様です。

ステップ1:自動インストールコマンドの実行

公式のスクリプトを使用して、ディストリビューションの自動判別とリポジトリの追加を行います:

curl -fsSL https://tailscale.com/install.sh | sh

ステップ2:アクティベーションと認証

インストールが完了したら、サービスを起動してログイン用URLを取得します:

sudo tailscale up

ターミナルに専用のURLが表示されます。それをコピーしてブラウザに貼り付け、ログインするだけです。すぐに、Linuxマシンが仮想ネットワーク内に表示されます。

ステップ3:ネットワーク内のマシン確認

どのデバイスがオンラインかを確認するには、以下を入力します:

tailscale status

このコマンドで、各ノードの仮想IPとマシン名が詳細に表示されます。これで接続の準備は完了です。

Linuxサーバーをサブネットルーターにする

これは私が頻繁に利用している非常に価値のある機能です。自宅に古いNASやIPカメラなど、Tailscaleを直接インストールできないデバイスがあるとします。その場合、同じLAN内にあるUbuntuマシンをサブネットルーターとして橋渡し役にできます。

まず、LinuxでIP転送(IP Forwarding)を有効にします:

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

次に、ローカルIPレンジを指定してupコマンドを実行します:

sudo tailscale up --advertise-routes=192.168.1.0/24

IPレンジの計算が必要な場合は、toolcraft.app/ja/tools/developer/ip-subnet-calculator などのツールが便利です。CIDRを入力するだけで正確なネットワーク範囲を取得でき、複数拠点を接続する際(site-to-site)の重複を避けられます。

最後に、Web上のAdmin Consoleで対象のLinuxマシンを見つけ、”Edit route settings”から広報したIPレンジを有効にします。これで、外出先のカフェにいても、自宅の192.168.1.50にあるプリンターで簡単に書類を印刷できるようになります。

セキュリティとパフォーマンス最適化の注意点

Tailscaleは非常に強力ですが、実際に運用する際は以下の点に注意してください:

  • ACL (Access Control Lists):デフォルトではネットワーク内の全マシンが相互に見える状態です。ダッシュボードのACL設定ファイルを使用してアクセス権限を制限し、1台のマシンが乗っ取られた際の影響を最小限に抑えましょう。
  • Exit Node:公衆無線LAN(公共Wi-Fi)を使用する際は、Exit Node機能を有効にしましょう。すべてのトラフィックが自前のサーバーを経由するようになり、自宅にいるときと同じように安全にブラウジングできます。
  • DERP接続の確認:Tailscaleは常に直接接続を優先します。ファイアウォールが厳しすぎる場合、中継用のDERPサーバーを経由します。この場合、速度が低下するため、tailscale ping [対象IP]コマンドで接続状態を確認してください。

まとめ

Tailscaleを導入してから、ルーターのポートフォワーディング設定をすべて削除しました。SSHポートをインターネットに晒す必要がなくなったため、サーバー管理が非常に気楽になりました。オフィスと自宅を頻繁に行き来するエンジニアにとって、これは働き方を根本から変えるソリューションです。シンプルさを維持しつつ、WireGuardの厳しいセキュリティ基準も満たしています。

Share: