OpenSSHのポートフォワード

最終更新日時:2007-09-12 10:24:40
OpenSSH

OpenSSHのポートフォワード


OpenSSH では、ポートレベルでのフォワードが可能で、当然通信は暗号化されますので、非常に便利です。
ポートフォワードは以下の2つのパターンが可能です。

・ ローカルマシンの指定したポートへの接続をログイン先のマシン経由で、指定したマシンの指定したポートへのポートフォワード (-L port:host:host_port))
・ ログイン先のマシンの指定したポートへの接続をローカルマシン経由で、指定したマシンの指定したポートへのポートフォワード (-R port:host:host_port))

例えば、ローカルマシン上のポート 10080 番への通信を web_server マシンのポート 80 番へポートフォワードする場合は以下のようなコマンドを実行します。
つまり、http://localhost:10080/ を参照することにより http://web_server/ を参照可能にします。
ただし、gw へは ssh でログインでき、gw からは web_server:80 が参照可能であるものとします。

 ssh -L 10080:web_server:80 koumei2@gw 


バックグラウンドでポートフォワードする


上記では、ちゃんとポートフォワードされるもののログインシェルが動いてしまって、無駄なウィンドウを開いておくことになってしまいます。
その上、そのままログインしっぱなしにしておかなくてはならないので、ちょっと気持ち悪い。
ということで、バックグラウンドでポートフォワードをする方法です。

 ssh -L 10080:web_server:80 -f koumei2@gw ping -i 60 localhost > /dev/null 


-f 指定をすると、指定したコマンドをバックグラウンドで実行して、リモート先のシェルからすぐに制御が戻ってきます。
従って、ログインし続けている必要はありません。
ここで注意しないといけないのは、実行するコマンドが終わってしまうとポートフォワードも終了してしまうということです。
上の例では、ping -i 60 localhostとして、永久ループさせています。
その出力を /dev/null に流しているのは、どうも ssh を実行したウィンドウを閉じてしまうと、出力がエラーになってしまうらしくて、ポートフォワードも終わってしまうからです。
ちなみに、出力なんかさせなきゃいいじゃんってことでsleep 60とかにすると、IP マスカレードな環境越しの場合には30分もあればポートフォワードの接続が切断されるでしょう。
これは、ある一定時間パケットが全く飛ばなかった時には、IP マスカレードのマップテーブルから消されてしまうからです。
そういう意味では、IP マスカレードではない人は sleep の方がいいかもしれません。

リモート接続もフォワードする


ポートフォワードは、デフォルトではそのサーバ内からの通信のみをポートフォワードします。
つまり上の例でローカルのサーバを mymachine だとすると、http://mymachine:10080/ をローカルのサーバから参照した場合には、ちゃんと http://web_server/ を参照できますが、他のマシンから http://mymachine:10080/ を参照しても接続を拒否されます。
これを可能にするには、-g オプションを指定します。

 ssh -L 10080:web_server:80 -g -f koumei2@gw ping -i 60 localhost > /dev/null 


これで mymachine:10080 を参照できるマシンからであれば、http://web_server/ を参照することが可能になります。
ただし、これを行うと、意図しない人が参照できてしまうといことが起こりうるので注意が必要です。

お問い合わせは 掲示板 にて。