ポート自体をテストする
pingへの応答やWebサイトの正常な表示だけでは、SSHの状態は分かりません。それぞれ使用するプロトコルやポートが異なるためです。クライアントからTCPポートを直接テストしてください。Connection refusedは何らかの応答があったものの、接続を受け付けるサービスがなかったことを意味します。タイムアウトは応答が何もなかったことを意味し、通常はファイアウォール、経路、マシンの過負荷が疑われます。
nc -vz -w 5 server.example 22
ssh -v -o ConnectTimeout=5 user@server.exampleConnection refused:コンソールからsshdを確認する
SSHではなく、プロバイダーまたはハイパーバイザーのコンソールを使います。サービスが動作しているか、どのアドレスとポートで待ち受けているか、設定が有効かを確認してください。最近のUbuntuではSSHがssh.socket経由で起動するため、ソケットユニットも調べます。他のディストリビューションではサービス名がsshdの場合があります。
sudo systemctl status ssh.service ssh.socket
sudo ss -lntp | grep -E ':22\b|sshd'
sudo sshd -t
sudo journalctl -u ssh -n 50 --no-pagerタイムアウト:ファイアウォールを確認する
サーバー上のファイアウォールに加え、クラウドのセキュリティグループ、ルーター、プロバイダーの管理パネルなど、外部のフィルターも確認します。パケットが届いているかどうかは、接続を試みている間にサーバーでtcpdumpを実行して調べます。何も表示されなければ、サーバーに届く前に遮断されています。パケットは届くのに応答が出ていなければ、サーバー上で原因を探してください。
sudo ufw status verbose
sudo nft list ruleset | less
sudo tcpdump -ni any tcp port 22fail2banによる遮断やポート変更
ログイン失敗後にfail2banが自分のアドレスを遮断した場合、そのアドレスからの接続だけがタイムアウトまたは接続拒否になります。別のネットワークからテストすれば、すぐに確認できます。また、Portでポートが変更されていないか、ListenAddressで待受先が1つのアドレスに制限されていないかも確認します。設定場所はsshd_config、または次のディレクトリ内のファイルです:/etc/ssh/sshd_config.d.
sudo fail2ban-client status sshd
sudo sshd -T | grep -E '^(port|listenaddress) 'ポートには接続できるのにログインが止まる
TCP接続は成功するのにSSHの初期識別メッセージが届かない場合、sshdが部分的にしか機能していないか、システムが過負荷になっています。コンソールでメモリ、ディスク空き容量、負荷を確認してください。ディスクが満杯だったりメモリを使い果たしていたりすると、既存のサービスは応答していても新しいセッションを開始できないことがあります。
uptime
free -h
df -hCH-J Server Managerで確認する
Server Diagnosticsはログインせずに、IPv4とIPv6でping、TCP接続、SSH識別文字列をテストできるため、どの段階で失敗するかを確認できます。テストは自分のコンピューターからのみ行われます。サーバー内部の状態を確認したり、どのファイアウォールがパケットを破棄したかを特定したりはできないため、上記の確認には引き続きコンソールが必要です。