LoginSignup
8
6

More than 3 years have passed since last update.

EC2で踏み台サーバを使ったプライベートサーバへのSSH接続

Last updated at Posted at 2020-03-03

EC2を使った踏み台サーバからのプライベートサーバへのssh接続の勉強中につまづいたので、一例として初投稿します。
参考にさせていただいた記事にも書きましたが、他にもたくさんの記事がQiitaにはありますので、そちらも参照ください。

したいこと

同じAZに作ったパブリックサブネットとプライベートサブネットにそれぞれEC2を作成し、プライベートサーバへの接続はパブリックサーバを踏み台にする必要がある構成にしたい。

  • 踏み台サーバのパブリックIP: 3.*.*.*
  • プライベートサーバのプライベートIP: 192.168.1.39
  • AWS上で作ったキーペア名: practice.pem

行ったこと

Publicサブネットの踏み台サーバにはdefaultとssh許可のセキュリティグループを設定
Privateサブネットのサーバにはdefaultをコピーしたvpc内の全ての通信を許可するセキュリティグループを設定

確認できていること

踏み台サーバへの通常のssh接続ok
踏み台サーバからprivateサーバへpingを飛ばして生きていること確認

ping 192.168.1.39

エラー発生

現状だと踏み台サーバには秘密鍵がないので踏み台サーバからprivateサーバへのssh接続はできない。
接続するには大きく以下の2パターン
- 踏み台サーバに秘密鍵をアップロードし、その鍵を使う
- sshのProxyCommandオプションで外部から踏み台サーバを経由して一気にアクセスできる設定にする

秘密鍵を踏み台サーバに置くのはあまりよくないとのことなので、ProxyCommandオプションで外部から一気にアクセスする方法を試みる

~/.ssh/configを新規作成し以下のように記載し、

~/.ssh/config
Host test-private
  HostName 192.168.1.39 # privateサーバのプライベートIP
  User ec2-user
  IdentityFile ~/.ssh/practice.pem
  ProxyCommand ssh 3.*.*.* -W %h:%p # 踏み台サーバのパブリックIP

ssh接続を試みるも、接続できず

$ ssh test-private
Macのユーザー名@3.*.*.*: Permission denied (publickey,gssapi-keyex,gssapi-with-mic).
ssh_exchange_identification: Connection closed by remote host

試したこと

色々な記事を参考に試しました。

~/.ssh/configのパーミッション設定をしたが変わらず

chmod 600 ~/.ssh/config

秘密鍵のパーミッション設定をするも変わらず

chmod 600 ~/.ssh/practice.pem

sudoをつけてみるも以下のエラー

$ sudo ssh test-private
Password:
ssh: Could not resolve hostname test-private: nodename nor servname provided, or not known

~/.ssh/known_hostsの同じIPアドレスから始まる行を削除したが変わらず

1行のコマンドを試してみるが、だめ

$ ssh -o ProxyCommand='ssh -i ~/.ssh/practice.pem ec2-user@3.*.*.* -W 192.168.1.39' -i ~/.ssh/practice.pem ec2-user@192.168.1.39
Bad stdio forwarding specification ‘192.168.1.39’ # プライベートサーバのIP
ssh_exchange_identification: Connection closed by remote host

privateサーバにssh接続も許可するようにセキュリティグループ設定したが解決せず。

こういう時は、寝るのが一番です。

おかしいところ

起床してから振り返ってみるとおかしなところがありました。

$ ssh test-private
Macのユーザー名@3.*.*.*: Permission denied (publickey,gssapi-keyex,gssapi-with-mic).
ssh_exchange_identification: Connection closed by remote host

見過ごしていましたが、このエラー文、なぜかMacのユーザー名が出ています。
本来ならec2-user(初期設定のままの場合)となるはずです。

解決

~/.ssh/configを以下のように修正したら、

~/.ssh/config
### 以下を追加
Host test-bastion
  Hostname 3.*.*.*
  User ec2-user
  IdentityFile ~/.ssh/practice.pem
### 追加ここまで

Host test-private
  Hostname 192.168.1.39
  User ec2-user
  IdentityFile ~/.ssh/practice.pem
  ProxyCommand ssh test-bastion -W %h:%p ### プライベートサーバのIPだったのをtest-bastionに変更

接続成功!!

$ ssh test-private
The authenticity of host '192.168.1.39 (<no hostip for proxy command>)' can't be established.
ECDSA key fingerprint is SHA256:l98F1hMEnkNJR+9ON6GWpq/UQfpm34B62g11byAP15c.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '192.168.1.39' (ECDSA) to the list of known hosts.

       __|  __|_  )
       _|  (     /   Amazon Linux 2 AMI
      ___|\___|___|


https://aws.amazon.com/amazon-linux-2/
[ec2-user@ip-192-168-1-39 ~]$

~/.ssh/configの書き方がまずかったみたいですね。
踏み台接続するのに片方の設定しか書いていなかったので、両方書いて「踏み台→プライベート」という流れをしっかり作ってあげないといけない感じですかね。
そして一旦諦めて寝るのも有効な対策ですね。

参考にさせていただいた記事

SH接続エラー回避方法:.ssh/known_hostsから特定のホストを削除する/削除しないで対処する3つの方法

インフラエンジニアじゃなくても押さえておきたいSSHの基礎知識

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

AWS勉強会(1) / 踏み台サーバとネットワークの作成

8
6
0

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
8
6