SSHを制してインフラを制する。ローカルポートフォワードを使いこなす

執筆日:

更新日:

SSHを単なるサーバへのログインのツールとして使っていませんか?
SSHを制する者がインフラを制する、なんていわれることもあります。 SSHにはポートフォワーディングをはじめとしたいろんな使い方があります。 今日は実際にローカルポートフォワーディングを理解しみなさんに使いこなしてもらえるようになっていただこうと思います。

どういうときに必要なの

どういうときにポートフォワーディングが必要なのでしょうか?
ネットワーク的に直接とどかない(ただしサーバを経由すればとどく)環境に直接的に接続したい場面がありませんか? まずは、いくつか活用場面をご紹介します。

プライベートネットワークのAmazon RDSに接続したい

クラウド上でシステムを構築しているとよく遭遇するケースです。 RDS(データベース)をプライベートネットワークに配置しているため、インターネットから直接アクセスできません。 踏み台サーバはあり、踏み台サーバからならデータベースに接続ができますが、GUIのソフトウェアを使いたいなど、ローカルのPCから直接接続したいことがあります。
具体的に図に表すと以下のとおりです。

ssh-portforward-rds

直接的にRDSに接続ができませんが、SSHのポートフォワーディングを使うと、ローカルのPCからたとえばmysqlコマンドなどで接続できるようになります。 もちろん、ネットワークの経路は、踏み台を経由しています。

インターネットに公開していないサーバ上のサービスにアクセスしたい

次のケースは、とあるサーバ上に動かしているソフトウェアにブラウザから接続したいが、そのソフトウェアがインターネットから直接アクセスできるように指定ないケースです。 下図ではGrafanaというツールにしていますが、なんのソフトウェアでも構わず、ElasticSearchでもいいし、ApacheのようなWebサーバでも構いません。重要なのは、対象のサーバからlocalhostとして接続できるが、外部ネットワークからは接続できない場合を想定しています。

ssh-portforward-grafana

環境と実現したいこと

では、上のようなことがどのように実現できるのか?
例では、インターネット上にあるさくらのVPSの上に仮想マシンでWebサーバを立ち上げた、ということにしておきます。 実現したいことは、VPSのサーバ上に立ち上がっている仮想マシンのWebサーバに、ローカルのPCのブラウザからアクセスするというものです。

ssh-portforward-example

ローカルPCからexample.jp(VPSのサーバ)へはSSHできる状態です。

[local pc] $ ssh [email protected] 
ログイン可能

また、仮想サーバ上のWebサーバのポート番号は80でVPSのホストサーバからはWebサーバへ接続できる状態です。
VPSのホストからcurlを使って仮想サーバの80番ポートにリクエストを投げると、Hello Worldが返ってきます。

[example.jp] $ curl 192.168.33.10
<html><body><h1>Hello World! Virtual Web Server</h1>
</body></html> 

ローカルポートフォワードの実行

しかし、この状態では、仮想マシン上のWebサーバにたいしてローカルPCから直接はアクセスできません。 そこで、SSHのローカルポートフォワーディングの出番です。ローカルPCから以下を実行してみます。
以下のコマンドは、
ローカルPCのポート8888での接続はexample.jpからみて「192.168.33.10のポート80」に飛ばす
と解釈するとわかりやすいです。

[local pc] $ ssh -L8888:192.168.33.10:80 [email protected] 

上を実行すると、いつもどおりSSHでログインした状態になります。 「セッションを切らずに」、ブラウザからhttp://localhost:8888にアクセスするとなんと、ローカルホストにつないだはずが、example.jp上の仮想Webサーバのhtmlが帰ってくるのがわかります。

ssh-portforward-access

RDSの例の場合

上の例はあまり実用的ではないので、AWS RDSの例も考えてみましょう。
以下の条件だとするとこうできます

ssh-portforward-rds-2

次のようにSSH接続していきます。こう解釈するとわかりやすいです。
ローカルPCのポート8888での接続はfumidai.example.jpからみて「xxxx.rds.amazonaws.comのポート3306」に飛ばす

[local pc] $ ssh -L8888:xxxx.rds.amazonaws.com:3306 [email protected] 

SSHセッションは維持したまま、別ターミナルでmysql接続していきます。

[local pc] $ mysql -u user -p -H 127.0.0.1:8888

セキュリティはどうなの?

ローカルポートフォワーディングのSSHコマンドで、ローカルPCからリモートホスト(example.jp)までトンネルをはっています。そのトンネルの中をhttp通信やmysqlの通信を流しています。そのため、セキュリティ的にも安心できます。

最後に

SSHのローカルポートフォワーディングが普段の業務の中で役立つ場面がでてきましたか?
SSHは他にもたくさんのことができ、ポートフォワードだけみても他にも「リモートポートフォワード」や「ダイナミックポートフォワード」などがあります。SSHに関しては、下記の書籍がおすすめです。興味持った方は書籍などを参考にしながらSSHについて理解を深めていくととてもいいと思います。

OpenSSH[実践]入門 (Software Design plus)
OpenSSH[実践]入門 (Software Design plus)
posted with amazlet at 19.12.28
川本 安武
技術評論社
売り上げランキング: 322,977

その他の参考情報

SSHポートフォワードを通してhttps接続をするときの注意点

あわせてこちらの記事をご覧頂いている方がおおいです。

多段SSHについて

今日の構成にも近いが、以前のブログ【VPS1台でインフラ勉強】HAProxyでロードバランサーを構築で、VPSのホストサーバ上に仮想でさらにいつくかのサーバを立てました。 仮想のサーバにアクセスするには、ホストサーバにアクセスしてから更にSSHをしなければなりませんでした。 多段SSHの設定をして、一回のSSH接続で仮想サーバにアクセスすることもできます。 以下の図で言うと、web10, web11(192.168.33.10/11)に一発でSSHできるようになるわけです。

ssh

設定のサンプルは下記のとおりです。クライアントPC側に以下の設定をすることで完了します。

$ vim ~/.ssh/config
host gateway
    HostName xxxxx.xxx
    User username

Host web10
    HostName 192.168.33.10
    User vagrant
    ProxyCommand ssh -W %h:%p gateway

Host web11
    HostName 192.168.33.11
    User vagrant
    ProxyCommand ssh -W %h:%p gateway

##これで以下で接続可能
$ ssh web10
$ ssh web11 
記事の内容に関連した相談、仕事依頼したい New

記事の内容やクラウドネイティブ技術に関する相談、仕事依頼を開始しました。
仕事依頼、相談をしてみる

フィードバック

本記事に対して、フィードバックあればこちらのフォームからご記入ください。
記事の内容にフィードバックしてみる

このエントリーをはてなブックマークに追加