* ポートフォワード [#o8834fde]
* ローカルポートフォワード [#o8834fde]
** RemoteHostAにログインする [#ace4d4cf]
ssh -f -L 10022:RemoteHostA:22 RemoteHostA sleep 100000
ssh -p 10022 -oHostAliasKey=RemoteHostA localhost
: -L XXX | ローカルホストのXXXポートを利用するように指定する。
: -f | ポートフォワードをバックエンドで待機させておくためのオプション
: sleep 1000000 | -f オプションを使う場合、なんらかのシェルコマンドを指定する必要がある。ループするシェルコマンドはまずいらしいので、長時間のsleepを指定するのが一般的なようだ。
: HostAliasKey | これがないとローカルのSSHがリモートサーバのサーバーキーを確認する時に警告を表示して、処理が止まる。サーバーキーの確認をしないようにすることで回避する方法もあるようだ。
** RemoteHostAを経由し、RemoteHostBにログインする [#c6c2079f]
ssh -f -N -L 10022:RemoteHostB:22 HostAUser@RemoteHostA
ssh -l HostBUser -p 10022 -oHostKeyAlias=RemoteHostB localhost
: -N | リモートでシェルコマンドを実行しなくル。上のコマンド例でsleep 100000の記述を不要にできる。
** 設定ファイルを利用して省力化 [#i7e4bdf6]
上の「RemoteHostAを経由し、RemoteHostBにログインする」を省力化する。
$HOME/.ssh/configを以下のように編集する。
Host tunnelToHostB
HostName RemoteHostA
User HostAuser
Compression yes
Port 22
LocalForward 10022 RemoteHostB:22
Host HostB
HostName localhost
user HostBuser
Port 10022
HostKeyAlias RmoteHostB
これを利用するには以下のようにコマンドを入力する。
ssh -f -N tunnelToHostB (HostBまでのトンネルが掘られる)
ssh HostB(HostBにSSH接続する)
さらに省力化するには以下のようなシェルスクリプトを書いておくとよい。
#/bin/sh
ssh -q -f -N tunnelToHostB
ssh HostB
** 注意点 [#k68bbc17]
- リモートサーバ側のsshd_configを以下のようにする。
AllowTcpForwarding yes
- リモートサーバ側のSSHDのアクセス制御で自サーバからの接続を許可する。tcp wrapperなら、hosts.allowを以下のようにする。
sshd : 100.200.100.200 : allow
(リモートサーバ側のIPアドレスを100.200.100.200とした場合)
** 参考 [#o55fc8dd]
- http://www.sb.soft.iwate-pu.ac.jp/~yushi/memo/ssh_port_forward.html
- http://cl.pocari.org/2005-01-24-2.html