はじめに
自宅の複数サーバーをTailscaleでつないでいて、Windows + WSL2環境からVS Codeで快適に開発できるよう整備した記録。
Pi Zero 2Wのようなメモリがカツカツなエッジデバイスも対象に含むため、接続先によって方法を使い分ける必要がありました。
同じような構成で詰まっている人の参考になれば。
1. 環境確認 — WSL2とTailscaleの統合
WindowsにTailscaleを入れている場合、WSL2は自動的にWindows側のMagicDNSを参照してくれます。
特に追加設定なしでTailscaleネットワーク上のホスト名が解決できるのが強みです。
WSLはWindowsのTailscale IPを共有する形で動作するので、WSL側を別途ノードとして登録する必要はありません。
確認コマンド
# DNSサーバーの確認
cat /etc/resolv.conf
# → nameserver 10.255.255.254 (Tailscale MagicDNS)
# ホスト名解決テスト
nslookup <hostname>.tail<xxxx>.ts.net
# 疎通確認
ping <tailscale-ip>
2. 接続対象サーバー
| ホスト名 | Tailscale IP | OS / Arch | 用途 |
|---|---|---|---|
| <edge-device> | 100.xx.xx.xx | Debian (aarch64) | エッジデバイス (Pi Zero 2W) |
| <home-server> | 100.xx.xx.xx | Ubuntu (x86_64) | 運用サーバー (自宅) |
3. SSH鍵の設定
鍵はWSL側(Ubuntu-24.04)の既存のものを流用します。
公開鍵の登録
ssh-copy-id を使うにはサーバー側でパスワード認証が有効になっている必要があります。
ssh-copy-id <edge-device>
ssh-copy-id <home-server>
SSH config(~/.ssh/config)
Host <edge-device>
HostName 100.xx.xx.xx
User <username>
Host <home-server>
HostName 100.xx.xx.xx
User <username>
4. Windows側へのSSH鍵・config同期
VS CodeのRemote SSHはWindows側の %USERPROFILE%\.ssh\ を参照します。
WSLで整備したSSH設定をそのままWindowsへコピーして同期させておく必要があります。
# PowerShellで実行
Copy-Item "\\wsl$\Ubuntu-24.04\home\<username>\.ssh\config" "$env:USERPROFILE\.ssh\config"
Copy-Item "\\wsl$\Ubuntu-24.04\home\<username>\.ssh\id_ed25519" "$env:USERPROFILE\.ssh\id_ed25519"
補足: コピーした秘密鍵(
id_ed25519)のパーミッションが広すぎると接続時に警告が出ることがあります。Windows側でもアクセス権を確認しておくと安心です。
5. VS Code 開発環境の使い分け
接続先のスペックに応じて、Remote SSHとSFTPを使い分けています。
自宅サーバー — Remote SSH
スペックが十分なので ms-vscode-remote.remote-ssh 拡張で普通に接続します。特に詰まる要素はないです。
エッジデバイス(Pi Zero 2W)— SFTP
問題:
- メモリ512MBではVS Code Serverが起動できない(メモリ不足)
- Debian aarch64環境でバイナリ不整合によりポート取得に失敗する
Remote SSHはサーバー側でVS Code Server(Nodeベース)を起動する仕組みなので、メモリ512MBのPi Zero 2Wだと詰みます。
aarch64特有のバイナリ問題も重なり、Remote SSHは諦めました。
解決策: Natizyskunk.sftp 拡張で対応。
-
uploadOnSave: trueを設定し、保存時に自動転送 - コマンド実行はWSLのターミナルからSSHで直接行う
「ファイル転送はSFTP、コマンド実行はSSH」という割り切った運用です。リッチな補完や統合ターミナルは使えませんが、スクリプトを書いて実行するくらいなら十分実用になります。
おまけ. CLAUDE.md の共有設定
WindowsとWSLで共通の CLAUDE.md を参照できるよう、WSL側にシンボリックリンクを作成しました。
皆さんはどう管理されているんでしょう。
rm /home/<username>/.claude/CLAUDE.md
ln -s /mnt/c/Users/<username>/.claude/CLAUDE.md /home/<username>/.claude/CLAUDE.md
注意: Linuxはファイル名の大文字・小文字を区別します。リンク先のファイル名が
claude.mdなのかCLAUDE.mdなのか、実際のファイル名と一致させておかないとリンクが機能しません。
まとめ
- WSL2はWindowsのTailscale MagicDNSを自動で参照するため、追加設定なしにホスト名解決ができる
- VS CodeのRemote SSHはWindows側の
~/.ssh/を参照するので、WSLとの同期が必要 - Pi Zero 2WのようなリソースがカツカツなデバイスにはSFTP拡張が現実解
- SSH設定やCLAUDE.mdのような設定ファイルはWindowsをマスターにしてWSLからシンボリックリンクを張ると管理が楽だと判断しました