devAlice
← Multi-OS

リモート開発 — 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

  1. Tailscale — NAT/ファイアウォールを貫通するメッシュ VPN。企業 VPN なしにマシンを繋ぐ
  2. SSH — 認証後のすべての通信
  3. VS Code Remote-SSH — リモートファイルをローカルのように編集する
  4. tmux — セッション永続化。接続が切れても作業が残る
  5. Mosh(任意)— モバイル回線で安定した SSH 代替

前提条件

  • 両端に SSH + アカウント + インターネット
  • (任意)ドメインや静的 IP 不要 — Tailscale が対応

1. Tailscale のセットアップ

Tailscale は WireGuard ベースのメッシュ VPN だ。各マシンにインストールして同じアカウントにログイン → プライベート IP(100.x.x.x)が割り当てられる。NAT を貫通し、マシン同士が直接接続する。

1.1 インストール

Mac

brew install --cask tailscale

Windows

winget install --id tailscale.tailscale

Linux(Ubuntu)

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

1.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 ssh

2.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_keys

2.3 接続

ssh me@desktop
# または直接 100.x.x.x へ

3. VS Code Remote-SSH

VS Code からリモートのファイルをローカルと同じ操作感で編集できる。

3.1 拡張機能をインストール

VS Code マーケットプレイス:

  • Remote - SSHms-vscode-remote.remote-ssh

または:

code --install-extension ms-vscode-remote.remote-ssh

3.2 接続

VS Code コマンドパレット(⌘⇧P / Ctrl+Shift+P)→ Remote-SSH: Connect to Hostme@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   # Ubuntu

4.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
fi

SSH で入ると → main セッションに自動アタッチ(なければ作成)。

5. Mosh — モバイル回線向け

ネットワーク切り替え時(5G ↔ Wi-Fi)に SSH が頻繁に切れる場合は Mosh(Mobile Shell)を使う。UDP ベースで、ローカルエコーと自動復旧に対応している。

brew install mosh
# リモート
sudo apt install mosh
mosh me@desktop

SSH で認証後、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:devtag:home

SSH を強化する

リモートの /etc/ssh/sshd_config

PasswordAuthentication no       # キーのみ
PermitRootLogin no
AllowUsers me
sudo systemctl restart sshd

1Password SSH エージェント

パスワードマネージャー を参照。Tailscale + 1Password エージェントを組み合わせると、SSH に必要なのは生体認証のみ — パスフレーズ不要。

検証

  1. 両機で tailscale status → 「online」
  2. ssh me@desktop → 即座にログイン(パスフレーズまたは生体認証1回)
  3. VS Code コマンドパレット → Remote-SSH 接続 → 編集 + 保存 → リモートに反映される
  4. tmux new -s test → デタッチ → tmux attach -t test → 状態が保持されている
  5. 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 ユーザーであればエージェントのキーを悪用できる。

参考資料

更新履歴

  • 2026-05-12:初稿。Tailscale · SSH · VS Code Remote · tmux · Mosh + シナリオ · セキュリティ + 6つのトラブルシューティング事例。