Cloudflare Tunnel により、rdp.example.com などの Cloudflare に登録済みのドメインを通じてトンネルして自宅の PC にリモートデスクトップ接続できるようにするのがゴール。
https://developers.cloudflare.com/cloudflare-one/connections/connect-networks/use-cases/rdp/#connect-to-rdp-server-with-cloudflared-access
に書かれている手順を実施すればOK
サーバー側の設定
トンネル作成
Create a tunnel より適当な名前でトンネルを作ればよい。
Cloudflared インストール
コマンドプロンプトを管理者権限で実行し、赤枠のコマンドをペーストして実行する事でインストールできる。
次回から自動起動するサービスとしてインストールされる。
cloudflared tunnel login
を実行して一度ログインしておく事で、証明書が作成される。
ちなみにサーバー側は
cloudflared tunnel --hostname rdp.example.com --url rdp://localhost:3389
のようなコマンドを手動で実行する必要はなく、上記のインストールを行うだけでよい。
Public hostname
Add a public hostname より、Public Hostname の設定を追加する。
RDP と localhost:3389 の部分は、今回はローカルの RDP に接続するのでこうしているが、ssh やリバプロなどやりたい事が別であるのであればそれにあわせる事。
Private Network
Public Hostname タブの右横に設定があるが、今回やりたい事では設定が不要。
Split Tunnels
デフォルトでは、Manage Split Tunnels によりプライベートIPが WARP から除去されているので、WARP を経由するよう設定する手順が書かれている記事があるが、今回やりたい事では設定が不要。
SSL/TLS
上記の設定画面で、フレキシブルやフルを選択すること(どちらでもよい)。
「オフ (保護なし)」では「websocket: bad handshake」が発生する
WebSocket
大前提として、WebSocket を有効化しておかないと動作しない。
WAF
その他 WAF などで接続元の ASN をブロックしてしまったりしていないよう確認する事。
クライアント側の設定
Cloudflared インストール
サーバー側と同じ手順で Cloudflared をインストールする事。
トンネリング
残念ながら、rdp.example.com は 80(HTTP), 443(HTTPS) でしか動作しない。
RDP に rdp.example.com や rdp.example.com:3389 を登録して接続できれば便利だが、それはできない。
RDP は TCP の 3389 で接続する必要があるため、クライアント側でも cloudflared による TCP(RDP) のトンネリングが必要になる。
cloudflared access rdp --hostname rdp.example.com --url rdp://localhost:9833
これによりクライアントの localhost:9833 -> rdp.example.com -> サーバー側の 3389 ポートに接続できるようになる。
クライアント側の RDP には localhost:9833 を登録すればよい。
9833 ポートが他のプログラムに利用されている場合、変更する事。