構成
起きている問題
正常にポートフォワーディングされていたのが、ある日突然、踏み台サーバーにログインした後にwebサーバーへログインしようとすると下記のように失敗するようになった。
- webサーバー側
kex_exchange_identification: Connection closed by remote host
- 踏み台サーバー側
channel 3: open failed: connect failed: No route to host
ssh_exchange_identificationとは何か
接続先が存在しない、またはセキュリティ違反によってリモートに接続できない場合に発生するエラーだそうです
ということは、
リモートのIPアドレスが何らかの原因で変更された
セキュリティの設定に何かしら変更があった(以前はログインできていたので)
ということが考えられる(?)気がします。
もっとも原因として考えられそうなものがIPアドレスなので、まずはそちらから確認していきます。
Webサーバーを確認
今回はElasticIPを使用しているので、IPアドレスは固定されています。対象のWebサーバーのIPアドレスを確認すると、IPアドレスは変更されていないようでした。
webサーバーのセキュリティを緩めて直接ログインして確認します。
ssh -v -i <秘密鍵のパス> ec2-user@<接続先IPアドレス>
でログインを試みると、
OpenSSH_8.1p1, LibreSSL 2.7.3 debug1: Reading configuration data /etc/ssh/ssh_config debug1: /etc/ssh/ssh_config line 47: Applying options for * debug1: Connecting to 54.248.28.113 [54.248.28.113] port 22. debug1: connect to address 54.248.28.113 port 22: Operation timed out ssh: connect to host 54.248.28.113 port 22: Operation timed out
タイムアウトしてます。。。
ここで念の為、インスタンスを停止→起動を行うとどうなるか確かめておきます
踏み台サーバー経由でログインできました。。。(なぜ)
2022/2/10 追記
- 上記の現象が再度発生しまして、前回のインスタンスの再起動で解決できなかったため、追記しました。
現状
発生している現象は前述のものと同様
差異はインスタンスの再起動を行なっても解決しない点
確認
OpenSSH_8.1p1, LibreSSL 2.7.3 debug1: Reading configuration data /etc/ssh/ssh_config debug1: /etc/ssh/ssh_config line 47: Applying options for * debug1: Connecting to 54.248.28.113 [54.248.28.113] port 22.
ここでポートフォワーディングを行うコマンドの文法を改めて確認しました。
ssh -L <ポート>:<ターゲットのIPアドレス>:22 -i <秘密鍵のパス> <ユーザー名>@<踏み台サーバーのIPアドレス>
- -L:ローカルポートの転送。ローカルからリモート方向へのトンネリングを実現する。ローカルホストの任意のポート番号にアクセスした時に、ターゲットのIPアドレスにポート22番で接続する。
- -i:キーファイルの指定。キーファイルのデフォルトは
~/.ssh/id_rsa
今まで実行していたコマンドを見ると、ターゲットのIPアドレスが誤っていました。なのでそれを修正します。
無事つながりました。(逆に今までなんで接続出来ていたんでしょう。。。思い込みって怖い)
参考
EC2 インスタンスに SSH で接続しようとする時に発生する「接続が拒否されました」または「接続がタイムアウトしました」エラーを解決する
sshポートフォワーディングで詰まったら確認すること - Qiita
https://aws.amazon.com/jp/premiumsupport/knowledge-center/ec2-linux-resolve-ssh-connection-errors/