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を新規作成し以下のように記載し、
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を以下のように修正したら、
### 以下を追加
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つの方法