VPSSPark ブログ
← 開発日記に戻る

LinuxサーバーでSSH接続が拒否されるときの5つの切り分け方法

サーバーメモ · 2026.07.17 · 約 11 分

よくある検索:SSH 接続拒否 · Connection refused · Linux VPS リモートログイン · sshd トラブルシュート

マルチモニター開発環境でコードとターミナルを操作する開発者——Linux SSH リモート障害対応の場面
SSHが繋がらないとき、まずサーバー障害と決めつけがちですが、多くはポート・ファイアウォール・サービス設定。層ごとの確認が盲目の再起動より早いです。

Linux VPS を契約した直後、あるいは深夜に監視アラートで「SSH が入れない」と知らされる場面——ターミナルに ssh: connect to host … port 22: Connection refused と出た瞬間、心臓が少し速くなるのは誰もが同じです。さらに VNC もクラウドコンソールも手元になければ、黒い画面を睨むしかありません。

現場では月に何度かこの相談を受けます。sshd_config を直したあと reload を忘れた、セキュリティグループで 80/443 だけ開けて 22 を忘れた、fail2ban が自宅回線の IP を黙って ban した——原因はバラバラですが、Connection refused はだいたい筋道が通っています。本記事では実戦で効く五つの切り分け手順を、エラーを読んでから層ごとに降りる順で整理します。多くのケースは二十分以内に原因が見えます。

前提として、別ルートでサーバーに触れる手段(クラウド VNC、シリアルコンソール、同一 VPC 内の別マシン)がある想定です。完全に手が届かない場合は、文末の「完全に遮断されたとき」へ進んでください。

22
SSH 既定ポート
3 種
代表的なエラー
5 段
層別チェック

切り分けの前に:「繋がらない」は三種類ある

Connection refusedConnection timed outPermission denied を同じ問題として扱うと、一時間キーファイルを疑い続けることになります。OpenSSH 公式ドキュメントの意味づけに沿うと、それぞれ別レイヤーを指します。

Linux SSH Connection refused 五段階フロー:エラー確認、サービス、ファイアウォール、ポート設定、IP 封鎖
まずエラーで枝を選び、ネットワーク → サービス → ポリシーの順で進めれば、鍵の設定で一時間溶かす事故を防げます。
エラー文言 よくある意味 先に見る場所
Connection refused TCP は届いたが、対象ポートに待ち受けプロセスがない、または本機 FW が REJECT sshd の稼働、待受ポート、ufw/iptables
Connection timed out 途中でパケットが落ちた(経路、クラウド SG、上流 FW) セキュリティグループ、正しいグローバル IP、ポート到達性
Permission denied SSH ハンドシェイは成功したが認証に失敗(鍵・パスワード・ユーザー制限) 鍵の権限、AllowUsers、fail2ban による IP 封鎖
小技:-v で止まる位置を見る
クライアントで ssh -v user@host(必要なら -vvv)を実行し、「Connecting」で止まるか「Authenticating」で止まるかを確認します。前者はネットワーク/ポート、後者は鍵とユーザー設定の問題です。

この区別を最初に押さえるだけで、無駄な作業が大きく減ります。Connection refused はパケットがサーバーに届いているサイン——問題はサーバー側か、そのすぐ手前です。timed out は経路上のどこかで黙殺されているので、届かないマシンの sshd_config をいじっても意味がありません。Permission denied は TCP セッションは成立しているので、認証情報・アカウント方針・IP ban を疑います。

チーム運用では、インシデントチャットにエラー全文を貼ってください。「SSH 死んだ」だけでは当たりがつきません。「オフィス IP から 2222 で Connection refused」なら、検索範囲が一気に狭まります。

手順 1:IP・DNS・ポート到達性の確認(ネットワーク層)

sshd を疑う前に、道が通っているかを示してください。新規 VPS で多いのは IP の打ち間違い、DNS 未反映、非標準ポートで待ち受けているのに 22 で繋いでいるパターンです。

手元の PCから、次の順で実行します。

クライアント側ネットワーク確認
# 1. 名前解決された IP が正しいか
                dig +short your.domain.com
                ping -c 3 your.server.ip

                # 2. SSH ポートが開いているか(22 は実際のポートに置き換え)
                nc -zv your.server.ip 22
                # または
                telnet your.server.ip 22

                # 3. ポートを明示して接続(~/.ssh/config の影響を避ける)
                ssh -p 22 -i ~/.ssh/id_ed25519 user@your.server.ip

ncConnection refused を返すなら、パケットはサーバーに届いています——原因は本機サービスか本機ファイアウォールです。手順 2 へ。timed out やハングなら、クラウドのセキュリティグループ/Network ACLを優先:入站で TCP 22(またはカスタムポート)が許可されているか、送信元が 0.0.0.0/0 か、誤ってプライベート帯だけになっていないかを確認します。

自宅・会社の回線も見落としがちです。企業 VPN、学園ネット、一部 ISP は 22 をフィルタします。一時的に sshd を 443 や 2222 に移して比較テストすると、経路側のフィルタかサーバー本体かが切り分けやすくなります。

複数台を運用しているなら、公開 IP と SSH ポートのメモを残しておくと、旧チケットから IP をコピペして繋がらなくなる事故が減ります。ホスト名接続では TTL とキャッシュも忘れずに——レジストラで直した直後でも、手元の dig +short が古いアドレスを指していることがあります。

手順 2:sshd サービスの稼働確認

Connection refused の最多原因のひとつ:sshd が起動していない、または OS アップグレード後にユニット名が変わったケースです。Ubuntu/Debian では ssh、RHEL/CentOS/Rocky では sshd が一般的——推測せずコマンドで確認してください。

VNC やクラウドコンソールで入ったあと、次を実行します。

サーバー側 sshd 状態
# Debian/Ubuntu
                sudo systemctl status ssh
                sudo systemctl start ssh
                sudo systemctl enable ssh

                # RHEL/CentOS/Rocky
                sudo systemctl status sshd
                sudo systemctl start sshd

                # 待ち受けているか? アドレスとポートは?
                sudo ss -tlnp | grep ssh
                # 0.0.0.0:22 または [::]:22 が期待値

                # 設定構文チェック(編集のたびに実行)
                sudo sshd -t
                sudo systemctl reload ssh   # または sshd

systemctl statusfailed なら、すぐ sudo journalctl -u ssh -n 50 --no-pager でログを確認。設定の typo、HostKey ファイル欠落、ListenAddress の誤った NIC 指定が典型です。修正後は必ず sshd -t → reload の順——reload だけして sshd が起動せず、自分を締め出すパターンは現場で本当に多いです。

再インストール直後は openssh-server の有無も確認:sudo apt install openssh-server(Debian 系)、sudo dnf install openssh-server(RHEL 系)。最小イメージは SSH サーバー無しで届くことがあります。

ディスク満杯でも sshd が起動しない・セッションを張れないことがあります。コンソールで df -h を見るだけで十分なことが多いです。MaxStartups を攻撃対策で絞りすぎると、負荷時に正当な接続まで refused になることも——journalctl の drop 系メッセージを確認してください。

手順 3:本機ファイアウォールとクラウドセキュリティグループ

sshd は動いていて ss にも LISTEN が見えるのに外から refused——次はパケットを捨てる/拒否するルールです。Linux サーバーではクラウド SG(NIC 外側)と ufw/iptables/nftables(OS 内側)の二重構造が普通で、両方で SSH ポートを許可する必要があります。

OS 内での代表的な確認:

ファイアウォール確認(Ubuntu ufw 例)
sudo ufw status verbose
                sudo ufw allow 22/tcp
                sudo ufw allow 2222/tcp   # ポート変更時
                sudo ufw reload

                # firewalld(CentOS など)
                sudo firewall-cmd --list-all
                sudo firewall-cmd --permanent --add-service=ssh
                sudo firewall-cmd --reload

                # nftables/iptables を直接確認
                sudo iptables -L INPUT -n -v

クラウド SG は SSH が死んでいるとプロバイダコンソールからしか直せません。TCP であること、ポート範囲に SSH ポートが含まれること、送信元 CIDR が一台の内部ネットワークホストだけに狭まっていないことを確認。検証中は一時的に 0.0.0.0/0 で開け、接続確認後にオフィス出口 IP へ絞るのが安全です。

Docker や Kubernetes を載せていると iptables が自動書き換えされます。sudo iptables-save | grep 22 で ACCEPT より前に DROP/REJECT が挿さっていないかを見てください。最小露出と SSH/HTTPS のポート設計については、OpenClaw Linux クラウド VPS 最小露出:ファイアウォール雛形と SSH/HTTPS 意思決定マトリクス FAQも併読すると判断が早くなります。

IPv6 の見落としも定番です。IPv4 の SG だけ直して、クライアントが AAAA 経由で繋ごうとして v6 側が塞がれている——ssh -4ssh -6 で挙動が変わるか試す価値があります。

FW 変更前の「保険」
いまの SSH セッションを切る前に、五分後に旧ルールへ戻すタイマー(ufw の自動無効化など)を仕込んでください。新ルールで締め出されても、復旧の窓が残ります。

どの層で塞がれていたかを記録しておくと、次に誰かが「セキュリティ強化」したとき同じ outage を繰り返しにくくなります。ufw だけ直して SG を忘れるチームは、半年後にまた同じ話をします。

手順 4:ポートと sshd_config の突合

セキュリティのため 22 以外に移した、ListenAddress を内部ネットワークだけにした——のにクライアントは 22 のまま、というのは refused の定番です。設定は /etc/ssh/sshd_config。主要項目(詳細は sshd_config マニュアル):

sshd_config 要点
Port 2222
                # ListenAddress 0.0.0.0   # 既定は全 NIC;127.0.0.1 だと外から入れない
                PermitRootLogin prohibit-password
                PasswordAuthentication no
                AllowUsers deploy admin

安全なポート変更の順序:新ポートで LISTEN を確認 → ファイアウォール更新 → 旧ポートを閉じる。いきなり「22 を 2222 に変えて SG の 22 も閉じる」と、新ポートの検証前に締め出されます。

RHEL 系で SELinux 有効時は、ポート変更後に sudo semanage port -a -t ssh_port_t -p tcp 2222 が必要なことがあります。Ubuntu の AppArmor もパス制限でログに明示されます。

クライアントの ~/.ssh/configPortHostName が誤っていないかも確認。Host prod エイリアス運用で -p を付け忘れるのは、チームあるあるです。

AllowUsersDenyUsers の変更直後は、TCP は通るのに認証で落ちる——あるいは早期切断——ように見えることがあります。ローカルのユーザー名とサーバー側許可リストを突き合わせてください。踏み台や ProxyJump 構成では、最終ホップだけ refused という見え方もします。各段を ncssh -J で個別に試すと早いです。

手順 5:IP 封鎖の確認(fail2ban / hosts.deny)

refused ではなく Permission denied なのに鍵は正しいはず——なら IP ban を疑います。fail2ban はパスワード失敗や異常ハンドシェイのあと iptables や hosts.deny にルールを足します。fail2ban Wiki に jail の仕組みがまとまっています。

サーバー上で確認:

封鎖の確認
# fail2ban 状態
                sudo fail2ban-client status sshd
                sudo fail2ban-client set sshd unbanip YOUR.CLIENT.IP

                # 従来の hosts ベース封鎖
                grep -v '^#' /etc/hosts.deny
                grep -v '^#' /etc/hosts.allow

                # クラウドの「運用ロック」や DDoS 緩和
                # → コンソールでセキュリティアラート・一時 IP ブロックを確認

自分で自分を ban するのは珍しくありません。スクリプトの誤動作で短時間に大量の失敗ログが出ると、オフィス出口 IP が jail に入ります。解除後は ignoreip に管理者ネットを入れるか、パスワード認証を切って鍵のみにすると誤検知が減ります。

Jenkins や GitLab Runner など、VPS へ SSH バックする Agent を併用していると、登録失敗が SSH 異常に見えることもあります。ハイブリッド構成では Controller と Agent の経路を別図にした方がよい——Jenkins ハイブリッドトポロジ:VPS Controller とクラウド Mac JNLP エンタープライズプールを参照してください。

完全に遮断されたとき:救援ルートを使う

五手順でも戻れない場合、優先度順に試します。

  • クラウド VNC/シリアルコンソール——SSH に依存せず直接ログインして設定修正
  • スナップショット復元——変更前に撮っていれば、徹夜より安い
  • シングルユーザーモード/レスキューイメージ——元ディスクをマウントして chroot し sshd_config を編集
  • サポートチケット——ベンダーが一時的にポート開放やブロック解除してくれる場合あり

教訓は一つ:唯一の SSH セッションで「切れるかもしれない変更」をしない。第二ターミナルを開く、tmux を使う——ファイアウォールと sshd の編集は特にそうです。

復旧後は三行の振り返りを残すと、次のオンコールが助かります。何を変えたか、どの信号を見逃したか、どのバックアップ経路が効いたか——だけで十分です。

予防チェックリスト:次の慌てを減らす

インシデント後に十分だけ手を入れると、次回のパニックが安くなります。

  • 鍵認証+パスワード無効、~/.ssh/authorized_keys は 600
  • 非標準ポートは可——セキュリティグループと sshd_config を同時に変更
  • fail2ban の ignoreip に信頼ネットワークを登録
  • reload 前に sshd -t、危険な変更前にスナップショット
  • 監視は SSH 22 の生死だけに頼らず、Agent や内部ネットワークヘルスチェックを併用

固定出口 IP の踏み台を一台用意し、本番ノードの SG はそこからだけ許可する——カフェの Wi‑Fi IP を唯一の鍵にしない、という設計が長期的に楽です。

一文まとめ
エラーで refused/timeout/denied を分け、ネットワーク → サービス → ファイアウォール → 設定 → 封鎖の順に剥く。SSH 接続拒否の多くは二段目か三段目で終わります。

安定した踏み台で、切り分けの不安を減らす

複数の Linux VPS を扱う現場では、固定出口 IP の踏み台で SSH を中継する構成がよく使われます。本番の SG は踏み台だけ許可し、手元からは鍵でチェーン接続。Mac mini は Unix 環境がそのまま使え、ターミナルと OpenSSH が初期状態で揃っている点が向いています。M4 チップは待機時およそ 4W——24 時間つけっぱなしの中継ノードとして、机の下の x86 小箱より静かで省電力です。

同価格帯の Windows を常時稼働させると消費電力とファン音が目立ちます。macOS は長時間稼働の安定感があり、FileVault と Gatekeeper で秘密鍵を置く心理的ハードルも下がります。Xcode や Docker でリリースも踏み台と兼用したいなら、クラウド Mac mini で中継+ビルドを一台にまとめ、コンテキスト切り替えを減らせます。

信頼できるリモート運用基盤を組みたいなら、 VPSSPark クラウド Mac mini M4 は低消費電力の踏み台兼開発ノードとして現実的な選択肢です—— プランを見る 。深夜の SSH 切り分けを一人で抱え込まなくて済むように。

期間限定

SSHが切れても慌てない——安定したクラウドノードを

低消費電力 Mac mini · ネイティブ Unix 踏み台 · 24時間稼働

ホームへ
期間限定 プランを見る