リモート開発 — SSH · Tailscale · VS Code Remote で別のマシンを操る
自宅のデスクトップ / ホームサーバー / クラウドワークステーションをノートPCからシームレスに使う — Tailscale · SSH · VS Code Remote-SSH · tmux の統合セットアップ。
「強力なデスクトップを自宅に置いて出先は身軽に」または「GPU ワークステーションをリモートで使いたい」— 解決策は同じだ。核となるツール:Tailscale(ゼロ設定 VPN)+ SSH + VS Code Remote-SSH + tmux。一度セットアップすれば、カフェにいても自分のデスクトップにいる感覚で作業できる。リモート開発の本質は場所の自由ではなく、環境の一貫性にあると考える — 自宅のデスクトップの計算資源を出先からそのまま使えるからこそ、「出先では非力なノートPC」という制約が消えるためだ。
TL;DR
- Tailscale — NAT/ファイアウォールを貫通するメッシュ VPN。企業 VPN なしにマシンを繋ぐ
- SSH — 認証後のすべての通信
- VS Code Remote-SSH — リモートファイルをローカルのように編集する
- tmux — セッション永続化。接続が切れても作業が残る
- Mosh(任意)— モバイル回線で安定した SSH 代替
前提条件
- 両端に SSH + アカウント + インターネット
- (任意)ドメインや静的 IP 不要 — Tailscale が対応
1. Tailscale のセットアップ
Tailscale は WireGuard ベースのメッシュ VPN だ。各マシンにインストールして同じアカウントにログイン → プライベート IP(100.x.x.x)が割り当てられる。NAT を貫通し、マシン同士が直接接続する。
1.1 インストール
Mac:
brew install --cask tailscaleWindows:
winget install --id tailscale.tailscaleLinux(Ubuntu):
curl -fsSL https://tailscale.com/install.sh | sh1.2 サインイン
各マシンで:
sudo tailscale up # Mac/Linux
# またはトレイの GUI → Loginブラウザが開く → Google/GitHub/Microsoft でサインアップ(Tailscale 無料:100台まで)。
1.3 マシンの IP を確認
tailscale ip -4
# 100.x.x.xまたは admin.tailscale.com で全マシンを確認。
1.4 マシン名(MagicDNS)
管理コンソール → DNS → MagicDNS を有効化する。これで desktop.tail-scale.ts.net のような名前で SSH できる:
ssh me@desktop
# (.tail-scale.ts.net が自動補完される)一度有効化すれば、プライベート IP を意識しなくて済む。以降このガイドでは名前
desktopを使う。
2. SSH の準備
2.1 リモートで SSH を有効化
Mac(リモート):
- システム設定 → 一般 → 共有 → リモートログイン ON
Windows(リモート):
- 設定 → システム → オプション機能 → OpenSSH Server をインストール
- PowerShell(管理者):
Set-Service -Name sshd -StartupType Automatic Start-Service sshd
Linux(リモート):
sudo apt install openssh-server
sudo systemctl enable --now ssh2.2 SSH キーを登録
ローカルの公開鍵をリモートの ~/.ssh/authorized_keys に追加:
# ローカルから
ssh-copy-id me@desktop
# またはリモートで手動:
mkdir -p ~/.ssh && chmod 700 ~/.ssh
echo "ssh-ed25519 AAAA..." >> ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys2.3 接続
ssh me@desktop
# または直接 100.x.x.x へ3. VS Code Remote-SSH
VS Code からリモートのファイルをローカルと同じ操作感で編集できる。
3.1 拡張機能をインストール
VS Code マーケットプレイス:
- Remote - SSH(
ms-vscode-remote.remote-ssh)
または:
code --install-extension ms-vscode-remote.remote-ssh3.2 接続
VS Code コマンドパレット(⌘⇧P / Ctrl+Shift+P)→ Remote-SSH: Connect to Host → me@desktop を入力。
初回接続時にリモートへ VS Code Server をインストールする(約 50MB、1回限り)。2回目以降は瞬時に接続できる。
3.3 使い方
左下に SSH: desktop と表示される。File → Open Folder → リモートの ~/work/repo を開く。拡張機能はリモート側にインストールされる(例:Python 拡張機能はリモートの Python 環境を参照する)。
3.4 推奨拡張機能(リモート)
- ESLint / Prettier
- Python / Pylance
- Docker
- (テーマ/キーマップはローカルに置くとすっきりする)
4. tmux — セッション永続化
SSH が切れても作業が残る:
4.1 インストール(リモート)
# Mac / Linux リモート
brew install tmux # Mac
sudo apt install tmux # Ubuntu4.2 使い方
ssh me@desktop
tmux new -s work # セッション開始
# ...作業...
# Ctrl+B, D → デタッチ(セッションは実行し続ける)
# 後で
ssh me@desktop
tmux attach -t work # 再アタッチ4.3 主要ショートカット
ショートカット(プレフィックス = Ctrl+B) | 動作 |
|---|---|
prefix + D | デタッチ |
prefix + C | 新規ウィンドウ |
prefix + N / P | 次 / 前のウィンドウ |
prefix + % | 縦分割 |
prefix + " | 横分割 |
prefix + 矢印 | ペイン移動 |
prefix + Z | ペインをズーム |
4.4 自動アタッチ
.zshrc(リモート):
if [[ -z "$TMUX" && -n "$SSH_CONNECTION" ]]; then
tmux attach -t main || tmux new -s main
fiSSH で入ると → main セッションに自動アタッチ(なければ作成)。
5. Mosh — モバイル回線向け
ネットワーク切り替え時(5G ↔ Wi-Fi)に SSH が頻繁に切れる場合は Mosh(Mobile Shell)を使う。UDP ベースで、ローカルエコーと自動復旧に対応している。
brew install mosh
# リモート
sudo apt install moshmosh me@desktopSSH で認証後、UDP ポート 60000〜61000 を使用する。Tailscale 経由であれば追加のファイアウォール設定は不要。
6. シナリオ:GPU ワークステーションをリモートで使う
目的:ノートPCからデスクトップ GPU で ML 学習を実行する。
# ノートPCで
ssh me@gpu-workstation
tmux new -s train
# tmux 内で
cd ~/projects/ml
python train.py --epochs 100
# Ctrl+B, D でデタッチ
# ノートPCを閉じてカフェへ移動
# 再接続
ssh me@gpu-workstation
tmux attach -t train
# 学習は継続しているVS Code Remote で編集 + tmux で学習実行。両方同時に動く。
7. セキュリティ
Tailscale ACL(オプション)
デフォルトでは同じアカウントの全マシンが互いに見える状態になる。企業用途と個人用途が混在する場合など:
- 管理コンソール → ACL → JSON ポリシー
- タグベースの権限(
tag:dev、tag:home)
SSH を強化する
リモートの /etc/ssh/sshd_config:
PasswordAuthentication no # キーのみ
PermitRootLogin no
AllowUsers me
sudo systemctl restart sshd1Password SSH エージェント
パスワードマネージャー を参照。Tailscale + 1Password エージェントを組み合わせると、SSH に必要なのは生体認証のみ — パスフレーズ不要。
検証
- 両機で
tailscale status→ 「online」 ssh me@desktop→ 即座にログイン(パスフレーズまたは生体認証1回)- VS Code コマンドパレット → Remote-SSH 接続 → 編集 + 保存 → リモートに反映される
tmux new -s test→ デタッチ →tmux attach -t test→ 状態が保持されているmosh me@desktop→ Wi-Fi を切断してネットワークを切り替える → セッションが自動復旧
トラブルシューティング
Tailscale が接続しない
- 両機で
tailscale upを実行してサインイン済みか確認 - 管理コンソールで両機が「Connected」と表示されているか
- ファイアウォール — Tailscale は 41641/UDP を使用。企業ネットワークはブロックする場合がある(DERP リレーにフォールバック)
ssh: connect to host 100.x.x.x: Connection refused
- リモートで SSH サービスが実行されていない(§2.1 を再確認)
- Windows:
Get-Service sshdが Running か確認
VS Code Remote が遅い
- 初回接続はサーバーをインストールするため遅い — 1回のみ
- インターネット経由の場合(Tailscale Direct が失敗)—
tailscale ping desktopで direct vs DERP を確認
tmux で色がおかしい
.tmux.conf:
set -g default-terminal "screen-256color"
set -ga terminal-overrides ",xterm-256color:Tc"
Mosh が接続しない
UDP 60000〜61000 がブロックされている — 企業ネットワークでよくある。SSH にフォールバックする。Mosh は UDP が必要。
SSH エージェント転送(慎重に使う)
リモートからさらに別のリモートへ SSH する場合は ssh -A。中間ホストが完全に信頼できる場合のみ使うこと — 悪意ある root ユーザーであればエージェントのキーを悪用できる。
参考資料
- Windows 初期設定 / Mac 初期設定 — 前提条件
- Windows git 認証 / パスワードマネージャー — SSH キー管理
- Tailscale(公式)
- VS Code Remote-SSH
- Mosh
更新履歴
- 2026-05-12:初稿。Tailscale · SSH · VS Code Remote · tmux · Mosh + シナリオ · セキュリティ + 6つのトラブルシューティング事例。