ssh_exchange_identification: Connection closed by remote host
エラーが発生した場合の対処方法をメモっておきます。
まず、ググると以下がヒットしたので、それを試してみました。
- ~/.ssh/known_hosts から関連しそうな設定を消す
- /etc/hosts.allow に接続元IPアドレスを記載する
- /etc/ssh/sshd_config の MaxStartups の設定をデフォルト値の 10:30:100 から増やす
- host名やipアドレスが本当にあっているか確認する
しかしいずれも解決にはつながらず、途方にくれた私を救ってくれたのは、上司からの
Host test-* みたいな共通設定が入ってません??
というエスパー指摘でした。まさにその設定が入っています!!
踏み台サーバ経由で各サーバにsshする必要があるため、~/.ssh/config
に以下のようなワイルドカードを使った共通設定を行なっており、
# 踏み台
Host test-bastion
HostName hoge.fuga.net
User hogeuser
Port 22222
ForwardAgent yes
# 共通
Host test-*
User hogeuser
ProxyCommand ssh -W %h:%p test-bastion
この共通設定のため、ssh test-xxx
を実行すると、
Host test-bastion
HostName hoge.fuga.net
User hogeuser
Port 22222
ForwardAgent yes
ProxyCommand ssh -W %h:%p test-bastion ## <------
のような感じでtest-bastion
にProxyCommand
のパラメータが存在するように解釈され、test-bastion
にtest-bastion
経由でアクセスしようとして、エラーが発生していたようです。
対応策として、単純に踏み台サーバと実サーバの名前が被らないようにすることにしました。
Host bastion-for-test
HostName hoge.fuga.net
User hogeuser
Port 22222
ForwardAgent yes
# 共通
Host test-*
User hogeuser
ProxyCommand ssh -W %h:%p bastion-for-test
なお、ワイルドカードを使ったパラメータの上書きに関しては、ssh_configの マニュアル に書いてあるので、詳細はそちらを参照ください。