🎯 はじめに:この記事のスコープ
シリーズ「脱Microsoft・OSS移行」は、ここまで ハードウェア → OS → 開発環境 → データ層 → Microsoft 365 → Google Workspace と積み上げてきました。第 7 回は 「Ubuntu 26.04(Wayland)の開発機を外から触る」 仕上げのフェーズです。
| 本記事の扱う範囲 | 隣接記事 | |
|---|---|---|
| 本記事(第 7 回) | Ubuntu 26.04 (Wayland) を リモート開発サーバーとして運用 / Tailscale + SSH + VS Code Remote SSH + DevContainer / WSL ↔ Windows ネイティブの SSH 鍵問題 / xrdp・Chrome Remote Desktop が Wayland で詰む理由 | Windows ホストへの RDP は L2TP → Tailscale 乗り換えガイド を参照 |
💡 既存の L2TP → Tailscale RDP 移行記事 との違い: あちらは Windows ホストへ mstsc / RDP で繋ぐ前提でしたが、本記事は Linux (Wayland) ホストを対象にします。Wayland では RDP 系プロトコルが軒並み詰む(後述)ため、戦略を「画面転送」から「セッション転送(SSH + VS Code Remote)」へ切り替える必要があります。Tailscale は両方の記事で共通の土台です。
🚫 なぜ「Wayland ホスト + GUI RDP」は詰むのか
Kubuntu 26.04(および GNOME 含む Ubuntu 26.04 全般)は Wayland がデフォルトかつ実質唯一のサポートセッションです。X11 セッションは公式サポート対象外で、追加インストール後もログイン画面の選択肢に出ないケースが多発します。
ここに「画面転送 SaaS / RDP プロトコル」を被せようとすると、ほぼすべてが X11 を前提にしている結果、以下のように軒並み倒れます:
| ツール | 結果 | 理由 |
|---|---|---|
| xrdp | ❌ 不安定 | X11 必須。Wayland ログインセッションと競合してマウスもっさり / アプリ起動不能。ローカルログアウト後に挙動が不定になる |
| Chrome Remote Desktop | ❌ セッション起動失敗 | X11 必須。Wayland 環境で xdpyinfo: unable to open display ":20" エラーで CRD ホストが起動しない |
| xpra(リモート X11) | △ 限定動作 | アプリ単位の転送は可能だがデスクトップ全体は厳しい。Wayland ネイティブアプリは流せない |
| RustDesk | △ 未検証 / 限定的 | Wayland 対応はベータ。マウス位置ズレ・キー入力不安定の報告多数 |
| NoMachine | △ X11 強制 | Wayland セッションでは X11 セッションを別途起動する形になり、結局 xrdp と同様の競合リスク |
| VNC(TigerVNC / x11vnc) | ❌ X11 必須 | x11vnc は名前の通り X11 専用。Wayland 用の wayvnc は KWin との統合がまだ未成熟 |
Wayland が「リモート画面」を嫌う構造的理由
Wayland はセキュリティ設計上、コンポジターのスクリーンバッファに第三者プロセスがアクセスすることを禁止します(X11 では xrandr や Xorg の拡張で外から自由に画面を覗けたのが問題視されていた)。RDP / VNC / CRD はまさにこの「画面バッファを外から読み出す」操作を必要とするため、Wayland コンポジター(KWin / Mutter / wlroots)が明示的に許可した方法でしか流せないのです。
KWin 6 系は org.freedesktop.portal.ScreenCast で画面共有 API を提供していますが、これを使って「ログオフ済みのデスクトップに再ログインする」フルセッション RDP は 2026 年 5 月時点で安定したオープン実装が存在しません。
結論:画面を運ぶのを諦め、セッションを運ぶ
「画面のピクセルを送る」モデルが詰むなら、「開発セッションそのものを送る」モデルに切り替えればよい。これが Tailscale + SSH + VS Code Remote SSH の組み合わせです:
- ターミナル作業 → SSH で十分(ローカル端末から
tmuxセッションにattach) - VS Code(GUI 開発)→ VS Code Remote SSH 拡張 がエディタの UI だけクライアント側でレンダリングし、ファイル I/O・拡張機能・LSP・デバッガはすべてリモート側で実行
- コンテナ作業 → Dev Containers 拡張で Remote SSH 上にさらにコンテナを重ねる
- ブラウザでサーバー確認 → VS Code Remote の ポートフォワードで
localhost:3000がローカル端末で開ける
つまり「Wayland リモートデスクトップ」を求める発想を一度棄てるのが、業務開発機としては圧倒的に楽です。
✅ 結論:Tailscale + SSH + VS Code Remote の三層構成
| 層 | 担当 | 役割 |
|---|---|---|
| L1 ネットワーク | Tailscale(WireGuard) | 二重 NAT 越え自動、ポート開放不要、デバイス単位の ACL |
| L2 セッション | OpenSSH(公開鍵認証) | ターミナル・ファイル転送・ポートフォワード |
| L3 IDE | VS Code Remote SSH + Dev Containers 拡張 | エディタ UI はクライアント、実行は Ubuntu 側。DevContainer もリモートから |
💡 既存の L2TP→Tailscale 記事 の補完関係: Tailscale 自体の設計思想・ACL・Subnet Router・Unattended Mode などの基礎は既存記事に詳しいので、本記事ではそれ前提で Ubuntu 側 sshd の整備 / VS Code Remote SSH の設定 / Windows クライアントから繋ぐときの落とし穴 に絞ります。
🐧 Phase 7-1: Ubuntu 側のセットアップ(リモート受け側)
Tailscale の導入と起動
Ubuntu 26.04 では公式インストールスクリプト一発で入ります(既存記事 同様):
curl -fsSL https://tailscale.com/install.sh | sh
sudo tailscale up
# → ブラウザが開くので Google アカウント等でログイン
# → Tailscale Admin Console にデバイスが現れる
Tailscale IP(CGNAT 帯 100.x.x.x のうちの 1 つ)を確認:
tailscale ip -4
# 例: 100.x.x.x (本記事では <tailscale-ip> と表記)
MagicDNS で IP を覚えなくて済むようにする
Tailscale 管理コンソールで MagicDNS を有効化すると、デバイス名で名前解決できるようになります:
| 設定 | 値 |
|---|---|
| ホスト名(Ubuntu 側) | ubuntu-dev(例。Tailscale Admin Console → Machines で変更可) |
| MagicDNS 名 | ubuntu-dev.<tailnet-name>.ts.net |
これで ssh <user>@ubuntu-dev や ssh <user>@ubuntu-dev.<tailnet-name>.ts.net でも繋がるようになります。IP を引き継ぐ運用が消えるのが地味に大きい効果です。
Unattended Mode(ログオフ中も Tailscale を生かす)
Ubuntu の Tailscale は systemd ユーザーサービスではなく システムサービスとして常駐するため、デフォルトで OS 起動後はログオフ中でも有効です。systemctl status tailscaled で確認:
systemctl status tailscaled
# Active: active (running) since ...
💡 Windows 側だと Unattended Mode を明示的に有効化する必要がありますが(既存記事 L2TP→Tailscale参照)、Linux 側はインストール時点で常時起動が前提です。
OpenSSH サーバーの常時待ち受け化
Ubuntu Desktop には openssh-server がデフォルトで入っていないことがあります。導入と起動:
# インストール(既に入っていれば no-op)
sudo apt update
sudo apt install -y openssh-server
# 起動 + 自動起動有効化
sudo systemctl enable --now ssh
# 26.04 のサービス名は ssh(sshd ではなく)
確認:
systemctl status ssh
# Active: active (running)
ss -tlnp | grep :22
# LISTEN 0 128 *:22 *:*
鍵認証だけにする(パスワード認証を無効化)
Tailscale 経由で来る前提とはいえ、パスワード認証は無効化しておきます。tailscale up --shields-up でデフォルト Drop にしていても、攻撃面は最小化するのが原則:
sudo nano /etc/ssh/sshd_config
以下に書き換え:
PasswordAuthentication no
PubkeyAuthentication yes
PermitRootLogin no
ChallengeResponseAuthentication no
UsePAM yes # Ubuntu のロケール等で必要
⚠️
PermitRootLogin noを最優先で。 root にいきなり SSH させる構成は事故時の影響範囲が違いすぎます。sudo経由で必要な作業は普通のユーザーから走らせる。
再読み込み:
sudo systemctl reload ssh
sleep / suspend の完全無効化(リモート前提なら必須)
Ubuntu 26.04 はデスクトップ用途では一定時間後にサスペンドする設定が入っています。「外から繋ごうとしたら寝ていた」という事故を避けるため、リモート前提の業務開発機ではサスペンドを完全に止めます(第 3 回 § サスペンドの完全無効化で詳述済み):
sudo systemctl mask sleep.target suspend.target hibernate.target hybrid-sleep.target
KDE Plasma の電源管理 GUI 側でも以下を OFF にしておくと安全:
- System Settings → Energy → On Battery Power → Suspend session → Do nothing
- System Settings → Energy → On AC Power → Suspend session → Do nothing
- System Settings → Display → Turn off screen → Never(運用ポリシーによる)
💡 画面ロックは残しておいて OK。 画面ロックは SSH や VS Code Remote の接続を切らない。切れるのは「サスペンド」「ハイバネート」だけ。
💻 Phase 7-2: クライアント側のセットアップ(Windows / Mac / iPhone)
鉄則:Windows から繋ぐなら、Windows ネイティブの鍵を使え
ここが Linux 移行直後のチームで最も踏まれるハマりです。整理しておきます:
| クライアント | 使われる SSH バイナリ | 鍵ファイルの場所 |
|---|---|---|
Windows コマンドプロンプト / PowerShell の ssh | C:\Windows\System32\OpenSSH\ssh.exe | C:\Users\<user>\.ssh\id_ed25519 |
| VS Code Remote SSH(Windows 上の VS Code) | 同上(Windows ネイティブ OpenSSH) | C:\Users\<user>\.ssh\id_ed25519 |
| WSL2 のターミナル | /usr/bin/ssh(WSL 内 OpenSSH) | ~/.ssh/id_ed25519(WSL のホーム) |
WSL の ~/.ssh と Windows の C:\Users\<user>\.ssh は別物 | — | 鍵ファイルも別 |
つまり、WSL ターミナルから ssh が通っても、VS Code Remote SSH は別の鍵を見にいくので失敗します。WSL 上に開発環境を構築していたユーザーは、ここで体感的に「片方は通って片方は落ちる」現象に遭遇しがちです。
結論:Windows から VS Code Remote SSH で Ubuntu に繋ぐなら、PowerShell(cmd でも可)で鍵を作り、その公開鍵を Ubuntu の authorized_keys に登録する。
Windows ネイティブ PowerShell での鍵作成
PowerShell(Windows ターミナル / コマンドプロンプトでも可。WSL ではない)で:
ssh-keygen -t ed25519 -C "<user>@cts-g.jp"
# Enter to accept default path: C:\Users\<user>\.ssh\id_ed25519
# パスフレーズは業務 PC では空でも可(Tailscale + 物理アクセス制御に頼る方針)
# 厳格運用ならパスフレーズ + ssh-agent
# 公開鍵を表示してコピー
type C:\Users\<user>\.ssh\id_ed25519.pub
# → "ssh-ed25519 AAAA... <user>@cts-g.jp" をクリップボードへ
Ubuntu 側の authorized_keys に登録
Ubuntu 側で:
mkdir -p ~/.ssh
chmod 700 ~/.ssh
# Windows からコピーした公開鍵を追記
echo 'ssh-ed25519 AAAA... <user>@cts-g.jp' >> ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys
接続確認(Windows PowerShell から)
ssh <user>@ubuntu-dev.<tailnet-name>.ts.net
# Welcome to Ubuntu 26.04 LTS ... と表示されれば成功
MagicDNS が効くまで Tailscale クライアント側で時間がかかる場合は、暫定で生 Tailscale IP(100.x.x.x)を使えば OK:
ssh <user>@100.x.x.x
Mac クライアント
Mac は素直で、~/.ssh/id_ed25519 と ~/.ssh/config だけ揃っていれば VS Code / ターミナル両方で同じ鍵が使えます。
# Mac ターミナルで
ssh-keygen -t ed25519 -C "<user>@cts-g.jp"
cat ~/.ssh/id_ed25519.pub | pbcopy
# → Ubuntu 側 authorized_keys に追記
iPhone / iPad — ターミナル系アプリは Tailscale 必須
Termius / Blink Shell / Apple の Shellfish などの SSH クライアントから直接 SSH できます。Tailscale クライアントを App Store から入れて、同じ Tailnet に参加させるのがいちばん楽:
- Tailscale アプリ起動 → ログイン → トグル ON
- ターミナルアプリ側のホスト設定で
<user>@ubuntu-dev.<tailnet-name>.ts.netを指定 - 秘密鍵はターミナルアプリ側で生成 → 公開鍵を Ubuntu の
authorized_keysに追記
iPhone から tmux a -t claude できる状態を作れると、出先で「Claude Code が今どこまで進んだか確認する」が可能になります(Claude Code リモートコントロール の発想にも近い使い方)。
🪟 Phase 7-3: VS Code Remote SSH + Dev Container
拡張のインストール
クライアント側(Windows / Mac)の VS Code に以下 2 つを入れます:
| 拡張 ID | 名前 | 役割 |
|---|---|---|
ms-vscode-remote.remote-ssh | Remote - SSH | SSH 越しに VS Code を「リモートホスト」モードで動かす |
ms-vscode-remote.remote-containers | Dev Containers | リモートホスト上で .devcontainer/ を解釈してコンテナを開く |
💡 Remote Development Extension Pack(
ms-vscode-remote.vscode-remote-extensionpack)を入れると上記 2 つ + WSL も一括で入ります。Microsoft のスタックを残す数少ない例外として、VS Code はこの拡張群が脱 Microsoft 後も継続採用ポイント。
~/.ssh/config を整える
Windows なら C:\Users\<user>\.ssh\config、Mac/Linux なら ~/.ssh/config に:
Host ubuntu-dev
HostName ubuntu-dev.<tailnet-name>.ts.net
User <user>
IdentityFile ~/.ssh/id_ed25519
# ServerAliveInterval が無いと NAT 越えセッションが切れがち
ServerAliveInterval 60
ServerAliveCountMax 3
⚠️
HostNameには MagicDNS 名を入れるのが結局いちばん楽。 Tailscale のクライアントが落ちて IP が変わっても、MagicDNS 名は再接続後に同じ名前で解決されます。
接続フロー
- VS Code →
F1→ Remote-SSH: Connect to Host →ubuntu-devを選択 - プラットフォームを聞かれたら Linux を選ぶ(初回のみ)
- 「フォルダーを開く」で Ubuntu 側のパス、例
/home/<user>/Projects/<repo>を指定 - 左下の緑色ステータスバーに
SSH: ubuntu-devが表示されれば成功
これ以降、VS Code 上で開く統合ターミナルは Ubuntu 側の bash、ファイル保存も Ubuntu 側、拡張機能のホストも Ubuntu 側で走ります。クライアント PC はディスプレイとキー入力だけを担当する形になります。
Dev Container を Remote SSH 上で開く
DevContainer のレポジトリ(例 <repo>)を Remote SSH で開いた状態で、F1 → Dev Containers: Reopen in Container:
第 4 回 で構築した DevContainer がそのまま乗ります。ローカル → Ubuntu → コンテナ という 二段リレーになるため、初回コンテナビルドの体感はやや重くなりますが、2 回目以降は Remote SSH のキャッシュが効いて十分実用速度です。
ポートフォワードでブラウザ確認
Ubuntu 側で npm run dev などのローカルサーバーが立ち上がった時、VS Code Remote SSH は 接続中の localhost を自動でポートフォワードします。
- Ubuntu 側で
http://localhost:3000が立つ - クライアント PC のブラウザで
http://localhost:3000を開くと、Ubuntu 側のサーバーが見える - VS Code のターミナル下部「ポート」タブで手動追加・削除も可
💡 これが Splashtop / Chrome Remote Desktop には絶対できない芸当です。**「画面ピクセルではなく IP ネットワークが繋がっている」**ことの本領発揮ポイント。
🧪 Phase 7-4: 検証 — 出先から DevContainer まで通すドライラン
以下のチェックリストを ノート PC を実際に外部ネットワーク(モバイル回線 / カフェ Wi-Fi)に切り替えて実行することを強く推奨します:
引っかかりやすいポイント:
| 症状 | 原因と対処 |
|---|---|
Connection refused | Ubuntu 側 systemctl status ssh を確認。Active でない場合 sudo systemctl enable --now ssh |
Permission denied (publickey) | WSL の鍵を使っていないか確認。Windows ネイティブ PowerShell から ssh -vvv でログを見て、使用された IdentityFile が C:\Users\<user>\.ssh\id_ed25519 か確認 |
| 30 分後に切断 | ~/.ssh/config の ServerAliveInterval 60 漏れ。または Tailscale の DERP 経由になっていて NAT 越えタイムアウトしている。tailscale netcheck で確認 |
| Reopen in Container が失敗 | コンテナ未起動。Ubuntu 側 docker ps で確認。docker compose up -d で起動 |
| サーバー再起動後に Tailscale 圏外 | tailscaled が unit でも enable されていない可能性。sudo systemctl enable tailscaled |
🛡️ Phase 7-5: セキュリティ — 開発機をインターネット化しない
Tailscale + SSH は便利ですが、安易に運用するとオフィス内 LAN ごと外に開いてしまう設計でもあります。最低限の防御を組み合わせます。
1. Tailscale 側の ACL でデバイスを絞る
Tailscale Admin Console → Access Controls で、開発機への SSH ポート(22)を「開発メンバーのデバイスからのみ」許可する ACL を書きます:
{
"acls": [
{
"action": "accept",
"src": ["group:devs"],
"dst": ["tag:dev-host:22"]
}
],
"groups": {
"group:devs": ["<user>@cts-g.jp", "..."]
},
"tagOwners": {
"tag:dev-host": ["group:devs"]
}
}
そのうえで Ubuntu 側にタグ付け:
sudo tailscale up --advertise-tags=tag:dev-host
2. Tailscale 2FA + Device Approval を有効化
- Tailscale Admin Console → Settings → User authentication → 2FA 必須化
- Device approval を ON。新規デバイスが Tailnet に参加するとき手動承認が必要に
これで「個人の Google アカウントが乗っ取られても、Tailnet 加入には別途承認が必要」になり、ゼロトラスト寄りの構成になります。
3. SSH 側のホスト固有設定
/etc/ssh/sshd_config で:
# Tailscale インターフェース経由のみ許可
ListenAddress 100.x.x.x
# rate limit(ブルートフォース対策。実態 Tailscale 上だが念のため)
MaxAuthTries 3
LoginGraceTime 30s
# IPv6 / Tailscale IPv6 を使うなら明示
# ListenAddress fd7a:115c:a1e0::xxxx
ListenAddress を Tailscale IP に絞ると、Ubuntu のオフライン LAN ポートからの SSH すら受け付けなくなるため、業務 PC 側ではローカル管理に必要な経路(USB シリアル / 直接物理アクセス)を残す前提で運用してください。
4. オフィス LAN の Subnet Router 化は慎重に
Tailscale には Subnet Router 機能があり、オフィス LAN 全体を Tailnet から見えるようにできます(既存記事参照)。
しかし、これを有効化すると **「Ubuntu 開発機が踏み台になって社内 NAS や複合機まで到達される」**設計になります。最初は Subnet Router を有効化しないことを推奨。社内 LAN の他機器が必要になったら、必要なホストだけ個別に Tailscale クライアントを入れる方が安全です。
🪤 ハマり集(実機で踏んだもの)
| 症状 | 原因 | 対処 |
|---|---|---|
| WSL からは通るが VS Code Remote SSH は失敗 | VS Code は Windows ネイティブ OpenSSH を使う。WSL の鍵は別物 | Windows ネイティブ PowerShell で ssh-keygen。C:\Users\<user>\.ssh\id_ed25519.pub を Ubuntu の authorized_keys に追記 |
| VS Code Remote SSH 接続後に「フォルダーを開く」がクラッシュ | クライアント側 VS Code と Ubuntu 側 vscode-server のバージョン差 | Ubuntu 側 ~/.vscode-server/ を削除して再接続 |
Reopen in Container で docker-outside-of-docker feature エラー | Ubuntu 26.04(resolute)が feature に未対応 | feature を削除し、post-create.sh で Docker CLI を手動導入(第 4 回 § DevContainer リビルド時のエラー) |
| VS Code Remote 接続中に Ubuntu がサスペンドして 30 分後に切断 | デスクトップデフォルトのサスペンド設定 | systemctl mask sleep.target suspend.target hibernate.target hybrid-sleep.target(第 3 回) |
| 「xrdp で繋いだら GUI がフリーズ・再ログインできなくなった」 | X11 セッションが Wayland と競合 | xrdp / X11 系をアンインストールし、SSH + Remote SSH に統一 |
| Tailscale IP が再起動で変わる気がする | CGNAT IP は基本不変。気のせい / MagicDNS 名で運用すれば気にならない | 接続先には Tailscale IP ではなく MagicDNS 名を使う |
| Tailscale が落ちると VS Code Remote も切れる(当たり前だが) | クライアント側 Tailscale プロセス停止 | 万一に備えてオフィスに行ける距離を維持。本当に重要な作業は普段からチェックポイント/git push を細かく |
| Mac から繋いだら鍵が見つからないと言われる | ~/.ssh/config の IdentityFile がデフォルト名でない / ~/.ssh/known_hosts の権限が古い | chmod 600 ~/.ssh/id_ed25519、~/.ssh/config の IdentityFile ~/.ssh/id_ed25519 を明示 |
📋 リスクと対策表
| リスク | 影響度 | 対策 |
|---|---|---|
| Ubuntu 開発機が物理的に落ちている / 電源 OFF | 高 | UPS で電源バックアップ + BIOS の「電源復旧後の自動 ON」を有効化。リモートからは Wake-on-LAN を別ホスト経由で発火させる構成も検討 |
| Tailscale 障害(DERP / Coordination Server 停止) | 中 | Tailscale の SLA は SaaS としては高めだが、本当に致命的なら冗長化(Headscale を補助で立てる)も検討。普段は気にしない |
公開鍵を authorized_keys に追加しすぎて何が誰の鍵か分からなくなる | 中 | コメント欄に <user>@<device> を必ず付ける。年 1 回棚卸し |
| xrdp / Chrome Remote Desktop が Wayland と競合して GUI 破壊 | 中 | そもそも入れない。誤って入れた場合は完全削除して Wayland セッションを再ログイン |
| 30 分アイドルで SSH 切断 | 低 | ServerAliveInterval 60 を ~/.ssh/config に。tmux で長時間セッションをデタッチ運用 |
| Subnet Router で社内 LAN を露出しすぎ | 中 | デフォルト OFF。必要に応じて Tailscale ACL で接続元・宛先を絞る |
| Tailscale の Google アカウントが乗っ取られる | 高 | 2FA 必須化 + Device Approval。可能なら組織契約に切り替えて SSO ベースに |
| クライアント PC 紛失 | 高 | Tailscale Admin Console から該当デバイスを Disable。SSH 公開鍵は Ubuntu 側の authorized_keys から該当行を削除 |
✅ 第 7 回まとめ
- Wayland ホストに GUI RDP / VNC / CRD は乗らない。X11 必須プロトコルとコンポジターの設計が根本から競合する。Linux 開発機をメインに据えるなら、画面ではなくセッションを運ぶ
- 三層スタックは Tailscale(L1 NW)+ SSH(L2 セッション)+ VS Code Remote SSH(L3 IDE)。これで DevContainer まで含めて外から触れる
- Windows クライアントは PowerShell ネイティブで鍵を作る。WSL の鍵は VS Code Remote SSH 経由では使われないため別物として扱う
- MagicDNS 名で運用する。CGNAT IP を直接書くと管理コストが上がる
- ssh / tailscaled は systemd で常時起動、sleep / suspend は systemctl mask で完全停止。リモート前提なら必須前提
- Tailscale ACL + 2FA + Device Approval をセットで運用。SSH 側は
PasswordAuthentication no/PermitRootLogin no/ListenAddressを Tailscale IP に絞る - xrdp / Chrome Remote Desktop は入れない。誤って入った場合は完全削除して Wayland セッションを救う
- 既存の L2TP → Tailscale RDP 移行ガイド は Windows ホスト、本記事は Linux (Wayland) ホスト という棲み分け
これで脱 Microsoft 後の Linux 開発機を、出先・自宅・iPhone から触れる業務インフラとして成立させられます。
📚 シリーズ記事
| 回 | タイトル | 主題 |
|---|---|---|
| 1 | 総論:脱Microsoft・OSS移行 | 動機・コスト・全体地図 |
| 2 | Windows 11 + Ubuntu デュアルブート構築 | M.2 物理分離・KDE Plasma・GRUB |
| 3 | Ubuntu PC セットアップ | NVIDIA・サスペンド・Howdy・プリンター |
| 4 | Ubuntu 開発環境セットアップ | Docker Engine ネイティブ・DevContainer・Claude Code |
| 5 | Ubuntu データ共有セットアップ | rclone Drive + systemd・QNAP NFS/SMB・Obsidian・AppArmor |
| 6 | Microsoft 365 → Google Workspace 全面移行 | メール・SSO・MFA・MX 切替・OneDrive → Drive |
| 7 | Ubuntu リモート開発セットアップ(本記事) | Tailscale + SSH + VS Code Remote / DevContainer・Wayland ホスト |
| 8 | ActiveReports → Playwright + Scriban 移行(公開予定) | 帳票エンジン置換・バーコード・印刷品質 PDF |
| 9 | コスト削減効果と 1 年運用レビュー(公開予定) | 実績ベースのコスト・運用上のハマりどころ |
🔗 関連リソース
CTS-KB 内の関連記事
- L2TP から Tailscale へ ― 開発者のためのリモートデスクトップ乗り換えガイド — Tailscale の基礎 + Windows ホスト RDP 視点
- Claude Code リモートコントロール:CLI セッションをスマホ・Web から操る — iPhone / iPad から Tailscale + SSH で Claude Code を触る応用
- Ubuntu 開発環境セットアップ — DevContainer の構築・post-create.sh の管理(本記事の前提)
- Ubuntu PC セットアップ — サスペンド完全無効化(リモート前提なら必須)
関連用語
- Wayland — Ubuntu 26.04 デフォルトのディスプレイサーバープロトコル
- X11 — レガシーディスプレイサーバー。xrdp / CRD が前提とする
- DevContainer — VS Code が解釈するコンテナ化された開発環境定義
- NAT — Tailscale が自動越えする家庭・オフィス回線の前提
- KDE Plasma — Kubuntu 26.04 のデフォルトデスクトップ環境
外部リソース
- Tailscale Docs — Linux — Ubuntu 公式インストール手順
- Tailscale Docs — MagicDNS —
<host>.<tailnet>.ts.netの名前解決 - VS Code Docs — Remote Development using SSH — VS Code Remote SSH 公式ドキュメント
- OpenSSH
sshd_configman page — 詳細なオプションリファレンス