EC2 インスタンスに SSH で接続しようとすると、「接続が拒否されました」または「接続がタイムアウトしました」というエラーが表示されます。どうすればこのエラーを解決できますか?

最終更新日: 2020 年 8 月 21 日

SSH を使用して Amazon Elastic Compute Cloud (Amazon EC2) インスタンスに接続しようとすると、「接続が拒否されました」または「接続がタイムアウトしました」というエラーが表示されます。どうすればこのエラーを解決できますか?

簡単な説明

エラーメッセージ: 「[インスタンス] への接続中にエラーが発生しました。理由: 接続がタイムアウトしました: 接続」は、インスタンスへの接続に問題があることを示しています。つまり、リクエストがインスタンスに到達できず、タイムアウトになっています。インスタンスで SSH が実行されていない場合や、ファイアウォールがアクセスをブロックしている場合に発生することがあります。

エラーメッセージ: 「ssh:ホスト ec2-X-X-X-X.compute-1.amazonaws.com ポート 22 に接続: 接続が拒否されました」は、インスタンスが接続を拒否したか、SSH サービスデーモンが実行されていないことを示します。このエラーは、ファイアウォールがインスタンスへのアクセスを拒否している場合も発生することがあります。

解決方法

接続をブロックするファイアウォールがないこと、SSH サービスがインスタンスで実行されていること、および SSH tcp ポート 22 がリッスン状態であることを確認します。

これらのタスクを実行する方法は 3 つあります。

方法 1: AWS Systems Manager のセッションマネージャーを使用する

注意: この方法を使用するには、SSM エージェントをインストールする必要があります。Session Manager の詳細と前提条件の一覧については、セッションマネージャーの使用開始をご参照ください。

1.    AWS Systems Manager コンソールを開きます。

2.    セッションを開始します

3.    ファイアウォールを無効にして SSH サービスを再開するには、次のコマンドを実行します。

$ sudo iptables -F
$ sudo service sshd restart

注意: 前述のコマンドは、ポート 22 だけでなく、すべての iptables ルールをフラッシュします。ご使用のインスタンスへのアクセスを回復したら、ファイアウォール設定 (例: ufw、firewalld、iptables) を確認します。

4.    SSH tcp ポート (22) がリッスン状態であることを確認します。

$ sudo netstat -tnlp | grep :22
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      849/sshd
tcp6       0      0 :::22                   :::*                    LISTEN      849/sshd

5.    セッションを終了します

6.    SSH を使ってインスタンスに接続します。

方法 2: AWSSupport-TroubleshootSSH オートメーションドキュメントを実行する

AWSSupport-TroubleshootSSH オートメーションドキュメントは、Amazon EC2Rescue ツールをインスタンスにインストールします。次に、このツールが、SSH 経由で Linux マシンに接続する時にリモート接続エラーを引き起こすいくつかの問題を確認して修正します。詳細については、AWSSupport-TroubleshootSSH オートメーションのワークフローを使用して、SSH 接続の問題をトラブルシューティングする方法を教えてくださいをご参照ください。

方法 3: ユーザーデータスクリプトを使用する

重要

  • この手順では、EC2 インスタンスを停止して開始する必要があります。インスタンスを停止して再開すると、インスタンスストアデータは失われます。インスタンスが instance store-backed であるか、またはインスタンスにデータを含むインスタンスストアボリュームがある場合、インスタンスが停止するとデータが失われることにご注意ください。詳細については、「インスタンスのルートデバイスタイプの判別」を参照してください。
  • インスタンスが Amazon EC2 Auto Scaling グループの一部である場合、またはインスタンスが AWS Auto Scaling を使用するサービス (Amazon EMR、AWS CloudFormation、AWS Elastic Beanstalk など) によって起動された場合は、インスタンスを停止することでインスタンスが終了される可能性があります。このシナリオでのインスタンスの削除は、Auto Scaling グループのインスタンススケールイン保護設定によって異なります。インスタンスが Auto Scaling グループの一部である場合は、解決手順を開始する前に、一時的に Auto Scaling グループからインスタンスを削除してください。
  • インスタンスを停止および再開すると、インスタンスのパブリック IP アドレスが変更されます。インスタンスに外部トラフィックをルーティングする際は、パブリック IP アドレスではなく Elastic IP アドレスを使用することをお勧めします。

1.    EC2 インスタンスコンソールログを表示します。ufw が有効な場合、EC2 インスタンスコンソールログに次のエントリが表示されます。

systemd[1] : starting Uncomplicated Firewall
Starting Uncomplicated firewall...

2.    Amazon EC2 コンソールを開きます。

3.    ナビゲーションペインで [インスタンス] を選択し、接続しようとしているインスタンスをクリックします。

4.    インスタンスを停止します

5.    [アクション]、[インスタンス設定]、[ユーザーデータを表示/変更] の順に選択します。

6.    ユーザーデータスクリプトを [ユーザーデータを表示/変更] ダイアログボックスにコピーして、[保存] をクリックします。

--//
Content-Type: text/cloud-config; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment; filename="cloud-config.txt"

#cloud-config
cloud_final_modules:
- [scripts-user, always]

--//
Content-Type:
    text/x-shellscript; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment; filename="userdata.txt"

#!/bin/bash
iptables -F
service sshd restart
--//

注意: 前述のコマンドは、ポート 22 だけでなく、すべての iptables ルールをフラッシュします。インスタンスへのアクセスを回復したら、ファイアウォール設定 (例: ufw、firewalld、iptables) を確認します。

7.    SSH を使ってインスタンスに接続します。

8.    前述のユーザーデータスクリプトは、インスタンスを再起動するたびに実行されるように設定されています。インスタンスへのアクセスを回復したら、ユーザーデータスクリプトを削除します。

ユーザーデータの削除方法:

1.    方法 3: ユーザーデータスクリプトを使用するセクションの手順 1~4 を実行します。

2.    [View/Change User Data (ユーザーデータを表示/変更)] ダイアログボックスでユーザーデータスクリプトを削除します。