Posted at
AtraeDay 14

SSHポートフォワーディングを知った話

More than 1 year has passed since last update.


はじめに

新しいわけでも使うのが難しいわけでもないですが、単純に知らなかったので共有。。


ポートフォワーディングとは

複数のサーバーの管理をする時に使える技術。

AとBというサーバーを接続したいが、セキュリティやネットワークの問題で、直接接続できない時に使う。

AとBの間にCというサーバーを置き、Cを経由して間接的に接続できる。


どう使うのか?


  • ローカルのポートをリモート先に転送したい時

例えば、自分のPCから、ネットワークの都合上、直接接続できないAというwebサーバにBというサーバを経由して接続するとき

ssh hostB -L 8080:hostB: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によるポートフォワーディング