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

EC2を使った踏み台サーバからのプライベートサーバへのssh接続の勉強中につまづいたので、一例として初投稿します。
[参考にさせていただいた記事](https://qiita.com/fgem28/items/2c068eab3b34336147fb#%E5%8F%82%E8%80%83%E3%81%AB%E3%81%95%E3%81%9B%E3%81%A6%E3%81%84%E3%81%9F%E3%81%A0%E3%81%84%E3%81%9F%E8%A8%98%E4%BA%8B)にも書きましたが、他にもたくさんの記事が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接続はできない。
接続するには大きく以下の２パターン
- 踏み台サーバに秘密鍵をアップロードし、その鍵を使う
- 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つの方法](https://qiita.com/grgrjnjn/items/8ca33b64ea0406e12938)

[インフラエンジニアじゃなくても押さえておきたいSSHの基礎知識](https://qiita.com/tag1216/items/5d06bad7468f731f590e)

[踏み台サーバを経由した多段SSHのやり方](https://qiita.com/kawaz/items/bfe9c24ab22eba3df6fc)

[AWS勉強会(1) / 踏み台サーバとネットワークの作成](https://qiita.com/zaki-lknr/items/4586cc2f992908068bd2)