Tailscale VPNで外から安全にアクセスする

前回の記事の続き?です。

前回、大学時代に使っていたDellのPCをLinuxに変更しました。

その時の記事はこちら↓

ここから、VPNで接続したいよねって思いVPNを調査したところTailscaleという超簡単なVPNを見つけたので記録に残した。
本記事は僕が行った手順で記述しているが、言語化が不得意なためAIに力を借りたよ。

調査内容も、全て目を通しているので一応正しいと思っています。(僕が間違えてたらすいません。)

VPNの2種類を整理する

SurfsharkやNordVPNのような「IP秘匿サービス」を思い浮かべるかもしれないが、今回使いたいのはそれとは目的が違うVPN

種類目的イメージ
商用VPN(Surfshark等)IPアドレスの秘匿、地域制限の回避変装して街を歩く
Tailscale自分のデバイス同士をプライベートにつなぐ自分の部屋同士を秘密の通路でつなぐ

Tailscaleは後者。自宅にいなくても、カフェから自宅サーバーにまるで隣にあるかのようにアクセスできるようにするのが目的。


Tailscaleの仕組み

  • WireGuardベースのメッシュ型VPN
  • 中央サーバーを経由せず、デバイス同士がP2Pで直接通信するため高速
  • インストールすると各デバイスに 100.x.y.z という専用のIPアドレスが付与される
  • この専用IP宛ての通信だけが暗号化トンネルを通る。普段のネット通信には影響しない

つまり、PCからサーバーの Tailscale IP にアクセスすれば暗号化された安全な経路を通り、通常のWebブラウジングはいつも通り。全通信を迂回させる商用VPNとはここが違う


導入手順

サーバー側(Ubuntu)

curl -fsSL <https://tailscale.com/install.sh> | sh
sudo tailscale up
tailscale status

tailscale up を実行するとログイン用のURLが表示されるので、ブラウザで開いて認証する。

クライアント側(Mac / Windows / スマホ)

公式サイトまたはApp Storeからアプリをインストールして、同じアカウントでログインするだけ

これで、サーバーとクライアントが同じ Tailscale ネットワーク(tailnet)に入る。


おすすめの追加設定

MagicDNS

管理画面(login.tailscale.com/admin/dns)でMagicDNSを有効にすると、IPの代わりにホスト名でアクセスできるようになる。

Tailscale Funnel(一時的なWeb公開)

開発中のアプリを一時的に外部に見せたい場合:

sudo tailscale funnel 3000

Tailscaleを入れていない人でもブラウザでアクセスできるURLが発行される。

止めたい時は:

sudo tailscale funnel --reset

ただしFunnelはHTTPS(443)のみで帯域制限もあるため、数人に見せる程度の用途向き。本格的な公開にはCloudflare TunnelやVPSへの移管を検討する。


SSH接続をTailscale経由に切り替える

Tailscaleを導入したら、SSHの接続先をローカルIPからTailscale IPに変更する。

ssh <ユーザー名>@<サーバーのTailscale IP>

これで、自宅の外からでもサーバーにSSH接続できるようになる。

ルーターのポート開放は不要で、Tailscaleの暗号化トンネルを通るのでセキュリティも高い。


VSCode Remote-SSHとの組み合わせ

Tailscale + VSCode Remote-SSH の組み合わせは非常に快適。

  1. VSCodeに「Remote – SSH」拡張をインストール
  2. Ctrl+Shift+P(Macなら Cmd+Shift+P)→ 「Remote-SSH: Connect to Host」
  3. <ユーザー名>@<サーバーのTailscale IP> を入力
  4. 鍵認証でログイン

接続すると、VSCodeの拡張機能は自動的にローカル用とサーバー用に分かれる

  • ローカル側:テーマ、キーバインドなどUI系
  • サーバー側:Python、Docker、GitLensなど開発系

つまり、手元のPCには「VSCodeとブラウザ」だけあれば開発できる状態になる。

Python、Node.js、Dockerなどのランタイムは全部サーバー側に置けばいい。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA