クラウド時代に改めて活用するSSHポートフォワーディング

こんにちは。インサイトテクノロジーの松尾です!

パブリッククラウド上のサーバー ( VM ) から、社内ネットワークにある自分の PC や他のサーバーなどへ接続したくなること、よくありますよね!?

とはいえ、当然通常は、Site to Site な VPN でも構成していない限り、パブリッククラウド側から社内のネットワークへ接続することはできません。

本ブログでは、社内の自分の PC からクラウド上のVMへの SSH 接続しか許可されていない場合でも、クラウドから社内のネットワークへアクセスを可能とする方法を紹介します。

SSH ポートフォワーディング(ポート転送)という言葉を聞いたことがある方も多いかもしれません。接続先サーバーが属するネットワーク内の別サーバーにある http サーバーへアクセスしたり、RDP 接続をトンネリングしたりする用途でよく使われていると思いますが、この SSH ポートフォワーディングを活用することで、先述のクラウドから社内へのアクセスも実現できちゃいます。

Windowsで利用する SSH クライアント

SSH ポートフォワーディングを確立するためには SSH クライアントを利用します。一昔前まで、Windows から SSH 接続をするには、Teraterm 等のサードパーティソフトウェアを使うのが普通でした。今では Windows 10 (1803以降) では、OpenSSH クライアントがインストールされており、コマンドプロンプトから SSH コマンドが使えるようになっています。昔から Teraterm を使っていると気づかない人も多いですが、今は SSH クライアントを使うだけなら Tereterm のインストールは不要です。もちろん wsl でも利用することが可能です。今回は wsl を利用します。

使用する SSH 接続

今回使用する SSH 接続は、以下の図にあるように、自分の PC からパブリッククラウド上の VM への SSH 接続のみが許可されていることを想定します。FW ( ファイアウォール ) があるために外から直接社内ネットワークへ入ることはできず、また FW に SSH ( 22 ) 以外の穴を開けてもらうことは通常は簡単ではありません。。

各端末とその IP アドレスは以下の想定です。

  • 社内のPC1:作業PC
  • クラウド上のVM1のIPアドレス ( 192.0.2.1 ) : グローバルIPアドレス。社内のPC1からアクセス可能なIPアドレスです。
  • クラウド上のVM2のプライベートIPアドレス ( 172.31.10.10 ) :プライベートIPアドレス。社内のPC1からは直接このIPアドレスでアクセスすることはできません。AWSだとVPC内で振られるIPアドレスとなります。
  • 社内のPC2:IPアドレス ( 192.168.1.2 ) はローカルIPアドレスです。

本ブログでは、ありがちな使用ケースについて4つ例を挙げて紹介したいと思います。

ポートフォワーディング利用ケース1:ローカル PC からクラウド上の VM 内の HTTP サーバーへ接続


まずは最もオーソドックスな SSH ポートフォワーディングのユースケースをご紹介します。クラウド上の VM1 に HTTP サーバーが起動しており、そこへ社内からアクセスしたいとしますが、ここで、以下のような制約があるとします。

  • クラウド上の VM への接続がセキュリティの設定で SSH のアクセスのみしか許可されていない。

そのため VM1 上の HTTP サーバーへ、HTTP プロトコルを直接使って接続することはできません。このような場合に、自分の PC からクラウド上の VM1 への SSH 接続をトンネルとして利用して HTTP サーバーへ接続することができます。

以下のように記述します。

ssh -L 10080:localhost:80 192.0.2.1

このような SSH 接続により、クラウド上の VM1 ( 192.0.2.1 ) 上にあり、ポート 80 で待ち受けている HTTP サーバへの接続が、自分の PC のポート 10080 を通して可能となります。すなわち、自分の PC 上のブラウザなどから、http://localhost:10080/ などとアクセスすることが可能となります。

ssh -L <local port>:<remote host>:<remote port> <global ip address>
  • <local port> : 作業 PC でマッピングするローカルポート番号
  • <remote host> : ポート転送の接続先のホスト名またはIPアドレス ( クラウド上のVM1でアクセス可能なホスト名やIPアドレスであること、VM1そのものである場合は、localhostと記述します。 )
  • <remote port> : 接続先ポート
  • <global ip address> : SSH接続するホスト名またはIPアドレス ( 作業PCでアクセス可能なホスト名やIPアドレスであること )

Teratermでの設定例

なお、Teratermで実施する際には、通常のSSH接続の手順でクラウド上のVM1への接続を確立した後、SSHポート転送の設定で実行します。

ポートフォワーディング利用ケース2:ローカル PC からクラウド上の別の VM 内の http サーバーへ接続


アクセスしたいサーバー(HTTPサーバー)がSSH接続先のサーバーであれば、<remote host>localhost とすることができます。別のサーバー ( クラウド上のVM2 ) にある場合には、 <remote host>には、クラウド上のVM1から見た、クラウド上のVM2のIPアドレスを設定します。

ssh -L 10080:172.31.10.10:80 192.0.2.1

Teratermを使う場合は、リモート側ホストに 172.31.10.10 を設定します。

同様に、自分の PC 上のブラウザなどから、http://localhost:10080/ などとアクセスすることが可能となります。Webサーバーを転送する以外にも、RDP ポートを転送することで、FWでSSHしか許可されていない場合にも踏み台経由でリモートデスクトップを使う、といったことが可能です。ちなみに RDP ( リモートデスクトップ ) の標準のポートは 3389 です。

ポートフォワーディング利用ケース3:クラウド上の VM から、ローカル PC 上の db サーバーへ接続

次に、逆向きの接続を可能とする、リモートポートフォワーディングを紹介します。イメージとしては以下の図となります。この図のように、社内ネットワークからクラウド側へ対して、外向きのSSHしか許可されていない状況下で、接続先サーバーから、社内の任意のマシンへの接続を可能とします。

リモートポートフォワーディングを実施するには、-L オプションを -R オプションへ変更するだけです。

ssh -R 10080:localhost:80 192.0.2.1

Teratermを使う場合は、”リモートサーバーのポート” の方を使います。
この設定により、クラウド上のVM1での localhost:10080 への接続は、社内のPC1の 80 へ転送されることになります(localhost:10080localhostはクラウド上のVM1のこと)。ポートフォワード設定における localhost は、社内のPC1上のことを意味します。

社内のPC1から、クラウド上のVM1への外向きのSSH接続が許可されているだけで、そこを通して、外部からの接続を実現できることになり、非常に便利ですので、知っていおいて損はありません。

リモートポートフォワーディングの一般的な書式は以下となります。

ssh -R <local port on remote>:<host to connect>:<port to connect> <global ip address>
  • <local port on remote> : SSH接続先で使うポート
  • <host to connect> : ポート転送の接続先のホスト名またはIPアドレス ( 社内のPC1でアクセス可能なホスト名やIPアドレスであること )
  • <port to connect> : 接続先のポート番号
  • <global ip address> : SSH接続するホスト名またはIPアドレス ( 作業PCでアクセス可能なホスト名やIPアドレスであること )

ポートフォワーディング利用ケース4:クラウド上の VM から、社内ネットワーク上の http サーバーへ接続

クラウド上のVM1から、社内のPC2への接続を可能とすることも、同様に可能です。

ssh -R 10080:192.168.1.2:80 192.0.2.1

おわりに

クラウドコンピューティングが普通になり、ssh接続でリモートのマシンを操作することも以前にもまして増えてきたのではないでしょうか?SSH ポートフォワーディングは以前からあるテクニックですが、意外と知らない人も多かったりすることにびっくりします。とても便利ですので、これを機に、どんどん活用していきましょう♪

開発メンバー募集中デス。

インサイトテクノロジーにご興味を持たれたエンジニアの方、ぜひご連絡をお待ちしております♪

関連最新記事

TOP インサイトブログ 開発 クラウド時代に改めて活用するSSHポートフォワーディング

Recruit 採用情報

Contact お問い合わせ

  購入済みの製品サポートはこちら