多段 ssh 環境で秘密鍵を使って一発ログインする

タイトルのとおりなんですが、多段 ssh 環境で秘密鍵を使って一発ログインする話。

踏み台用の ssh サーバを経由してその先にある ssh サーバにアクセスするパターンで。

ssh_config を書くのが楽です。

ssh_config というのは man するときの名前で、実際に使われるファイルは ~/.ssh/config です。

chmod 600 しておく必要があります。

OS が CentOS5 などのちょっと古めの OS で OpenSSH が 4.x 系の場合は ~/.ssh/config に以下のように書きます。

 

Host hostB
User user01
IdentityFile /home/user01/.ssh/id_rsa

Host hostC
ProxyCommand ssh hostB nc %h %p
User user01
IdentityFile /home/user01/.ssh/id_rsa

 

これで

 

hostA$ ssh hostB

 

とすれば hostB につながりますし、

 

hostA$ ssh hostC

 

とすれば hostB を経由して hostC につながります。

IdentityFile はどちらも、hostA にあるファイルを指定しています。この例だと両方同じ、すなわち ssh-agent に id_rsa を食わせて踏み台サーバで ssh -A するのと同じような感じですね。 hostB に秘密鍵をおいておく必要はありません。

OS が CentOS6 以降などのちょっとマシめの OS で OpenSSH が 5.x 以降の場合は ~/.ssh/config に以下のように書きます。

 

Host hostB
User user01
IdentityFile /home/user01/.ssh/id_rsa

Host hostC
ProxyCommand ssh -W%h:%p hostB
User user01
IdentityFile /home/user01/.ssh/id_rsa

 

OpenSSH 4.x 系までの場合は、ProxyCommand で nc コマンドに渡す必要がありましたが、 OpenSSH 5.x 系以降は、-W オプションが使えるようになりましたので、そのへんの書き方が少々変わっています。

こいつログイン時にどういう通信をしてるの?という場合はオプション -v をつけると詳細が表示されます。 -vv をつけるともっと詳しく表示されます。

 

hostA$ ssh -v hostC
hostA$ ssh -vv hostC

 

こんな感じになります。