ProxyCommandによるsshの多段接続について
タグ: ssh / 初版公開: 2013-10-08

ssh proxy connection

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 serverserverに接続したあと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どちらを使うべきか?

ここで疑問が沸くのが、一体ncssh -Wどちらを使えば良いのかという点だ。踏み台となるホストにncをインストールする必要がない分、後者のssh -Wを使った方が良さそうに見える。

ただncを併用する方法は歴史があるので、これまで動かしてきた設定をわざわざ変更するほどのメリットがあるとは思えない。個人的には既存の設定を使う場合はncをそのまま、新しい設定を書く場合はssh -Wを使って設定を書いてお茶を濁している。