EC2 인스턴스와 SSH를 연결하려고 시도할 때 "Connection refused" 또는 "Connection timed out" 오류가 발생합니다. 이 오류를 해결하려면 어떻게 해야 합니까?

최종 업데이트 날짜: 2020년 8월 21일

SSH를 사용하여 Amazon EC2(Amazon Elastic Compute Cloud) 인스턴스에 연결하려고 할 때 "Connection refused" 또는 "Connection timed out" 오류가 발생합니다. 이 오류를 해결하려면 어떻게 해야 합니까?

간략한 설명

오류 메시지: "Error connecting to [instance], reason: Connection timed out: connect"는 인스턴스 연결에 문제가 있고, 요청이 인스턴스에 도달하지 못하고 시간이 초과하였음을 의미합니다. SSH가 인스턴스에서 실행되고 있지 않거나 방화벽이 액세스를 차단하는 경우 이러한 문제가 발생할 수 있습니다.

오류 메시지:  "ssh: connect to host ec2-X-X-X-X.compute-1.amazonaws.com port 22: Connection refused"는 인스턴스가 연결을 거부했거나 SSH 서비스 데몬이 실행되고 있지 않음을 나타냅니다. 방화벽에서 인스턴스에 대한 액세스를 거부하는 경우에도 이 오류가 발생할 수 있습니다.

해결 방법

연결을 차단하는 방화벽이 없는지, SSH 서비스가 인스턴스에서 실행 중인지, SSH tcp 포트 22가 수신 대기 상태인지 확인합니다.

이러한 작업을 실행하는 방법은 세 가지가 있습니다.

방법 1: AWS Systems Manager 세션 관리자 사용

참고: 이 방법을 사용하려면 SSM 에이전트가 필요합니다. Session Manager에 대한 자세한 내용과 전체 사전 조건 목록은 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 인스턴스를 중지하고 시작해야 합니다. 인스턴스를 중지했다가 다시 시작하면 인스턴스 스토어 데이터가 손실됩니다. 사용하는 인스턴스가 인스턴스 스토어 지원 인스턴스이거나 인스턴스에 데이터가 포함된 인스턴스 스토어 볼륨이 있으면 인스턴스 중지 시 데이터가 손실됩니다. 자세한 내용은 인스턴스의 루트 디바이스 유형 확인을 참조하십시오.
  • 인스턴스가 Amazon EC2 Auto Scaling 그룹의 일부이거나 Amazon EMR, AWS CloudFormation, AWS Elastic Beanstalk 등과 같이 AWS Auto Scaling을 사용하는 서비스에서 인스턴스를 시작한 경우 인스턴스를 중단하면 인스턴스가 종료될 수 있습니다. 이 시나리오에서 인스턴스 종료는 Auto Scaling 그룹에 대한 인스턴스 축소 보호 설정에 따라 달라집니다. 인스턴스가 Auto Scaling 그룹의 일부인 경우, 문제 해결 단계를 시작하기 전에 Auto Scaling 그룹에서 일시적으로 인스턴스 제거합니다.
  • 인스턴스를 중지했다가 시작하면 인스턴스의 퍼블릭 IP 주소가 변경됩니다. 외부 트래픽을 인스턴스로 라우팅할 때에는 퍼블릭 IP 주소 대신 탄력적 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) 대화 상자에서 사용자 데이터 스크립트를 삭제합니다.