04 April 2012

ssh port forward 整理

たとえばこんなことができる

(local [port XXX]) ---- ssh ---- ([port 22] target [port YYY])

(local [port XXX]) ---- ssh ---- ([port 22] remote) -------- ([port YYY] target)
  • ローカルの XXX ポートへの接続は, ssh を経由して target の YYY ポートへの接続になる
  • 外部から proxy を通して内部ネットワークにアクセスするときの常套手段

コマンドはこういう感じになる

$ ssh -L 10100:example.com:5000 example.com

上記はローカル 10100 port への接続は example.com への 5000 port に転送される. local - example.com 間は普通に ssh 接続で, example.com から example.com:5000 へ転送される.

-L はローカルへの接続をリモートへ転送するオプション. 逆の -R というのもあって, リモートのあるポートへの接続をローカルへ転送する.

$ ssh -L 8080:remote.example.com:80 proxy.example.com

proxy.example.com が proxy サーバで, remote.example.com は proxy を介さないと接続できないとする. 上記のようにすると, ローカル 8080 への接続は ssh を介して proxy に行き, そこから remote:80 へ転送される.

$ ssh -C -f -N -L 1234:remote.example.com:1234 remote.example.com

このへんのオプションをつけると便利

  • -C は転送するデータを圧縮するオプション
  • -f は ssh 接続をバックグラウンドで実行するオプション
  • -N はリモートでコマンドを実行しないというオプション. ポートフォワード専用で ssh 接続するときはリモートでコマンドは実行しないので, これを設定しておくと良い (しなかったらどうなるかよくわからない)

Refs