はじめに
新しいわけでも使うのが難しいわけでもないですが、単純に知らなかったので共有。。
ポートフォワーディングとは
複数のサーバーの管理をする時に使える技術。
AとBというサーバーを接続したいが、セキュリティやネットワークの問題で、直接接続できない時に使う。
AとBの間にCというサーバーを置き、Cを経由して間接的に接続できる。
どう使うのか?
- ローカルのポートをリモート先に転送したい時
例えば、自分のPCから、ネットワークの都合上、直接接続できないAというwebサーバにBというサーバを経由して接続するとき
ssh hostB -L 8080:hostA:80 -N
-LオプションはLocalのことを表します。
-Nオプションはリモートのコマンドを実行せずに待機状態にするためのもの。ポートフォワーディングをする時によく使われます。
- リモート側のポートをローカルに転送したい時
例えば、Cという外部のネットワークにあるサーバーの1010というホストから、ローカルを経由してhostDに接続するとき
ssh hostC -R 1010:hostD:22 -N
-RオプションはRemoteのことを表す。
- 実際にやってたことは
実際にはネットワーク1にあるwebサーバからネットワーク1にあるtestサーバーを経由して、ネットワーク2にあるDBに接続する、
みたいなことをやっていて、調べるきっかけになりました。
なので、以下のような内容をwebサーバーからやっていたんだとわかりました。
(testサーバーのhostをTEST、DBサーバーのhostをDBとすると)
ssh -L TEST 3000:DB:3306 -N
※3000っていうのは適当、3306はmysqlのデフォルトのポート
セキュリティ的に大丈夫?と疑問になった
セキュリティ的にOKなのって思いましたが、心配は無用でした。
上記の場合ですと、testサーバーの自分自身が3000ポートに対して行う通信だけが、DBサーバーに転送されるようになっています。
つまり、testサーバーから操作をしないと受け付けないわけで、testサーバーを経由したら転送されるというわけではないようです。
そして、これをローカル通信と呼ぶそうです。
とはいえ、データの受け渡しの間(testサーバーからDBサーバーの間)はセキュアではないので、大事な内容のものはなるべくやらないほうが良さそう。やるにしても期間限定。
その他のオプション
その他、sshの様々なオプションを組み合わせて接続することが多いので、この際によく使いそうなものは覚えておこうと思います。
-i : 秘密鍵の指定をします。
-C : 圧縮して転送します。データが大きいものとかは圧縮したほうが通信がはやそう。
-f : バックグラウンドで実行させます。
実際にサーバーに設定を保存しておくには?
一時的にコマンド打つなら上記のような感じで問題ないのですが、長いコマンド打つの面倒ですし、覚えてないよっていう場合は~/.ssh/configの中とかに書いておけばいいようです。
例えばこんな感じ
Host [中継させるサーバーのIPアドレス]
LocalForward [転送先のポート] [転送先のIPアドレス]
最後に
身近にsshコマンドは使っていましたが、恥ずかしながらこういうことができるのを全然知らなかったので、勉強になりました。
何度も頻繁に使うものではないですが、たまに使えるし、知らないと使えないので、きちんと覚えておこうと思います。
参考にした記事
SSHポートフォワード(トンネリング)を使って、遠隔地からLAN内のコンピュータにログインする
SSHによるポートフォワーディング