SSH를 사용하여 내 EC2 인스턴스에 연결하려고 하면 "연결 거부" 또는 "연결 시간 초과" 오류가 발생합니다. 이 문제를 해결하려면 어떻게 해야 하나요?

7분 분량
0

SSH를 사용하여 Amazon Elastic Compute Cloud(Amazon EC2) 인스턴스에 연결하려고 하면 "연결 거부" 또는 "연결 시간 초과" 오류가 발생합니다.

간략한 설명

오류 메시지: "ssh: connect to host ec2-X-X-X-X.compute-1.amazonaws.com port 22: 연결 시간 초과". 이 오류 메시지는 SSH 클라이언트에서 발생합니다. 이 오류는 서버가 클라이언트에 응답하지 않아 클라이언트 프로그램이 중단(제한 시간 초과)되었음을 나타냅니다. 이 오류의 일반적인 원인은 다음과 같습니다.

  • 보안 그룹 또는 네트워크 ACL이 액세스를 허용하지 않습니다.
  • 인스턴스의 운영 체제에 방화벽이 있습니다.
  • 클라이언트와 서버 사이에 방화벽이 있습니다.
  • 호스트가 존재하지 않습니다.

오류 메시지: "ssh: connect to host ec2-X-X-X-X.compute-1.amazonaws.com port 22: 연결이 거부됨". 이 메시지는 호스트로부터 원격으로 전송됩니다. 이 오류의 일반적인 원인은 다음과 같습니다.

  • 호스트가 인스턴스에 도달했지만 SSH 포트에서 수신 대기하는 서비스가 없었습니다.
  • 방화벽이 차단되었고 패키지를 삭제하는 대신 거부하도록 설정되었습니다.

해결 방법

"연결 시간 초과" 오류

"연결 시간 초과" 오류의 경우 다음을 확인하세요.

  • 인스턴스의 IP 주소 또는 호스트 이름이 정확합니다.
  • 인스턴스가 상태 확인을 통과합니다.
  • 인스턴스의 보안 그룹이 TCP 포트 22에서 들어오는 트래픽을 허용합니다.
  • 인스턴스 서브넷의 네트워크 ACL이 TCP 포트 22에서 들어오는 트래픽을 허용하고 발신 트래픽에 임시 포트를 허용합니다.
  • 인스턴스 서브넷의 라우팅 테이블이 EC2 인스턴스와 SSH 클라이언트 간의 연결을 제공하도록 올바르게 구성되어 있습니다.
  • SSH 클라이언트와 EC2 인스턴스 간의 연결을 차단하는 방화벽은 없습니다.
  • SSH가 인스턴스의 TCP 래퍼(Red Hat 웹사이트)에 의해 차단되지 않습니다.

참고: 마지막 두 확인 단계에서는 OS 수준의 인스턴스 액세스가 필요합니다.

"연결 거부" 오류

"연결 거부" 오류의 경우, 다음을 확인하세요.

  • 인스턴스에 SSH 연결을 거부하는 방화벽이 없습니다.
  • SSH 대몬(daemon)(sshd)이 포트 22에서 실행 및 수신 중입니다.

참고: 두 확인 단계 모두 OS 수준의 인스턴스 액세스가 필요합니다.

인스턴스가 두 상태 확인을 모두 통과한 경우 구성에 다음 네 가지 방법 중 하나를 사용하세요.

  • 방법 1: Linux용 EC2 직렬 콘솔을 사용합니다.
  • 방법 2: AWS Systems Manager Session Manager를 사용합니다.
  • 방법 3: AWSSupport-TroubleshootSSH 자동화 런북을 실행합니다.
  • 방법 4: 사용자 데이터 스크립트를 사용합니다.

방법 1: Linux용 EC2 직렬 콘솔 사용

Linux용 EC2 직렬 콘솔을 구성한 경우 이를 사용하여 지원되는 Nitro 기반 인스턴스 유형에서 OS 수준 문제를 해결할 수 있습니다. 직렬 콘솔에서 부팅 문제, 네트워크 구성 및 SSH 구성 문제를 해결할 수 있습니다. Amazon EC2 콘솔이나 AWS Command Line Interface(AWS CLI)를 사용하여 직렬 콘솔에 액세스할 수 있습니다.

직렬 콘솔을 사용하기 전에 계정 수준에서 직렬 콘솔에 액세스 권한을 부여해야 합니다. 그런 다음, IAM 사용자에게 액세스 권한을 부여하는 AWS Identity and Access Management(IAM) 정책을 생성합니다.

참고: 직렬 콘솔을 사용하는 각 인스턴스에는 sudo 액세스 권한이 있는 암호 기반 Linux 사용자가 한 명 이상 포함되어야 합니다.

Linux용 EC2 직렬 콘솔 구성에 대한 자세한 내용은 EC2 직렬 콘솔 액세스 구성을 참고하세요. 로그인 비밀번호가 구성된 Linux 계정이 없는 경우, ssm-user를 실행하여 sudo 액세스가 있는 계정의 비밀번호를 재설정해야 합니다. ssm-user 명령 실행에 대한 자세한 내용은 Linux 및 macOS에서 ssm-user sudo 계정 권한 관리를 참조하세요.

구성 후에는 암호로 구성된 Linux 사용자를 사용하여 EC2 직렬 콘솔을 통해 EC2 인스턴스에 연결합니다.

그리고 다음 명령을 실행합니다. 이러한 명령은 SSH 연결이 OS 방화벽 또는 TCP 래퍼에 의해 차단되지 않는지 확인합니다. sshd 서비스가 포트 22에서 실행 중이고 수신 중인지도 확인합니다.

1.    iptables 규칙이 구성된 경우, 다음 명령을 실행하여 기본 포트 22의 모든 SSH 연결을 허용하는 iptables에 규칙을 추가하세요.

$ sudo iptables -I INPUT 1 -p tcp --dport 22 -j ACCEPT

OS 기반 방화벽 대신 보안 그룹을 사용하는 것이 좋으므로 방화벽을 완전히 비활성화할 수 있습니다. OS 기반 방화벽을 비활성화하려면, 운영 체제에 따라 다음 명령 집합 중 하나를 사용하세요.

중요: 다음 명령은 모든 주요 iptables 규칙을 플러시합니다. 또한 들어오는 SSH 연결을 허용하는 규칙을 추가합니다. 또한 메인 체인의 기본 정책을 수락으로 변경하여 iptables 규칙을 플러시해도 인스턴스 네트워크 연결에 영향을 미치지 않도록 합니다. 이러한 명령은 모든 기본 iptables를 플러시하므로 기존 규칙도 플러시합니다.

UFW를 사용하는 배포판(Ubuntu, Debian)

$ sudo iptables -F
$ sudo iptables -P INPUT ACCEPT
$ sudo ufw disable

firewalld를 사용하는 배포판(Red Hat, CentOS)

$ sudo iptables -F
$ sudo iptables -P INPUT ACCEPT
$ sudo systemctl disable firewalld

참고: 인스턴스에 다시 액세스한 후 방화벽 구성(UFW, firewalld, iptables)을 검토하세요.

2.    SSH가 실행 중인지 확인하고 SSH TCP 포트(22)가 수신 상태인지 확인합니다.

$ sudo systemctl restart sshd
$ sudo ss -tpln | grep -iE '22|ssh'
LISTEN 0 128 *:22 *:* users:(("sshd",pid=1901,fd=3))
LISTEN 0 128 [::]:22 [::]:* users:(("sshd",pid=1901,fd=4))

참고: 시스템에 ss 명령이 없는 경우, 이전 예시에 나온 것과 같은 구문으로 레거시 netstat 명령을 사용할 수 있습니다.

3.    TCP 래퍼가 SSH 연결을 차단하고 있지 않은지 확인합니다.

$ if [[ $( cat /etc/hosts.[ad]* | grep -vE '^#' | awk 'NF' | wc -l) -ne 0 ]];\
then sudo sed -i '1i sshd2 sshd : ALL: allow' /etc/hosts.allow; fi

4.    다음으로 SSH를 사용하여 인스턴스에 연결합니다.

5.    더 필요하지 않은 경우 EC2 직렬 콘솔 세션의 연결을 끊습니다.

방법 2: AWS Systems Manager Session Manager 사용

참고: 이 방법을 사용하려면 인스턴스가 SSM 관리형 인스턴스이고 SSM 에이전트 핑 상태가 온라인이어야 합니다. 세션 관리자 및 전체 필수 구성 요소 목록에 대한 자세한 내용은 세션 관리자 설정을 참고하세요.

SSH 연결이 방화벽이나 TCP 래퍼에 차단되지 않고 sshd 서비스가 포트 22에서 실행 및 수신 대기하고 있는지 확인하려면 다음과 같이 합니다.

1.    AWS Systems Manager를 엽니다.

2.    Session Manager를 사용하여 인스턴스에 대한 세션을 시작합니다.

3.    방법 1: Linux용 EC2 직렬 콘솔 사용의 1~4단계를 따릅니다.

4.    더는 필요하지 않은 경우 Session Manage 세션을 닫습니다.

방법 3: AWSSupport-TroubleshootSSH 런북 실행

AWSSupport-TroubleshootSSH 자동화 런북은 Linux용 Amazon EC2Rescue 도구를 인스턴스에 설치합니다. 이 도구는 SSH를 통한 Linux 호스트 원격 연결을 방해하는 문제를 확인하고 해결하려고 시도합니다.

AWSSupport-TroubleshootSSH 런북을 실행하려면 다음과 같이 합니다.

1.    AWSSupport-TroubleshootSSH 페이지를 엽니다.

2.    이 자동화 실행(콘솔)을 선택합니다.

자세한 내용은 SSH를 사용하여 EC2 인스턴스에 연결하려고 하면 오류가 발생합니다. AWSSupport-TroubleshootSSH 자동화 워크플로를 사용하여 SSH 연결 문제를 해결하려면 어떻게 해야 하나요?를 참고하세요.

방법 4: 사용자 데이터 스크립트 사용

설명된 방법 중 해당 환경에 적합한 방법이 없으면 EC2 사용자 데이터 스크립트를 사용하세요. EC2 사용자 데이터 스크립트는 OS 수준 방화벽과 TCP 래퍼를 끈 다음 sshd 서비스를 다시 시작합니다.

중요:

  • 이 절차를 수행하려면 EC2 인스턴스를 중지하고 시작해야 합니다. 인스턴스에 인스턴스 스토어 볼륨에 저장된 데이터가 있는 경우, 해당 데이터는 인스턴스를 중지한 후에 삭제됩니다.
  • 인스턴스가 Amazon EC2 Auto Scaling 그룹에 속한 경우, 인스턴스를 종료하면 오토 스케일링 그룹 내의 인스턴스도 중지될 수 있습니다.
  • AWS Auto Scaling을 사용하는 서비스에서 인스턴스를 시작하는 경우, 인스턴스를 종료하면 오토 스케일링 그룹 내의 인스턴스도 중지될 수 있습니다.
  • 인스턴스 종료는 오토 스케일링 그룹의 인스턴스 축소 보호 설정에 따라 달라집니다. 인스턴스가 오토 스케일링 그룹에 속한 경우, 문제 해결 단계를 시작하기 전에 오토 스케일링 그룹에서 인스턴스를 일시적으로 제거해야 합니다.
  • 인스턴스를 중지하고 시작하면 인스턴스의 퍼블릭 IP 주소가 변경됩니다. 외부 트래픽을 인스턴스로 라우팅할 때는 공용 IP 주소 대신 탄력적 IP 주소를 사용하는 것이 좋습니다.

다음 단계에 따라 인스턴스의 사용자 데이터를 구성하세요.

1.    Amazon EC2 콘솔을 엽니다.

2.    탐색 창에서 인스턴스를 선택한 다음 연결하려는 인스턴스를 선택합니다.

3.    인스턴스를 중지합니다.

4.    작업, 인스턴스 설정, 사용자 데이터 편집을 선택합니다.

5.    다음 사용자 데이터 스크립트를 사용자 데이터 편집 대화 상자에 복사한 다음 저장을 선택합니다.

Content-Type: multipart/mixed; boundary="//"
MIME-Version: 1.0

--//
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 -P INPUT ACCEPT
iptables -F
systemctl restart sshd.service || service sshd restart
if [[ $( cat /etc/hosts.[ad]* | grep -vE '^#' | awk 'NF' | wc -l) -ne 0 ]];\
then sudo sed -i '1i sshd2 sshd : ALL: allow' /etc/hosts.allow; fi
--//

6.    SSH를 사용하여 인스턴스에 연결합니다.

7.    이전 사용자 데이터 스크립트는 인스턴스를 재부팅할 때마다 실행되도록 설정되어 있습니다. 인스턴스에 다시 액세스한 후 사용자 데이터 스크립트를 제거합니다.

참고: 위 명령은 모든 주요 iptables 규칙을 플러시합니다. 인스턴스에 다시 액세스한 후 방화벽 구성이 정확한지 검토합니다(예: UFW, firewalld, iptables).

사용자 데이터를 제거하려면 다음과 같이 합니다.

1.    방법 4: 사용자 데이터 스크립트 사용 섹션의 1~4단계를 완료합니다.

2.    사용자 데이터 편집 대화 상자에서 사용자 데이터 스크립트를 삭제합니다.

관련 정보

인스턴스에 연결하는 중 오류 발생: 연결 시간 초과

인터넷에서 Amazon EC2 인스턴스 연결 시간 초과 오류를 해결하려면 어떻게 해야 하나요?

SSH를 사용하여 Amazon EC2 Linux 인스턴스에 연결하는 데 발생하는 문제를 해결하려면 어떻게 해야 하나요?

EC2 Linux 인스턴스에 연결할 수 없고 상태 검사 중 하나 또는 둘 다 실패하는 이유는 무엇인가요?

AWS 공식
AWS 공식업데이트됨 일 년 전