投稿背景
Webアプリの稼働環境(Cloud)から、データセンターのサーバ(DBやSOAP通信先)を
覗きに行きたいが、Webアプリ環境→データセンターの直接の通信が
禁じられている環境制約の案件に遭遇した
+
大真面目に中継サーバにRESTAPIを用意してそこから中継…というようなことを
議論していたので、投稿を決意。
SSHポートフォワーディングとは
端的に言うと、
中継用サーバを介し、接続元ホストが特定のポートに接続すると、
そのポートの目的地として設定されたリモートホスト(の特定ポート)に接続を中継する機能である。
中継用サーバから見える範囲であれば、接続元ホストからそのリモートホストに直接通信できなくても問題ない。
背景で述べたように、
Webアプリの環境から特定NW、サーバ間の通信が業務要件などにより出来ない場合がある。
そういった場合、中継サーバを立てて通信を中継する必要がある。
SSHポートフォワーディングはその中継を実現する方法の一つである。
サーバの用意
クラウドで適当なサーバを2つ用意します。
- test 踏み台サーバ
- test2 接続したいサーバ、今回のテスト用にApache-Webサーバをインストール済み
セキュリティ設定
接続したいサーバのポート80を踏み台サーバからのみ接続できるようにネットワーク設定。
接続確認
接続したいサーバ= 51.103.218.23:80にcurlコマンド実行。
C:\Users\ryode>curl 51.103.218.23:80
curl: (28) Failed to connect to 51.103.218.23 port 80 after 21032 ms: Couldn't connect to server
SSHポートフォワード
TeraTermを使い、まずSSHで踏み台サーバに接続する。
設定→SSH転送を選択し、ポートフォワードの設定を行う。
以下設定だと、ローカルホストのポート30に接続すれば、踏み台サーバから見える接続したいサーバのポート80に通信が中継される。
その後、ローカルホストのポート30に対してcurlコマンドを実行すると、反応が返ってくる。
(当然ローカルホストの30でWebサーバなど動かしていない。)
C:\Users\ryode>curl localhost:30
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
省略
</html>
SSHポートフォワード コマンド
sshコマンドを使うならこんな感じ。
(ローカルのポート9876にアクセスすると、51.103.218.23:80に接続が中継される。)
PS C:\Users\ryode> ssh -L 9876:51.103.218.23:80 azureuser@51.103.209.170 -i "C:\Users\ryode\.ssh\azure-test.pem"
まとめ
直接接続できないサーバとの通信を目論む際は、
プロキシーだったりSSHポートフォワードなりを使いましょう。
(主要な解決策は上記だと思いますが、何か意見などあればコメント求む)