SSHを単なるサーバへのログインのツールとして使っていませんか?
SSHを制する者がインフラを制する、なんていわれることもあります。
SSHにはポートフォワーディングをはじめとしたいろんな使い方があります。
今日は実際にローカルポートフォワーディングを理解しみなさんに使いこなしてもらえるようになっていただこうと思います。
どういうときに必要なの
どういうときにポートフォワーディングが必要なのでしょうか?
ネットワーク的に直接とどかない(ただしサーバを経由すればとどく)環境に直接的に接続したい場面がありませんか?
まずは、いくつか活用場面をご紹介します。
プライベートネットワークのAmazon RDSに接続したい
クラウド上でシステムを構築しているとよく遭遇するケースです。
RDS(データベース)をプライベートネットワークに配置しているため、インターネットから直接アクセスできません。
踏み台サーバはあり、踏み台サーバからならデータベースに接続ができますが、GUIのソフトウェアを使いたいなど、ローカルのPCから直接接続したいことがあります。
具体的に図に表すと以下のとおりです。
直接的にRDSに接続ができませんが、SSHのポートフォワーディングを使うと、ローカルのPCからたとえばmysqlコマンドなどで接続できるようになります。 もちろん、ネットワークの経路は、踏み台を経由しています。
インターネットに公開していないサーバ上のサービスにアクセスしたい
次のケースは、とあるサーバ上に動かしているソフトウェアにブラウザから接続したいが、そのソフトウェアがインターネットから直接アクセスできるように指定ないケースです。 下図ではGrafanaというツールにしていますが、なんのソフトウェアでも構わず、ElasticSearchでもいいし、ApacheのようなWebサーバでも構いません。重要なのは、対象のサーバからlocalhostとして接続できるが、外部ネットワークからは接続できない場合を想定しています。
環境と実現したいこと
では、上のようなことがどのように実現できるのか?
例では、インターネット上にあるさくらのVPSの上に仮想マシンでWebサーバを立ち上げた、ということにしておきます。
実現したいことは、VPSのサーバ上に立ち上がっている仮想マシンのWebサーバに、ローカルのPCのブラウザからアクセスするというものです。
ローカル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が帰ってくるのがわかります。
RDSの例の場合
上の例はあまり実用的ではないので、AWS RDSの例も考えてみましょう。
以下の条件だとするとこうできます
次のように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について理解を深めていくととてもいいと思います。
技術評論社
売り上げランキング: 322,977
その他の参考情報
SSHポートフォワードを通してhttps接続をするときの注意点
あわせてこちらの記事をご覧頂いている方がおおいです。
多段SSHについて
今日の構成にも近いが、以前のブログ【VPS1台でインフラ勉強】HAProxyでロードバランサーを構築で、VPSのホストサーバ上に仮想でさらにいつくかのサーバを立てました。 仮想のサーバにアクセスするには、ホストサーバにアクセスしてから更にSSHをしなければなりませんでした。 多段SSHの設定をして、一回のSSH接続で仮想サーバにアクセスすることもできます。 以下の図で言うと、web10, web11(192.168.33.10/11)に一発で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