SSH接続が拒否された時の完全解決ガイド – エラー別対処法と予防策

Web

「ssh: connect to host xxx port 22: Connection refused」

このエラーメッセージを見て、途方に暮れていませんか?

大丈夫です!このエラーは必ず解決できます。

SSH接続が拒否される原因は実はパターン化されていて、順番にチェックしていけば必ず原因が見つかります。

この記事では、10分以内に問題を特定して解決する方法を、実際のエラーメッセージごとに分かりやすく解説していきます。

焦らず、一緒に一つずつ確認していきましょう!

スポンサーリンク

まず確認!3つの基本チェックポイント

1. ネットワーク接続は正常?

最初に、そもそもサーバーに到達できるか確認しましょう。

ping サーバーのIPアドレス

実例:

ping 192.168.1.100

応答がない場合:

  • ネットワークケーブルの接続確認
  • Wi-Fiの接続状態確認
  • サーバーの電源が入っているか確認

2. 正しいIPアドレス?

意外と多いのが、IPアドレスの打ち間違いです。

# 接続先の確認
echo "接続しようとしているIP: 192.168.1.100"

# 自分のIPアドレス確認(同一ネットワークか確認)
ip addr show  # Linux
ifconfig      # Mac
ipconfig      # Windows

3. ポート番号は合ってる?

標準は22番ですが、変更されている場合があります。

# ポートが開いているか確認
telnet サーバーIP 22
# または
nc -zv サーバーIP 22

エラーメッセージ別の解決方法

「Connection refused」の解決法

エラーメッセージ:

ssh: connect to host 192.168.1.100 port 22: Connection refused

原因1:SSHサービスが起動していない

サーバー側で確認:

# SSHサービスの状態確認
sudo systemctl status ssh     # Ubuntu/Debian
sudo systemctl status sshd    # CentOS/RHEL

# 起動していない場合は起動
sudo systemctl start ssh
sudo systemctl enable ssh  # 自動起動設定

原因2:ファイアウォールでブロックされている

サーバー側の確認と解決:

UFW(Ubuntu)の場合:

# 状態確認
sudo ufw status

# SSH許可
sudo ufw allow ssh
sudo ufw allow 22/tcp

# 特定IPからのみ許可
sudo ufw allow from 192.168.1.0/24 to any port 22

firewalld(CentOS)の場合:

# 状態確認
sudo firewall-cmd --list-all

# SSH許可
sudo firewall-cmd --permanent --add-service=ssh
sudo firewall-cmd --reload

原因3:ポート番号が違う

# 別のポートで試す
ssh -p 2222 user@192.168.1.100

「Permission denied」の解決法

エラーメッセージ:

Permission denied (publickey,password).

原因1:パスワード/ユーザー名が間違っている

チェックポイント:

  • 大文字小文字を確認
  • ユーザー名のスペルミス
  • Caps Lockがオンになっていないか
# 正しいユーザー名で再試行
ssh 正しいユーザー名@サーバーIP

# パスワード認証を明示的に指定
ssh -o PreferredAuthentications=password user@server

原因2:鍵認証の設定ミス

# 鍵ファイルの権限確認
ls -la ~/.ssh/
# 正しい権限:
# .ssh ディレクトリ: 700
# 秘密鍵: 600
# 公開鍵: 644

# 権限修正
chmod 700 ~/.ssh
chmod 600 ~/.ssh/id_rsa
chmod 644 ~/.ssh/id_rsa.pub

# 正しい鍵を指定
ssh -i ~/.ssh/正しい鍵ファイル user@server

原因3:パスワード認証が無効化されている

サーバー側の/etc/ssh/sshd_configを確認:

# サーバー側で設定確認
sudo grep "PasswordAuthentication" /etc/ssh/sshd_config

# noになっている場合はyesに変更
sudo nano /etc/ssh/sshd_config
# PasswordAuthentication yes

# 設定反映
sudo systemctl restart sshd

「Connection timed out」の解決法

エラーメッセージ:

ssh: connect to host 192.168.1.100 port 22: Connection timed out

原因1:ネットワーク経路の問題

# 経路確認
traceroute サーバーIP  # Linux/Mac
tracert サーバーIP     # Windows

# MTU値の問題かもしれない
ssh -o IPQoS=throughput user@server

原因2:セキュリティグループ(AWS/クラウド)

AWS EC2などの場合:

  1. AWSコンソールにログイン
  2. EC2 → セキュリティグループ
  3. インバウンドルールで22番ポートが開いているか確認
  4. 自分のIPアドレスからの接続が許可されているか確認

原因3:ISPやルーターでブロック

# 別のポートで試す(443番はHTTPSなので通りやすい)
ssh -p 443 user@server

# VPN経由で試す
# VPN接続後に再度SSH接続を試みる

「Host key verification failed」の解決法

エラーメッセージ:

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@    WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!     @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

解決方法:

# 古いホストキーを削除
ssh-keygen -R サーバーIP

# または特定の行を削除
nano ~/.ssh/known_hosts
# 該当する行を削除

# 再接続
ssh user@server

体系的トラブルシューティング手順

ステップ1:接続性の確認

# 1. ping確認
ping -c 4 サーバーIP

# 2. ポートスキャン
nmap -p 22 サーバーIP

# 3. telnetで確認
telnet サーバーIP 22

ステップ2:サーバー側の確認

サーバーにコンソールアクセスできる場合:

# 1. SSHサービス状態
sudo systemctl status sshd

# 2. ポートリッスン確認
sudo netstat -tlnp | grep :22
sudo ss -tlnp | grep :22

# 3. ログ確認
sudo tail -f /var/log/auth.log      # Ubuntu
sudo tail -f /var/log/secure        # CentOS

# 4. 設定ファイル確認
sudo sshd -T | grep -E "(port|permit|password|pubkey)"

ステップ3:詳細デバッグモード

# クライアント側で詳細ログ出力
ssh -vvv user@server

# 出力を分析
# "Connection refused" → サービス停止かファイアウォール
# "No route to host" → ネットワーク問題
# "Permission denied" → 認証問題

よくある設定ミスと対処法

設定ミス1:rootログインの禁止

# /etc/ssh/sshd_configで
PermitRootLogin no  # これが原因

# 一般ユーザーでログインしてからsuする
ssh user@server
sudo su -

設定ミス2:AllowUsersの制限

# /etc/ssh/sshd_configに特定ユーザーのみ許可設定がある
AllowUsers user1 user2

# 自分のユーザーを追加
AllowUsers user1 user2 myuser

設定ミス3:ホスト制限

# /etc/hosts.denyで拒否されている
# /etc/hosts.denyを確認
cat /etc/hosts.deny

# /etc/hosts.allowに追加
echo "sshd: あなたのIP" >> /etc/hosts.allow

設定ミス4:SELinuxの影響(CentOS/RHEL)

# SELinux状態確認
getenforce

# 一時的に無効化してテスト
sudo setenforce 0

# 恒久的な設定変更が必要な場合
sudo setsebool -P ssh_port_forwarding on

環境別の特殊な対処法

Docker/コンテナ環境

# ポートマッピング確認
docker port コンテナ名

# 正しいポートフォワーディング
docker run -p 2222:22 イメージ名

# コンテナ内でSSHサービス起動確認
docker exec コンテナ名 service ssh status

VirtualBox/VMware

ネットワーク設定確認:

  1. NAT → ポートフォワーディング設定が必要
  2. ブリッジ → 直接IPアドレスで接続可能
  3. ホストオンリー → ホストOSからのみ接続可能

WSL(Windows Subsystem for Linux)

# WSL内でSSHサービス起動
sudo service ssh start

# Windows側から接続
ssh user@localhost -p 22

# ファイアウォール許可が必要な場合も

緊急時の代替手段

方法1:コンソール接続を使う

  • VPSやクラウドの管理画面からコンソール接続
  • 物理サーバーなら直接キーボード・モニター接続

方法2:別のリモート接続方法

# VNC接続を試す
vncviewer サーバーIP:5901

# RDP(Windowsサーバーの場合)
rdesktop サーバーIP

方法3:レスキューモードで起動

多くのVPS/クラウドサービスで利用可能:

  1. 管理画面からレスキューモード起動
  2. レスキュー環境から本来のシステムをマウント
  3. SSH設定を修正

再発防止のベストプラクティス

1. 設定変更前のバックアップ

# 設定ファイルのバックアップ
sudo cp /etc/ssh/sshd_config /etc/ssh/sshd_config.backup

# 変更前にテスト
sudo sshd -t  # 設定ファイルの文法チェック

2. 複数の接続方法を確保

# 別ポートでもSSHを待ち受け
# /etc/ssh/sshd_configに追加
Port 22
Port 2222

3. fail2banの適切な設定

# 自分のIPをホワイトリストに
echo "あなたのIP" >> /etc/fail2ban/jail.local

4. 監視とアラート

# SSH接続を監視するスクリプト
#!/bin/bash
if ! ssh -o ConnectTimeout=5 user@server exit; then
    echo "SSH接続失敗" | mail -s "Alert: SSH Down" admin@example.com
fi

デバッグ用チェックリスト

接続できない時は、この順番でチェック:

□ ネットワーク関連

  • [ ] pingは通るか?
  • [ ] 正しいIPアドレスか?
  • [ ] ネットワーク的に到達可能か?

□ ポート関連

  • [ ] 22番ポート(または設定されたポート)は開いているか?
  • [ ] ファイアウォールで許可されているか?
  • [ ] ポートフォワーディングは正しいか?

□ サービス関連

  • [ ] SSHサービスは起動しているか?
  • [ ] 設定ファイルにエラーはないか?
  • [ ] ログにエラーは出ていないか?

□ 認証関連

  • [ ] ユーザー名は正しいか?
  • [ ] パスワード/鍵認証の設定は正しいか?
  • [ ] 権限設定は適切か?

まとめ – もう「接続拒否」で悩まない!

SSH接続が拒否される問題について、あらゆる角度から解決方法を解説してきました。

重要なポイント:

  • エラーメッセージが解決の手がかり
  • 基本的な確認から順番に進める
  • サーバー側とクライアント側の両方をチェック
  • ログファイルは問題解決の宝庫
  • 予防策を講じて再発を防ぐ

問題解決の黄金ルール:

  1. 慌てずにエラーメッセージを読む
  2. 基本的なことから順番に確認
  3. ログを確認して原因を特定
  4. 一つずつ設定を変更してテスト
  5. 解決したら原因と対策を記録

どんなに複雑に見える問題も、一つ一つ確認していけば必ず解決できます。

このガイドを参考に、SSH接続の問題を素早く解決して、快適なリモート作業環境を実現してください!

困った時は、いつでもこのガイドに戻ってきてくださいね。

コメント

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