ssh_exchange_identification:でリモートに接続できない問題の原因と対処
- システム
エンジニア - ssh_exchange_identification:でリモートに接続できない原因を知りたいです。
- プロジェクト
マネージャー - リモートに接続できない原因はいくつかありますので紹介します。
みなさんはsshコマンドを使ってサーバに接続しようとした際にssh_exchange_identification: connection closed by remote host
というエラーが表示された経験はないでしょうか。
今回はこのエラーが発生する代表的なケースを2つ紹介し、それの根本原因と対処方法について述べていきます。また、いずれのケースにも該当しない場合のトラブルシューティングについても紹介します。
以下、接続元となるPCないしはサーバをローカル、sshで接続したい先のサーバのことをリモートと呼びます。
ケース1:REMOTE HOST IDENTIFICATION HAS CHANGED
以下の様なメッセージがssh_exchange_identification: connection closed by remote hostと併せて表示されている場合について紹介いたします。この場合は、リモートとローカルのknown_hostsファイルに記録されているfingerprintが異なっている可能性があります。
1
2
3
|
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@ WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
|
まず、fingerprintとは何か、それが記録されているknown_hostsファイルについて述べていきます。
known_hostsファイルとは何か
known_hostsファイルには過去に接続したことのあるホストごとにfingerprintと呼ばれる情報が記録されています。fingerprintとは接続先のホストのIPアドレス、鍵の暗号方式、公開鍵のことを指します。
sshの際には単にリモートのホスト名だけではなく、これらの情報と合わせて識別を行っており、名前の通り指紋の役割として働いています。
何らかの理由により、fingerprintが異なる場合 REMOTE HOST IDENTIFICATION HAS CHANGED!
というエラーが出るというわけです。
known_hostsに記録されたfingerprintが変わってしまう原因としては、サーバが再起動したことによってDHCPによりIPアドレスが変わったり、OS再インストールによって公開鍵が変わったりと様々です。
リモートの情報が変更された理由に心当たりがある場合は以下の2つの方法で対処が可能です。一方で、心当たりがない場合はなりすましの可能性があるので注意が必要です。
対処:known_hostsに記録されたfingerprintを削除する
リモートが更新された原因に心当たりが場合は、直接known_hostsファイルに記録されたfingerprintを削除してしまっても問題ありません。
エディタでローカルのknown_hostsファイルを開き、該当のリモートホストから続く1行を削除することでssh_exchange_identification:connectionclosedbyremotehost
エラーが解消されます。
1
|
vim ~/.ssh/known_hosts
|
以下のsedコマンドを使って削除することも可能です。
1
|
sed -i '/リモートのホスト名/d' ~/.ssh/known_hosts
|
消されてしまったfingerprintについては、再びsshで接続したタイミングで新しいfingerprintが記録されるので問題ありません。
対処:REMOTE HOST IDENTIFICATION HAS CHANGED!の警告を無視する
また、known_hostsを編集せずとも、sshコマンド実行時に-o ‘StrictHostKeyChecking no’オプションをつけることでssh_exchange_identification:connectionclosedbyremotehost
を無視して接続することができます。
このオプションをつけることでyes/noなどの対話も不要になるため、Pythonやshellscriptを用いてsshを実行するような場合にとても有効です。
1
|
ssh -o 'StrictHostKeyChecking no' リモートのホスト名
|
ケース2:リモートの接続設定でconnection closed by remote hostが発生
sshd(ローカルからのssh接続を受け持つデーモン)やdenyHostsというセキュリティツールで禁止されている場合でもssh_exchange_identification:connectionclosedbyremotehost
が発生する可能性があります。
ケース1に該当しない場合はリモートサーバのアクセス設定が不適切である可能性があります。
対処:リモートのアクセス設定を見直す
セキュリティツールによってリモートへのアクセス管理がされている場合、接続拒否設定ファイルの見直しが必要です。
具体的には/etc/hosts.denyファイルで管理されており、そのファイル内にローカルのIPアドレスが記述されていないか確認が必要です。
また、拒否とは別に許可を設定する/etc/hosts.allowというファイルもあります。この設定は/etc/hosts.denyよりも優先されます。
そのためセキュリティの観点から、拒否設定はできるかぎりそのままにし、/etc/hosts.allowに許可したいローカルのIPアドレスを指定することを推奨します。
以下のようにテキストエディタを使って修正することでssh_exchange_identification:connectionclosedbyremotehost
エラーの発生を防ぐことができます。
1
2
3
4
|
# 拒否するホストを記述する
vim /etc/hosts.deny
# 許可するホストを記述する
vim /etc/hosts.allow
|
アクセス設定を管理しているデーモンを再起動することで設定を反映することができます。
いずれのツールで管理しているかわからない場合はstatusコマンドで起動しているかどうか確認することを推奨します。
1
2
3
4
5
6
7
8
9
|
# 起動状況を確認する
systemctl status denyhosts
# 設定反映のためサービスを再起動する
## denyhostsで管理している場合
systemctl restart denyhosts
## sshdで管理している場合
systemctl restart sshd
|
いずれのケースにも当てはまらない場合
ssh_exchange_identification:connectionclosedbyremotehost
の原因が分からない場合のトラブルシューティングについて紹介していきます。
リモートにはsshdのログが記録されていますので、ログを見ることで何が原因で接続ができないのか確認することができます。
CentOS系のサーバであれば/var/log/secure、Ubuntu系のサーバであれば/var/log/auth.logに記録されています。接続を試みたユーザや日付、IPアドレスなどが記録されています。
また、/etc/ssh/sshd_configでLogLevelを設定することができます。LogLevelをDEBUGに変更することでより細やかな情報を得ることができます。
ただし、無用にレベルを下げることはプライバシの観点で注意が必要です。あくまで一時的な調査のために用いることを推奨します。
- システム
エンジニア - エラーになる原因や対処方法がわかりました。
- プロジェクト
マネージャー - エラーが出た際は、紹介した原因や対象方法を参考にしてみてください。
ssh_exchange_identificationのエラーまとめ
今回はssh_exchange_identification:connectionclosedbyremotehost
のエラーとその原因・対処について2つほど紹介しました。加えて、いずれの原因にも当てはまらない場合のトラブルシューティングの方法について述べました。
まず1点目は、リモートのfingerprintが変わった場合について紹介しました。その対処方法として、ローカルに記録されているfingerprintを削除する、sshコマンドのオプションを利用して無視する、の2つを挙げました。
続いて2点目はリモートから拒絶されている場合について紹介しました。リモートの接続設定を見直すという対処方法を挙げました。
最後にいずれのケースにも当てはまらない場合のトラブルシューティングについて述べました。リモートのsshdが残しているログファイルを確認することでssh_exchange_identification:connectionclosedbyremotehost
が発生した原因の特定を行うことができます。
FEnet.NETナビ・.NETコラムは株式会社オープンアップシステムが運営しています。
株式会社オープンアップシステムはこんな会社です
秋葉原オフィスには株式会社オープンアップシステムをはじめグループのIT企業が集結!
数多くのエンジニアが集まります。
-
スマホアプリから業務系システムまで
スマホアプリから業務系システムまで開発案件多数。システムエンジニア・プログラマーとしての多彩なキャリアパスがあります。
-
充実した研修制度
毎年、IT技術のトレンドや社員の要望に合わせて、カリキュラムを刷新し展開しています。社内講師の丁寧なサポートを受けながら、自分のペースで学ぶことができます。
-
資格取得を応援
スキルアップしたい社員を応援するために資格取得一時金制度を設けています。受験料(実費)と合わせて資格レベルに合わせた最大10万円の一時金も支給しています。
-
東証プライム上場企業グループ
オープンアップシステムは東証プライム上場「株式会社オープンアップグループ」のグループ企業です。
安定した経営基盤とグループ間のスムーズな連携でコロナ禍でも安定した雇用を実現させています。
株式会社オープンアップシステムに興味を持った方へ
株式会社オープンアップシステムでは、開発系エンジニア・プログラマを募集しています。
年収をアップしたい!スキルアップしたい!大手の上流案件にチャレンジしたい!
まずは話だけでも聞いてみたい場合もOK。お気軽にご登録ください。
新着案件New Job
-
開発エンジニア/東京都品川区/【WEB面談可】/在宅ワーク
月給29万~30万円東京都品川区(大崎駅) -
遠隔テストサービス機能改修/JavaScript/東京都港区/【WEB面談可】/テレワーク
月給45万~60万円東京都港区(六本木駅) -
病院内システムの不具合対応、保守/東京都豊島区/【WEB面談可】/テレワーク
月給30万~30万円東京都豊島区(池袋駅) -
開発/JavaScript/東京都豊島区/【WEB面談可】/テレワーク
月給50万~50万円東京都豊島区(大塚駅) -
債権債務システム追加開発/東京都文京区/【WEB面談可】/在宅勤務
月給62万~67万円東京都文京区(後楽園駅) -
PMO/東京都豊島区/【WEB面談可】/在宅勤務
月給55万~55万円東京都豊島区(池袋駅)