
こんにちは。プロダクトチームの周です。
古いバージョンのWindows .NET 版API Server ではCloud Gateway という内蔵機能を利用して、オンプレミスのRDB などのデータソースをREST API 化してクラウド上のサーバ経由でインターネットに公開することができましたが、最新版のAPI Server V25 ではJava 版しかリリースされていないため、.NET 版で提供されていたCloud Gateway 機能が利用できなくなりました。本記事ではWindows 標準機能のssh コマンドを利用してCloud Gateway と同等のリバースSSH ポートフォワーディング機能を実現することで、オンプレミスのAPI Server をインターネットに公開する方法を紹介いたします。
検証した環境
オンプレミス側はWindows 11 環境 (ホスト名はwinhost 、ユーザ名はadministrator とします) を使用しました。クラウド側はAWS EC2 AMI のUbuntu Server 24.04 LTS のVM (ホスト名はec2host 、ユーザ名はubuntu とします) を作成して検証しました。
API Serverのインストール
API Server V25 のインストールについては以下の記事もご参照ください。
CData API Server v25.1 :インストールから API 生成・Postman でのデータ取得/更新まで
インストール完了後はブラウザで http://localhost:8080/ でCData API Server にログインできることをご確認ください。
キーペアとファイアウォールの設定
AWS EC2 AMI からUbuntu インスタンスを起動する時に、SSH 接続(ログイン)に使用されるキーペアを選択または作成する必要がありますが、リバースSSH ポートフォワーディングを利用する場合も、このキーペアのPEMファイル(例:ssh.pem)を使用します。

また、API Server をインターネットに公開する際、インバウンドトラフィックのポート(例:8080)を開けるために、セキュリティグループのインバウンドルールを作成しておく必要があります。

Ubuntu側のファイアウォールが利用されている場合は、同じようにインバウンドトラフィックのポート(例:8080)を開けておきます。
ubuntu@ec2host% sudo ufw allow 8080/tcp
sshd の設定
Ubuntu側のsshd はデフォルトではポートフォワーディングを許可していないため、以下のように /etc/ssh/sshd_config ファイルを編集した上、sshd サービスを再起動します。
ubuntu@ec2host% sudo vi /etc/ssh/sshd_config
(「#AllowTcpForwarding yes」となっている行を「AllowTcpForwarding yes」に変更)
(「#GatewayPort no」となっている行を「GatewayPort yes」に変更)
ubuntu@ec2host% sudo systemctl restart sshd
リバースSSH ポートフォワーディングのテスト
EC2 のUbuntu インスタンスで選択されているキーペアのプライベートキーファイル(例:ssh.pem)をWindows環境にコピーし、コマンドプロンプトから下記コマンドを実行すると、パスワードなしでEC2 上のUbuntu にssh 接続できることを確認します。
ssh -i ssh.pem -R 8080:localhost:8080 ubuntu@ec2host

「WARNING: UNPROTECTED PRIVATE KEY FILE! Permissions for 'ssh.pem' are too open.」というエラーがでた場合は、プライベートキーファイル(例:ssh.pem)へのアクセス許可を編集し、自分と管理者グループ(例:Administrators)のみに限定します。


そして、ブラウザでhttp://ec2host:8080/ を開くと、Windows 環境のhttp://localhost:8080/ で稼働中のCData API Server にアクセスできることを確認します。

SSH 自動接続用のバッチファイル
SSH セッションの自動接続用のバッチファイル(例:CloudGateway.bat)を以下のような内容で作成します。
@echo off
:loop
echo [%date% %time%] Starting SSH reverse port forwarding tunnel...
ssh -N -i C:\Test\ssh.pem -R 8080:localhost:8080 ubuntu@ec2host -o ServerAliveInterval=60
echo [%date% %time%] SSH session closed. Reconnecting in 10 seconds...
timeout /t 10
goto loop
コマンドプロンプトから該当バッチファイルを実行して、SSHリバースポートフォワーディングの接続に成功すること、そして、http://ec2host:8080 をブラウザからアクセスすると、API Serverにアクセスできることをご確認ください。
タスクスケジューラの設定
SSH セッションの自動接続用のバッチファイルを以下の手順でタスクスケジューラに登録します。
Windowsスタートメニューから「タスク スケジューラ」を検索して開きます。
「タスクの作成」をクリックします。

【全般】タブ
「名前」: 例えば「Auto Reverse SSH」など分かりやすい名前を付けます。
「タスクの実行時に使うユーザーアカウント」を指定します。
「ユーザーがログオンしているかどうかにかかわらず実行する」を選択します。
「最上位の特権で実行する」にチェックを入れます。

【トリガー】タブ
「新規」をクリックし、「タスクの開始」を「スタートアップ時」に設定します。

【操作】タブ
「新規」をクリックし、「操作」は「プログラムの開始」のままにし、「プログラム/スクリプト」に1で作成したバッチファイル(例:CloudGateway.bat)を指定します。

【条件】タブ
「ネットワーク」セクションの「次のネットワーク接続が使用可能な場合のみタスクを開始する」にチェックを入れ、任意の接続を選択します。

【設定】タブ
「タスクを停止するまでの時間」のチェックを外します。

「OK」を押してタスクを保存します。
パスワードを求められたら、Windowsのログオンパスワードを入力します。
最後にタスクを実行します。

http://ec2host:8080 をブラウザからアクセスすると、API Serverにアクセスできることをご確認ください。
おわりに
本記事ではWindows 標準機能のssh コマンドを利用してCloud Gateway と同等のリバースSSH ポートフォワーディング機能を実現することで、オンプレミスのAPI Server をインターネットに公開する方法を紹介いたしました。今回ご紹介したAPI Server は 30 日間のトライアル利用が可能ですので、是非お試しください!
https://jp.cdata.com/apiserver/