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

31 Dec 2014, 17:05 By mosuke5

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

今日の構成にも近いが、以前のブログ【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 
フィードバック・相談(β)

本記事に対して、執筆者にフィードバックや聞きたいことがあればこちらのフォームからご記入ください。執筆者に問い合わせてみる

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