sshを使っていると、図のようにsshの接続先のホストから更に別のホストにsshコマンドを実行して接続する事があるかも知れない。接続先でまたsshコマンドを叩くのは骨が折れるが、sshにはこのような使い方をサポートしてくれる機能がある。それがProxyCommandだ。
ProxyCommandが指定されると、sshはまずProxyComamndを実行して、入出力を手元のホストのsshコネクションに直結させる。つまりProxyCommandで踏み台となるホストを経由して目的のホストに接続することができれば、sshコマンド1発で目的のホストとの多段接続を行うことができるのだ。
ProxyCommndを使った多段接続には、これまでnetcatいわゆるnc
が使われてきた。しかし、最近のsshは-W
オプションをサポートしており、nc
を併用することなく、多段接続を実現することができるようになっている。以下ではnc
を使う方法と、ssh -W
を使う方法の2通りの使い方を紹介する。
ncを使う方法
図中のclientの~/.ssh/config
に以下の設定をする。 serverエントリはserverに接続するための設定、server-anotherserverエントリはserverを踏み台にanotehrserverに接続するための設定だ。 another-serverエントリのProxyCommandには、serverに接続してnc
を実行させanotherhostと接続させる設定をする。なお.~/.ssh/config
中で%h
はHostNameを、%p
はPortを表すプレースホルダだ。
Host server
HostName 1.2.3.4
Host server-anotherserver
HostName 5.6.7.8
Port 22
ProxyCommand ssh server nc %h %p
serverを踏み台にして、anotehrserverに接続するにはclientで以下のコマンドを実行すれば良い。
ssh server-anotherserver
ssh -Wを使う方法
同じく図中のclientの~/.ssh/config
に以下の設定をする。 serverエントリはnc
を使う方法と同様だ。 変更点はserver-anotherserverエントリのProxyCommandで、ssh -W %h:%p server
でserverに接続したあとanotehrhostに接続するように設定する。
Host server
HostName 1.2.3.4
Host server-anotherserver
HostName 5.6.7.8
Port 22
ProxyCommand ssh -W %h:%p server
anoterhserverへの接続方法はnc
の場合と変わらない。
ncとssh -Wどちらを使うべきか?
ここで疑問が沸くのが、一体nc
とssh -W
どちらを使えば良いのかという点だ。踏み台となるホストにnc
をインストールする必要がない分、後者のssh -W
を使った方が良さそうに見える。
ただnc
を併用する方法は歴史があるので、これまで動かしてきた設定をわざわざ変更するほどのメリットがあるとは思えない。個人的には既存の設定を使う場合はnc
をそのまま、新しい設定を書く場合はssh -W
を使って設定を書いてお茶を濁している。