SSH Reverse Tunnel

Cloud Relay

社内NW変更ゼロで、クラウドから社内APIへ安全にアクセス

🌐 Outbound SSH のみ
🔧 社内NW変更不要
既存API変更不要

なぜ Cloud Relay が必要なのか

🏢

社内APIをクラウドから呼びたい

社内のSpring Boot APIをクラウドサーバから利用したいが、社内NWは外部からのインバウンド接続を許可していない。

🚫

NW設定を変更できない

ファイアウォールやルーターの設定変更は、権限・運用ルール上困難。VPNも同様。

Outbound SSH は通る

社内サーバから外部への SSH (port 22) は許可されている。この唯一の出口を利用する。

システム全体構成

インターネット
👤
外部クライアント
ブラウザ / APIクライアント
HTTPS
☁️ クラウドサーバ
🔀
Nginx
リバースプロキシ (443)
proxy_pass
🚇
localhost:8888
トンネルポート
🔑
sshd
SSH サーバ (22)
SSH リバーストンネル (暗号化)
← 社内からの Outbound SSH →
🏢 社内ネットワーク
🔄
autossh
自動再接続 (systemd)
localhost
Spring Boot API
:8080
ℹ️ 社内NW設定の変更は一切不要

SSH リバーストンネルとは

1

社内サーバが SSH 接続を開始

社内サーバの autossh がクラウドサーバへ SSH 接続します。これは通常の outbound 通信なので、社内NWの変更は不要です。

autossh -R 8888:localhost:8080 user@cloud
2

クラウド上にトンネルポートが開く

-R 8888:localhost:8080 により、クラウドサーバの localhost:8888 が社内の localhost:8080 に接続されます。

cloud:8888 ⟵ SSH ⟶ onprem:8080
3

Nginx がリクエストを転送

外部クライアントからの HTTPS リクエストを Nginx が受け、proxy_pass でトンネルポートへ転送します。

proxy_pass http://localhost:8888;
4

社内 API がレスポンスを返す

リクエストはトンネル経由で社内 Spring Boot API に到達し、レスポンスが同じ経路で外部クライアントに返されます。

🔒 全経路暗号化

なぜ SSH トンネルを選んだか

項目 SSH リバーストンネル WebSocket 中継 Cloudflare Tunnel
社内NW変更 不要 不要 不要
実装コスト
追加ソフト autossh のみ Bridge Client 実装 cloudflared
既存API変更 不要 不要 不要
外部依存 なし なし Cloudflare
暗号化 SSH (標準) TLS (要設定) TLS (自動)
冗長化 複数トンネル + Nginx アプリ実装 Cloudflare側

多層防御設計

🔑

SSH 鍵認証

  • Ed25519 鍵のみ許可
  • パスワード認証は無効化
  • 鍵は定期ローテーション
👤

専用ユーザー制限

  • tunnel ユーザーは nologin
  • ポート転送のみ許可
  • ForceCommand でシェル無効
🌐

ネットワーク制限

  • GatewayPorts no (localhost のみ)
  • トンネルポートは外部非公開
  • Nginx 経由でアクセス制御
🛡️

Nginx レイヤー

  • TLS 1.2+ 暗号化
  • SSO / API キー認証
  • セキュリティヘッダー付与

本番向け冗長構成

クラウドサーバ
Nginx
upstream plant_api
localhost:8888 primary
localhost:8889 backup
proxy_next_upstream error timeout;
Tunnel 1 (:8888)
Tunnel 2 (:8889)
社内サーバ
ssh-tunnel.service
ssh-tunnel-backup.service
Spring Boot API :8080

フェイルオーバー動作

  1. メイントンネル (:8888) に障害発生
  2. Nginx が proxy_next_upstream でバックアップに切替
  3. バックアップトンネル (:8889) 経由で通信継続
  4. autossh がメイントンネルを自動再接続
  5. 復旧後、Nginx がメインに自動復帰

トンネル稼働状況

SSH トンネル

確認中...

社内 API

確認中...

Nginx Proxy

確認中...

※ ステータスは /api/health エンドポイントへの疎通結果を表示します。API が未構成の場合は「不明」と表示されます。

使用技術

autossh
トンネル自動管理
systemd
サービス管理・自動起動
Nginx
リバースプロキシ・SSL
OpenSSH
暗号化トンネル
Spring Boot
社内 API
Docker
コンテナデプロイ