CTS-KB
情シス・社内IT 📚 シリーズ 7/10

Ubuntu リモート開発セットアップ — Tailscale + SSH + VS Code Remote で Wayland ホストに繋ぐ

⏱ 約 17 分で読めます
#脱Microsoft #Ubuntu #リモート開発 #Tailscale #WireGuard #SSH #VS Code Remote #DevContainer #Wayland #X11 #xrdp #Chrome Remote Desktop #情シス

🎯 はじめに:この記事のスコープ

シリーズ「脱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 では xrandrXorg の拡張で外から自由に画面を覗けたのが問題視されていた)。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 の三層構成

✅ 結論:Tailscale + SSH + VS Code Remote の三層構成

オフィス / 自宅

Tailscale Mesh (WireGuard)

外出先 / 自宅

P2P WireGuard

(SSH / Remote SSH / port forward)

NAT 越え不可時のみ

DERP 中継

ノート PC / iPad / iPhone

Coordination Server

+ DERP リレー

Ubuntu 26.04 (Wayland)

開発機

DevContainer

(cts-ec 等)

tmux + Claude Code

担当役割
L1 ネットワークTailscale(WireGuard)二重 NAT 越え自動、ポート開放不要、デバイス単位の ACL
L2 セッションOpenSSH(公開鍵認証)ターミナル・ファイル転送・ポートフォワード
L3 IDEVS 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-devssh <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 の sshC:\Windows\System32\OpenSSH\ssh.exeC:\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-sshRemote - SSHSSH 越しに VS Code を「リモートホスト」モードで動かす
ms-vscode-remote.remote-containersDev Containersリモートホスト上で .devcontainer/ を解釈してコンテナを開く

💡 Remote Development Extension Packms-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 名は再接続後に同じ名前で解決されます。

接続フロー

  1. VS Code → F1Remote-SSH: Connect to Hostubuntu-dev を選択
  2. プラットフォームを聞かれたら Linux を選ぶ(初回のみ)
  3. 「フォルダーを開く」で Ubuntu 側のパス、例 /home/<user>/Projects/<repo> を指定
  4. 左下の緑色ステータスバーに SSH: ubuntu-dev が表示されれば成功

これ以降、VS Code 上で開く統合ターミナルは Ubuntu 側の bash、ファイル保存も Ubuntu 側、拡張機能のホストも Ubuntu 側で走ります。クライアント PC はディスプレイとキー入力だけを担当する形になります。

Dev Container を Remote SSH 上で開く

DevContainer のレポジトリ(例 <repo>)を Remote SSH で開いた状態で、F1Dev Containers: Reopen in Container

Dev Container を Remote SSH 上で開く

Remote SSH

Reopen in Container

ローカル PC

(Windows/Mac)

Ubuntu 26.04

(Wayland Host)

Dev Container

(vscode user)

第 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)に切り替えて実行することを強く推奨します:

🧪 Phase 7-4: 検証 — 出先から DevContainer まで通すドライラン

1. ノート PC を Wi-Fi → モバイル回線に切替

2. Tailscale クライアントが接続済みを確認

3. ssh ubuntu-dev で SSH 接続成功

4. VS Code → Remote-SSH: Connect to ubuntu-dev

5. /home//Projects/ を開く

6. Reopen in Container でコンテナ起動

7. コンテナ内ターミナルで npm test / dotnet test 実行

8. ローカルサーバー (localhost:3000) をクライアント PC のブラウザで開く

9. tmux new -s claude → claude --dangerously-skip-permissions

10. 30 分以上アイドル → SSH 切断されないか確認

引っかかりやすいポイント:

症状原因と対処
Connection refusedUbuntu 側 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/configServerAliveInterval 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-keygenC:\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/configIdentityFile がデフォルト名でない / ~/.ssh/known_hosts の権限が古いchmod 600 ~/.ssh/id_ed25519~/.ssh/configIdentityFile ~/.ssh/id_ed25519 を明示

📋 リスクと対策表

リスク影響度対策
Ubuntu 開発機が物理的に落ちている / 電源 OFFUPS で電源バックアップ + 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移行動機・コスト・全体地図
2Windows 11 + Ubuntu デュアルブート構築M.2 物理分離・KDE Plasma・GRUB
3Ubuntu PC セットアップNVIDIA・サスペンド・Howdy・プリンター
4Ubuntu 開発環境セットアップDocker Engine ネイティブ・DevContainer・Claude Code
5Ubuntu データ共有セットアップrclone Drive + systemd・QNAP NFS/SMB・Obsidian・AppArmor
6Microsoft 365 → Google Workspace 全面移行メール・SSO・MFA・MX 切替・OneDrive → Drive
7Ubuntu リモート開発セットアップ(本記事)Tailscale + SSH + VS Code Remote / DevContainer・Wayland ホスト
8ActiveReports → Playwright + Scriban 移行(公開予定)帳票エンジン置換・バーコード・印刷品質 PDF
9コスト削減効果と 1 年運用レビュー(公開予定)実績ベースのコスト・運用上のハマりどころ

🔗 関連リソース

CTS-KB 内の関連記事

関連用語

  • Wayland — Ubuntu 26.04 デフォルトのディスプレイサーバープロトコル
  • X11 — レガシーディスプレイサーバー。xrdp / CRD が前提とする
  • DevContainer — VS Code が解釈するコンテナ化された開発環境定義
  • NAT — Tailscale が自動越えする家庭・オフィス回線の前提
  • KDE Plasma — Kubuntu 26.04 のデフォルトデスクトップ環境

外部リソース