SSH ポートフォワーディングで EC2 Windows インスタンスに安全にアクセスする
プライベートサブネット内の EC2 Windows インスタンスに SSH 踏み台ホスト経由でアクセスし、RDP をパブリックインターネットに公開しない方法を解説します。
EC2 Windows インスタンスをプライベートサブネットに配置し、パブリックサブネット内の踏み台ホストを経由してアクセスする構成は、インスタンスを直接インターネットに公開せずにリモートデスクトップ接続を保護する一般的な方法です。
この方法で SSH により暗号化されるのは、クライアントと踏み台ホスト間の接続のみです。踏み台ホストと EC2 Windows インスタンスの間は SSH トンネルの対象外です。
全体のアーキテクチャは以下の図の通りです。クライアントはパブリックサブネット内の踏み台ホストへ SSH で接続し、そのセッションを通じて、インターネットゲートウェイへのルートを持たないプライベートサブネット内の Windows インスタンスへ RDP 通信が転送されます。SSH による暗号化は踏み台ホストまでで終わるため、VPC 内で転送される区間は通常の RDP 通信として流れます。
バックエンドの構築
VPC
対象の VPC 内にプライベートサブネットを作成します。適切なサブネットがすでに存在する場合は、この手順を省略できます。

ルートテーブルを作成し、プライベートサブネットに関連付けます。

このルートテーブルからインターネットゲートウェイが除外されていることを必ず確認してください。含まれていると、そのサブネットが実質的にパブリックサブネットになってしまいます。

EC2 Windows インスタンスにインターネットアクセスが必要な場合は、パブリックサブネットに NAT ゲートウェイを作成し、ルートテーブルに関連付けます。
NAT ゲートウェイの利用には追加料金がかかります。


SSH 踏み台ホスト
- 踏み台ホストとして使用する EC2 インスタンスをパブリックサブネットに起動する。
- セキュリティグループを設定し、ポート 22(SSH)と 3389(RDP)へのインバウンドトラフィックを許可する。
Elastic IP(EIP)を割り当てると、踏み台ホストの接続先を固定できます。
EC2 Windows インスタンス
- EC2 Windows インスタンスをプライベートサブネットに起動する。
- EC2 ダッシュボードの
Get Windows Passwordを使って、リモートデスクトップの認証情報を取得する。 - セキュリティグループを設定し、ポート 22 および 3389 へのインバウンドトラフィックを踏み台ホストからのみ許可する。

接続のテスト
ローカルのターミナルで以下のコマンドを実行し、EC2 Windows インスタンスへの接続を確立します。
ssh -i <YOUR_PRIVATE_KEY> -L 13389:<YOUR_EC2_WINDOWS_IP>:3389 ec2-user@<YOUR_SSH_BASTION_IP>このコマンドは、ローカルポート 13389 宛てのトラフィックを、踏み台ホスト経由でプライベートサブネット内の EC2 Windows インスタンスへ転送します。その後、localhost:13389 に接続すると、リモートデスクトップセッションを開始できます。


まとめ
EC2 Windows インスタンスをインターネットゲートウェイへのルートがないプライベートサブネットに配置し、パブリックサブネット内の SSH 踏み台ホスト経由でアクセスすることで、RDP をパブリックインターネットに公開せずに済みます。この構成では、プライベートインスタンス側のセキュリティグループが重要です。ポート 22 と 3389 へのアクセスを広い CIDR 範囲から許可せず、踏み台ホストからのみに制限します。
ssh -L 13389:<EC2_WINDOWS_IP>:3389 を使って RDP セッションを踏み台ホスト経由でトンネリングすると、クライアントマシンの localhost:13389 から、VPC の外部から直接アクセスできないインスタンスへ接続できます。
ただし、SSH トンネルの対象はクライアントから踏み台ホストまでの区間だけなので、踏み台ホスト自体を十分に保護する必要があります。セキュリティグループでは、管理者が使用する既知の送信元アドレスだけを許可します。必要に応じて EIP を割り当て、踏み台ホストの接続先を固定してください。
Related posts
Session Manager で EC2 に接続する(SSH 不要)
Systems Manager の Session Manager を使い、SSH キーも踏み台サーバーもポート 22 の開放も不要な状態で EC2 インスタンスにシェルアクセスする方法を解説します。
PhpStorm と Xdebug で AWS EC2 上の PHP をリモートデバッグする
PhpStorm と Xdebug を使って EC2 上の PHP アプリケーションをリモートデバッグする方法を、サーバー側の php.ini の設定から IDE のパスマッピングまで解説します。
EC2 上で Proxy.py を軽量 HTTP プロキシとして動かす
認証機構を持たない Proxy.py を EC2 インスタンス上で動かし、SSH トンネル経由で安全にアクセスします。
Cognito User Pools と OIDC で Slack サインインを実装する
Cognito user pool を OIDC 経由で Slack と連携させ、"Sign in with Slack" を Amplify で Next.js アプリケーションに組み込みます。
Lambda Web Adapter で FastAPI を AWS Lambda にデプロイする
FastAPI で書いた API バックエンドをコンテナ化し、Lambda Web Adapter と AWS CDK を使って単一の Lambda 関数へデプロイします。
