2026/04/12

はじめに

Windows 365 Cloud PC(Windows 11 Enterprise)にCloudflare Tunnelを設定して、外出先からSSH接続できる環境を構築しました。Linux版の情報は多いのですが、Windows版は情報が少なく、想定外のトラブルに何度もハマりました。

この記事では、実際にハマった5つのポイントとその解決策をまとめます。同じ構成を検討している方の参考になれば幸いです。

前提知識: Cloudflare Tunnelの基本的な仕組み(公式ドキュメント)と、PowerShellの基本操作を理解していることを前提としています。Cloudflare Tunnelの基本的な構築手順は前回の記事で紹介しています。

構成

[外出先のMac]
    |
    | ssh cloudpc
    v
[Cloudflare Edge(東京)]
    |
    | Cloudflare Tunnel(QUIC暗号化)
    v
[Windows 365 Cloud PC(Azure Japan East)]
    |--- OpenSSH Server(ポート22)
    |--- cloudflaredサービス

※ ポート開放なし。Cloud PC側からCloudflareへアウトバウンド接続のみ。

ハマったこと1:サービスのImagePathに「tunnel run」がない

何が起きたか

cloudflared service install でWindowsサービスを登録し、Start-Service cloudflared で起動。サービスは「Running」になるのに、cloudflared tunnel info で確認するとアクティブな接続がゼロ。

原因

Windowsサービスのレジストリに登録される実行コマンド(ImagePath)が、トンネルを実行する引数を含んでいませんでした。

# 問題のあるImagePath
"C:\Program Files (x86)\cloudflared\cloudflared.exe"

# 正しいImagePath
"C:\Program Files (x86)\cloudflared\cloudflared.exe" tunnel run

解決策

レジストリを直接修正します。

reg add "HKLM\SYSTEM\CurrentControlSet\Services\cloudflared" /v ImagePath /t REG_EXPAND_SZ /d "\"C:\Program Files (x86)\cloudflared\cloudflared.exe\" tunnel run" /f

cloudflared service install の後に毎回この修正が必要でした。公式ドキュメントにも記載がなく、見落としやすいポイントです。

ハマったこと2:SYSTEMアカウントがconfig.ymlを見つけられない

何が起きたか

手動で cloudflared tunnel run を実行すると正常に接続されるのに、Windowsサービスとして起動するとトンネルが張られない。

原因

WindowsサービスはSYSTEMアカウントで実行されます。手動実行時はログインユーザーのホームディレクトリ(C:\Users\ユーザー名\.cloudflared\)のconfig.ymlを読みますが、SYSTEMアカウントのホームは C:\Windows\System32\config\systemprofile\ です。

# 手動実行時に参照されるパス
C:\Users\ユーザー名\.cloudflared\config.yml

# サービス実行時に参照されるパス
C:\Windows\System32\config\systemprofile\.cloudflared\config.yml

解決策

config.ymlとcredentials-fileをSYSTEMアカウントのホームにコピーします。

cmd /c md C:\Windows\System32\config\systemprofile\.cloudflared
copy config.yml C:\Windows\System32\config\systemprofile\.cloudflared\
copy <トンネルID>.json C:\Windows\System32\config\systemprofile\.cloudflared\

注意: credentials-fileのパスにユーザー名が含まれている場合、config.yml内のパスも修正するか、credentials-fileを C:\Program Files (x86)\cloudflared\ にコピーしてパスを変更する必要があります。

ハマったこと3:PowerShellでドット付きフォルダが作れない

何が起きたか

PowerShellの mkdir.cloudflared フォルダを作成しようとすると、systemprofile.cloudflared という名前(ドットが結合された名前)でフォルダが作成されてしまいました。

# PowerShellで実行 → 間違ったフォルダ名になる
mkdir "C:\Windows\System32\config\systemprofile\.cloudflared"
# 結果: C:\Windows\System32\config\systemprofile.cloudflared(ドットが結合)

原因

PowerShellの mkdirNew-Item)がパスの解釈でドット付きフォルダ名を正しく処理できないケースがあります。

解決策

cmd /c md を使います。コマンドプロンプト経由なら正しくドット付きフォルダが作成されます。

cmd /c md C:\Windows\System32\config\systemprofile\.cloudflared

ここまでの3つだけでも、自力で解決するのに数時間かかるケースがあります。当社ではCloudflare Tunnelの導入から運用まで一貫してサポートしています。設定でお困りの方はお気軽にご相談ください

ハマったこと4:日本語ユーザー名でSSH認証が通らない

何が起きたか

Azure AD連携のWindows 365 Cloud PCでは、ユーザー名がAzure ADの表示名から自動設定されます。日本語表示名の場合、Windowsユーザー名も日本語(例:高橋寿昌)になります。

このユーザー名でSSH接続を試みると、パスワード認証も公開鍵認証も通りませんでした。

# すべて認証失敗
ssh "高橋寿昌"@cloudpc.example.com
ssh "[email protected]"@cloudpc.example.com
ssh "azuread\高橋寿昌"@cloudpc.example.com

原因

OpenSSH for Windowsが日本語ユーザー名のパス解決(ホームディレクトリ、authorized_keysの参照等)で問題を起こしている可能性があります。SSHクライアント側でもマルチバイト文字のエンコーディングが一致しないケースがあります。

解決策

英語名のローカルユーザーを作成して、そちらでSSH接続します。

net user cloudadmin <パスワード> /add
net localgroup Administrators cloudadmin /add

Azure ADユーザーでのRDP接続は問題なく動作するので、SSHは cloudadmin、RDPは Azure ADアカウントという使い分けになります。

ハマったこと5:サービスの停止が終わらない

何が起きたか

設定を変更してサービスを再起動しようとすると、Stop-Service cloudflared が延々と「Waiting for service to stop…」を繰り返して終わらない。

WARNING: Waiting for service 'Cloudflared agent (cloudflared)' to stop...
WARNING: Waiting for service 'Cloudflared agent (cloudflared)' to stop...
WARNING: Waiting for service 'Cloudflared agent (cloudflared)' to stop...
(以下、延々と続く)

原因

cloudflaredプロセスがトンネル接続を維持しようとして、正常なシャットダウンシグナルに応答しないことがあります。特にconfig.ymlの設定が不正な状態でサービスを起動した場合に発生しやすいです。

解決策

プロセスを強制終了します。

taskkill /F /IM cloudflared.exe

その後、設定ファイルを修正してからサービスを再起動します。

Start-Service cloudflared

それでもダメな場合は、PCを再起動してからサービスを登録し直します。

Restart-Computer
# 再起動後
cloudflared service install
Start-Service cloudflared

最終的な設定手順まとめ

上記のハマりポイントを踏まえた、正しい設定手順をまとめます。

1. cloudflaredインストール

Invoke-WebRequest -Uri "https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-windows-amd64.msi" -OutFile "$env:TEMP\cloudflared.msi"
Start-Process msiexec.exe -ArgumentList "/i $env:TEMP\cloudflared.msi /quiet" -Wait

2. 認証・トンネル作成・DNS設定

cloudflared tunnel login
cloudflared tunnel create my-tunnel
cloudflared tunnel route dns my-tunnel ssh.example.com

3. config.yml作成

# ユーザーホームに作成
# C:\Users\ユーザー名\.cloudflared\config.yml

tunnel: <トンネルID>
credentials-file: C:\Users\ユーザー名\.cloudflared\<トンネルID>.json

ingress:
  - hostname: ssh.example.com
    service: tcp://localhost:22
  - service: http_status:404

4. SYSTEMアカウント用にファイルをコピー

cmd /c md C:\Windows\System32\config\systemprofile\.cloudflared
copy C:\Users\ユーザー名\.cloudflared\config.yml C:\Windows\System32\config\systemprofile\.cloudflared\
copy C:\Users\ユーザー名\.cloudflared\<トンネルID>.json C:\Windows\System32\config\systemprofile\.cloudflared\

5. サービス登録+ImagePath修正

cloudflared service install
reg add "HKLM\SYSTEM\CurrentControlSet\Services\cloudflared" /v ImagePath /t REG_EXPAND_SZ /d "\"C:\Program Files (x86)\cloudflared\cloudflared.exe\" tunnel run" /f
Start-Service cloudflared

6. SSHユーザー作成(日本語ユーザー名の場合)

net user cloudadmin <パスワード> /add
net localgroup Administrators cloudadmin /add

7. クライアント側SSH config

Host cloudpc
  HostName ssh.example.com
  User cloudadmin
  ProxyCommand cloudflared access tcp --hostname ssh.example.com

パフォーマンス計測

構築後にSSHレイテンシと転送速度を計測しました。

SSH レイテンシ

接続先レイテンシ
VPS(直接接続)約50ms
Cloud PC(Tunnel経由)約400ms
自宅サーバー(Tunnel経由)約750ms

ファイル転送速度(SCP)

サイズアップロードダウンロード
10MB11.4 MB/s13.1 MB/s
1GB47.5 MB/s(380Mbps)65.8 MB/s(527Mbps)
10GB49.7 MB/s(400Mbps)66.5 MB/s(530Mbps)

Cloudflare Tunnel経由でもダウンロード530Mbpsが出ています。10GBのファイルが約2.5分で転送でき、実用上全く問題ない速度です。

まとめ

  • WindowsサービスのImagePathに「tunnel run」を追加するのを忘れない
  • config.ymlはSYSTEMアカウントのホームにもコピーする
  • ドット付きフォルダはcmd /c mdで作成する
  • 日本語ユーザー名ではSSH認証が通らないので英語ローカルユーザーを作成する
  • サービスが止まらないときはtaskkill /Fで強制終了
  • Linux版と違いWindows固有の罠が多いが、一度設定すれば安定して動作する

よくある質問(FAQ)

Q. なぜWindowsサービスはSYSTEMアカウントで実行されるのですか?

Windowsサービスはデフォルトで「Local System」アカウントで実行されます。これはOS起動時にユーザーがログインしていなくてもサービスを動かすためです。そのため、ログインユーザーのホームディレクトリではなく、SYSTEMアカウント専用のプロファイルフォルダを参照します。

Q. Cloudflare Tunnelを使わずにVPNで接続するのとどちらがいいですか?

Cloud PCの場合、パブリックIPが割り当てられないためVPN接続は困難です。Cloudflare Tunnelはアウトバウンド接続のみで動作するため、ファイアウォールやネットワーク制限のある環境でも利用できます。

Q. 手動実行では接続できるのにサービスだと接続できません

本記事のハマりポイント1〜3を順に確認してください。ImagePathの引数不足、config.ymlの配置場所、ドット付きフォルダの作成失敗が主な原因です。

Q. Azure ADユーザー名を英語に変更できますか?

Azure ADの表示名は変更可能ですが、既にプロビジョニング済みのCloud PCのWindowsユーザー名には反映されません。新規にCloud PCをプロビジョニングする場合は、事前にAzure ADの表示名を英語に変更しておくことをおすすめします。

インフラ構築のご相談

「自社でもCloudflare Tunnelを導入したいが、設定でつまずきそう」「Windows環境でのリモートアクセスを構築したい」という方は、ぜひご相談ください。

株式会社ビギニングは、クラウドとオンプレミスを組み合わせたハイブリッドインフラの構築を支援しています。

  • Windows 365 Cloud PCのセットアップ・運用
  • Cloudflare Tunnelによるセキュアなリモートアクセス
  • 社内サーバーのクラウド移行・コスト最適化

お気軽にご相談ください。

お問い合わせはこちら