Edited at

踏み台サーバを経由した多段SSHのやり方

More than 3 years have passed since last update.

時々必要になってその度にググってるんだけど自分用にまとめメモ

追記2015-10-15: 最強の多段SSH設定 も出来たので合わせて読んでみてください。


ケース1


サーバ構成

よくある↓こんな構成を想定

     [MyPC]


_人人人人人人人人_
> インターネット <
 ̄Y^Y^Y^Y^Y^Y^Y^ ̄

|(EIP:54.178.xxx.yyy)
┌─ [projectX-bastion] ─┐

_人 人_ ├ [projectX-web1] (10.123.1.80)
> VPC < └ [projectX-web2] (10.123.2.80)
 ̄Y^ Y^ ̄


接続情報

こんな情報が与えられて、どのサーバも authorized_keys とかを勝手に修正しちゃいけないとする。


  • projectX-bastion


    • ユーザ: bastion

    • 秘密鍵: projectX-bastion.pem(サーバ情報と一緒にもらった鍵ファイル)



  • projectX-web1,2


    • ユーザ: www

    • 秘密鍵: bastion@projectX-bastion:~/.ssh/id_rsa(サーバ管理者によって設定済み)

    • sudo用パスワード: A89j4LeZ




多段SSH設定

MyPC にこんな設定を書いておく。


~/ssh/config

Host projectX-bastion

User bastion
IdentityFile ~/.ssh/keys/projectX-bastion.pem
Hostname 54.178.xxx.yyy
Host projectX-web1 projectX-web2
User www
# bastion@project-bastion:~/.ssh/id_rsa からローカルにコピーしておく
IdentityFile ~/.ssh/keys/projectX-bastion-id_rsa.pem
#old style: ProxyCommand ssh projectX-bastion nc %h %p
ProxyCommand ssh -W %h:%p projectX-bastion
LocalCommand echo "## sudo用パスワード: A89j4LeZ"
Host projectX-web1
Hostname 10.123.1.80
Host projectX-web2
Hostname 10.123.2.80

この設定を書いておけば、それぞれのサーバへは以下のように接続できる。bash-completionが入っていれば projectX-* というホスト名でTAB補完も効く。

$ ssh projectX-bastion

$ ssh projectX-web1
$ ssh projectX-web2


補足

ProxyCommandについて、昔はncコマンドを使う設定を書いてたが、最近はsshの-Wオプションを使えばbastionサーバ上へのncのインストールが不要になるので、最近は-Wの方をを使うようになりました。

LocalCommandについて、www@projectX-web1,2サーバ上ではsudoが使えることになってますが、パスワードを毎度調べるのが面倒な時は自分用にメモ表示させることがあります。このへんは以前、sshの接続先毎にメモを表示させる - Qiitaに書きました。

IdentityFileについて、webへの接続用のIdentityFileはホントはbastionのid_rsaをローカルに持ってこずに、ssh -t projectX-bastion ssh www@10.123.10.80と同様の動作にするのが理想だったんですが、ProxyCommandを使う場合はbastionはあくまで通信路のProxyをしてるだけで終着サーバへの接続はMyPCから直接行われるという考え方なので、bastion上の鍵をローカルに持ってきておくしかありませんでした。

コレについてもっと良いやり方があるよ、って人はコメント頂けると嬉しいです。

bastionというサーバ名について、昔は中継サーバの意味としてstepとかrelayとかgatewayとかっていうサフィックスを使ってたんだけど、AWS Certificationの試験を英語で受けてると問題文でしばしばbastion serverっていう呼び方が出てきて、英単語の知識が乏しかった僕はそのサーバの役割の意味がよくわからず誤答して点数を落とすということをやらかした苦い経験から、Amazonがbastion使うんなら自分でも踏み台サーバの名前で使うことにしようと思い、最近使うようになりましたw(実際のところbastionは中継っていうよりもちっと広く外部から直接アクセス可能なDMZサーバな感じの単語かな)


ケース2

ケース1の bastion や web1,2 サーバの authorized_keys にそれぞれMyPCの公開鍵を登録して良い状況ならそれが一番らくだと思います。その場合上記設定の IdentityFile の設定、しいては余計な鍵ファイルの管理も不要になります。