173
159

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Last updated at Posted at 2014-05-04

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

追記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 の設定、しいては余計な鍵ファイルの管理も不要になります。

173
159
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
173
159

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?