SSH remote forwardを利用して外部サーバのリクエストをローカルPCに転送する

外部サービスのAPIを利用して何かWEBアプリケーション
を開発しようとしたときにエンドポイントが一箇所しか設定できず、
(というよりだいたいが一箇所なんですが)
しかも、公開されているWEBサーバ上じゃないと使えない

なんてことありますよね。
それだとローカルで開発できない・・・

そんなときはSSH Port remote forword

シナリオ

  1. ユーザが何かしらのアクションをする
  2. それによって外部サービスのサーバから自分のWEBサーバに
    何かしらの通信が発生する
  3. その通信によって、自分の開発しているアプリケーションを
    制御したい

できればローカルで開発を完結させたい

ローカルで開発しようとした場合、
固定IPアドレスを持っていたり、ドメインを取得していない、
セキュリティの問題で、自分のローカルPCをサーバにするわけにいかない、
などなど

手元で開発するのに、ローカルをAPIに参照させることが
できないため、不都合が起きます。

そんなときはSSHのポート転送を利用するとうまくいくかもしれません。
(僕はサーバがAWSで、エンドポイントはそちらを参照させて、
そっちに外部サービスからやってきたHTTPリクエストを
自分のローカルPCのポートに転送させてうまくいきました。)

手順

1. 外部に公開しているサーバを用意する

2. そのサーバの使っていないポート(1024以上)を探す(空いていればどれでもOK)

3. 利用する外部サービスのAPIのエンドポイントを 1のサーバの、2で探したポートを指定してやる

ex) http:example.com:9876

4. 自分のローカルPCの~/.ssh/configを以下のように変数する

5. 自分の開発しているアプリケーションを起動する

単純にWEBサーバであれば、Apacheなんかを立ち上げて、ローカルに
転送したいポートをオープンさせます。この場合、例としてポートは80とします。

6. 5までできたらsshでexample.comにログインする

これで、ssh接続しているサーバのポート9876の通信はローカルの80番に
転送されるようになります。

テストしてみる

sshで接続しているサーバ上で

とか

など、自分自身の9876ポートに通信させます。
自分のPCにその通信が来ていれば成功。

(確認方法は、自分のアプリケーションでリクエスト拾って、何かしらのテキスト返してあげたり
wiresharkなんかでキャプチャすれば、確認できると思います。)

注意

  1. サーバが既に利用しているポートはもちろん使えません。
  2. テストで通信が確認できているのに、肝心の外部サービスからの通信が
    ローカルに転送されてこない場合は、サーバ側のsshの設定で
    外部からの通信の転送を拒否している場合があります。

その場合は、サーバの/etc/config/sshd_config
を確認して、

の記述があるか確認してください。これがないと、外部からの通信は
転送されません。

コマンド一発で上記と同様の動作をさせる

これで

  • -R >> リモートフォワードを有効 80:example.com:9876 でexample.com:9876->localhost:80転送
  • -f >> バックグランドで実行
  • -N >> コマンド実行をしない(ログインだけしてシェルも立ち上げない)

これによって、バックグランドでリモートポートフォワーディングだけを行う
プロセスが作成されます。(開発に便利かも)

自分の80番通信をexample.com:9876に転送したいときは
-Rオプションを-LオプションにすればOK(ローカルフォワーディング)です。

今まで、コード書いて、サーバにあげて、検証して、
またローカルでコード書いて、という苦労がこれで
解消されました。

職場の先輩社員の人が教えてくれました。
機能としては知ってたけど、初めて役に立った気がする。
ありがとうございました。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です