タイトルのとおりなんですが、多段 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
こんな感じになります。