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」オプションを利用して調査してみます。

# ssh -v -p xxxx -i /XXXXXX/XXXXXX/id_ed25519_xxxxxxxxxx_key xxxxx@xxx.xxx.xxx
OpenSSH_7.4p1, OpenSSL 1.0.2k-fips  26 Jan 2017
debug1: Reading configuration data /etc/ssh/ssh_config
debug1: /etc/ssh/ssh_config line 58: Applying options for *
debug1: Connecting to xxx.xxx.xxx [xxx.xxx.xxx.xxx] port xxxx.
debug1: Connection established.
debug1: permanently_set_uid: 0/0
debug1: key_load_public: No such file or directory
debug1: identity file /XXXXXX/XXXXXX/id_ed25519_xxxxxxxxxx_key_key type -1
debug1: key_load_public: No such file or directory
debug1: identity file /XXXXXX/XXXXXX/id_ed25519_xxxxxxxxxx_key_key-cert type -1
debug1: Enabling compatibility mode for protocol 2.0
debug1: Local version string SSH-2.0-OpenSSH_7.4
debug1: Remote protocol version 2.0, remote software version OpenSSH_7.4
debug1: match: OpenSSH_7.4 pat OpenSSH* compat 0x04000000
debug1: Authenticating to xxx.xxx.xxx:xxxx as 'xxxxx'
debug1: SSH2_MSG_KEXINIT sent
debug1: SSH2_MSG_KEXINIT received
debug1: kex: algorithm: curve25519-sha256@libssh.org
debug1: kex: host key algorithm: ssh-ed25519
debug1: kex: server->client cipher: chacha20-poly1305@openssh.com MAC: <implicit> compression: none
debug1: kex: client->server cipher: chacha20-poly1305@openssh.com MAC: <implicit> compression: none
debug1: kex: curve25519-sha256@libssh.org need=64 dh_need=64
debug1: kex: curve25519-sha256@libssh.org need=64 dh_need=64
debug1: expecting SSH2_MSG_KEX_ECDH_REPLY
※ここで停止してしまう。
※しばらく経った後に↓↓↓が表示されて終了。
Connection closed by xxx.xxx.xxx.xxx port xxxx

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

対策

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

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

# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether XX:XX:XX:XX:XX:XX brd ff:ff:ff:ff:ff:ff
    inet 192.168.xxx.xxx/24 brd 192.168.xxx.255 scope global noprefixroute dynamic ens33
       valid_lft 172796sec preferred_lft 172796sec

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

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

# nmcli connection show
NAME          UUID                                  TYPE      DEVICE 
System ens33  XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX  ethernet  ens33

詳細を調べます

# nmcli connection show "System ens33"
connection.id:                          System ens33
connection.uuid:                        XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX
connection.stable-id:                   --
connection.type:                        802-3-ethernet
connection.interface-name:              ens33
connection.autoconnect:                 はい
connection.autoconnect-priority:        0
...以下略...

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

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

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

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

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

# nmcli connection modify "System ens33" 802-3-ethernet.mtu 1200

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

# systemctl restart NetworkManager

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

# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1200 qdisc pfifo_fast state UP group default qlen 1000
    link/ether XX:XX:XX:XX:XX:XX brd ff:ff:ff:ff:ff:ff
    inet 192.168.xxx.xxx/24 brd 192.168.xxx.255 scope global noprefixroute dynamic ens33
       valid_lft 172785sec preferred_lft 172785sec

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

動作確認

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

# ssh -v -p xxxx -i /XXXXXX/XXXXXX/id_ed25519_xxxxxxxxxx_key xxxxx@xxx.xxx.xxx
The authenticity of host '[xxx.xxx.xxx]:xxxx ([xxx.xxx.xxx.xxx]:xxxx)' can't be established.
ED25519 key fingerprint is SHA256:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX.
ED25519 key fingerprint is MD5:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX.
Are you sure you want to continue connecting (yes/no)? 

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

SSHの正常動作OKです。

備考・まとめ

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

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

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

以上で解決です。

タイトルとURLをコピーしました