SSHでサーバの内部から外部に接続できないエラーを対策する

SSHでサーバの内部から外部に接続できないエラーを対策する サーバー

新しくCentOSでサーバを建て、sshコマンドを利用して他のサーバに接続しようとしたら、「Connection closed by xxx.xxx.xxx.xxx port xxxx」と表示されてSSH接続が出来ない。

原因を調査して対策します。

※動作確認環境
CentOS Linux 7.9

状況

  • 外部からリモートホストとしてSSHでの接続を受ける際は正常に動作する。(sshdは正常に稼働している)
  • sshコマンドで外部にSSH接続するときだけエラーが出てSSH接続が不可能。
  • 接続先の相手を変えてもエラーが発生する。(どのサーバにもSSH接続できない。)
  • 同様にrsyncもエラーが出て不可能。
  • エラーが出たサーバへのSSH接続で利用した公開鍵暗号方式のSSH Key(秘密鍵)を、WindowsのSSHターミナルで利用した場合は問題無くそのサーバにSSH接続が可能。

これらの状況から、新しく構築したサーバ側に何か原因があると思われる。

原因調査

SSHのデバッグモードを利用してエラーの詳細を調査します。

【SSHのデバッグモードのオプション】

オプション デバッグ内容
-v クライアント側(接続元)のみの情報を表示
-vv クライアント側、リモートホスト側(接続先)の双方の情報を表示
-vvv クライアント側、リモートホスト側双方の詳細情報を表示

【デバッグ内容の種別】

debug1: クライアント側(接続元)の情報
debug2: リモートホスト側(接続先)の情報
debug3: 詳細な情報

今回は、SSHクライアント側の不具合の可能性が高いので「-v」オプションを利用して調査してみます。

「debug1: expecting SSH2_MSG_KEX_ECDH_REPLY」のところで1~2分ほどハングして止まってしまうので、ここで問題が発生していると思われます。

対策

ネットワークインタフェースのMTU値を変更(減少)して対策します。

まずip addrコマンドで現在のMTU値を確認します。

デフォルトのMTU値は1500です。

次にnmcliコマンドでアクティブな接続プロファイルの概要を表示します。

詳細を調べます

キーボードのqを押して終了します。

コネクションIDは「System ens33」、コネクションタイプは「802-3-ethernet」です。

以下の書式で、コネクションID「System ens33」のMTU値を1500から1200に変更してみます。

■MTU値の変更コマンド【書式】
nmcli connection modify [コネクションID] [コネクションタイプ].mtu [変更後のMTU値]

変更します。(※コネクションIDにスペースが含まれるのでダブルクォーテーションで囲んであります。)

MTU値の設定変更を反映させます。

正常に変更されたか確認します。

MTU値が正常に変更されました。

動作確認

SSHで再度接続してみます。

フィンガープリントの確認が出ました。

SSHの正常動作OKです。

備考・まとめ

今回は古いPCと中古のパーツを流用して作成したサーバだったので、このような症状が出たのかもしれません。

いろいろとMTU値を変えてテストしてみた結果、MTU値が1460までならOKで、1461以上でエラーが発生するという状態でしたが、念のために1200まで下げました。

SSHの設定は正しいはずなのに、何をやってもそのサーバからだけ接続が出来ないという状態のときは、ネットワークインタフェースの「MTU値」を少し下げてみましょう。

以上で解決です。