내용으로 건너뛰기

SSH를 사용하여 EC2 인스턴스에 연결할 때 발생하는 "Connection refused" 또는 "Connection timed out" 오류를 해결하려면 어떻게 해야 합니까?

6분 분량
0

SSH를 사용하여 Amazon Elastic Compute Cloud(Amazon EC2) 인스턴스에 연결하면 "Connection refused" 또는 "Connection timed out" 오류가 발생합니다.

간략한 설명

연결 제한 시간이 초과되면 SSH 클라이언트로부터 다음 오류 메시지가 표시됩니다.

"ssh: connect to host ec2-X-X-X-X.compute-1.amazonaws.com port 22: Connection timed out"

Connection timed out 오류는 서버가 클라이언트에 응답하지 않아 클라이언트 프로그램이 중단(시간 초과)될 때 발생합니다.

호스트가 원격으로 연결을 거부하면 다음 오류 메시지가 표시됩니다.

"ssh: connect to host ec2-X-X-X-X.compute-1.amazonaws.com port 22: Connection refused"

해결 방법

"Connection timed out" 오류

Connection timed out 오류가 표시되면 다음 구성을 확인하십시오.

참고: 방화벽 또는 TCP 래퍼 관련 문제를 확인하려면 인스턴스에 대한 운영 체제(OS) 액세스 권한이 있어야 합니다.

"Connection refused" 오류

Connection refused 오류가 표시되면 다음 구성을 확인하십시오.

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

참고: 위 구성을 확인하려면 인스턴스에 대한 OS 수준 액세스 권한이 있어야 합니다.

두 상태 확인을 모두 통과한 인스턴스 관련 문제 해결

상태 확인을 통과한 인스턴스와 관련된 문제를 해결하려면 다음 문제 해결 방법 중 하나를 사용하십시오.

AWSSupport-TroubleshootSSH 런북 실행

AWSSupport-TroubleshootSSH 자동화 런북을 실행하는 것이 좋습니다. 런북은 인스턴스에 Amazon EC2Rescue 도구를 설치하여 Linux 호스트에 대한 원격 SSH 연결을 차단하는 문제를 파악하고 해결합니다.

Linux용 EC2 직렬 콘솔 사용

Linux용 EC2 직렬 콘솔을 사용하여 부팅 문제, 네트워크 구성 문제, 지원되는 인스턴스 유형에서 SSH 구성 문제 등과 같은 OS 수준 문제를 해결할 수 있습니다.

전제 조건:

  • AWS 계정 수준에서 콘솔에 대한 액세스 권한을 부여합니다.
  • IAM 사용자에게 콘솔 액세스 권한을 부여하는 AWS Identity and Access Management(IAM) 정책을 생성합니다.
    참고: EC2 직렬 콘솔을 사용하는 각 인스턴스에는 sudo 액세스 권한이 있는 암호 기반 Linux 사용자가 한 명 이상 있어야 합니다.

자세한 내용은 EC2 직렬 콘솔 액세스 구성을 참조하십시오.

로그인 암호가 구성된 Linux 계정이 없는 경우, ssm-user를 실행하여 sudo 액세스가 있는 계정의 암호를 재설정해야 합니다.

구성이 SSH 액세스를 차단하고 있지 않은지 확인하려면 다음 단계를 완료하십시오.

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

  2. iptables 규칙을 구성한 경우 다음 명령을 실행하여 포트 22의 모든 SSH 연결을 허용하는 iptables에 규칙을 추가합니다.

    sudo iptables -I INPUT 1 -p tcp --dport 22 -j ACCEPT
  3. OS 기반 방화벽을 사용하는 경우 방화벽을 비활성화합니다. 방화벽 대신 보안 그룹을 사용하는 것이 좋습니다. OS 기반 방화벽을 비활성화하려면 OS에 따라 다음 명령을 실행합니다.
    중요: 다음 명령은 모든 기본 iptables 규칙을 지우고 기존 규칙을 삭제합니다. 또한 이 명령은 인바운드 SSH 연결을 허용하는 규칙을 추가하고 기본 체인의 기본 정책을 ACCEPT로 변경합니다. 이 구성은 iptables 규칙을 지울 때 인스턴스 네트워크 연결에 영향을 주지 않습니다.
    Ubuntu 및 Debian과 같은 UFW를 사용하는 배포판:

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

    Red Hat Enterprise Linux(RHEL) 및 CentOS와 같은 방화벽을 사용하는 배포판:

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

    참고: 인스턴스에 다시 액세스한 후 방화벽 구성을 확인하십시오.

  4. 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 명령이 없는 경우 ss를 기존 netstat 명령으로 바꾸십시오. 위 명령과 동일한 구문을 사용해야 합니다.

  5. 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
  6. SSH를 사용하여 인스턴스에 연결합니다.

  7. EC2 직렬 콘솔 세션에서 연결을 해제합니다.

Systems Manager 사용

전제 조건: AWS Systems Manager의 기능인 Session Manager를 사용하려면 인스턴스가 관리형 노드여야 합니다. 인스턴스의 AWS Systems Manager Agent(SSM Agent) ping 상태는 온라인이어야 하며, 연결된 IAM 역할에는 AmazonSSMManagedInstanceCore 권한이 있어야 합니다. 모든 Session Manager 사전 조건을 준수해야 합니다.

인스턴스에 액세스하려면 Session Manager를 사용하여 세션을 시작합니다.

사용자 데이터 스크립트 사용

위의 문제 해결 방법을 사용할 수 없는 경우 사용자 데이터 스크립트를 사용하여 OS 수준 방화벽과 TCP 래퍼를 비활성화합니다. 그런 다음, sshd 서비스를 다시 시작합니다.

중요: 인스턴스를 중지하고 시작하기 전에 다음 작업을 수행하십시오.

참고: 인스턴스를 중지하고 시작할 때 인스턴스의 퍼블릭 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
    --//
    참고: 이전 사용자 데이터 스크립트는 각 인스턴스 재부팅 시 실행되도록 설정됩니다. 이 방법은 모든 기본 iptables 규칙을 제거합니다.
  6. 저장을 선택합니다.
  7. SSH를 사용하여 인스턴스에 연결합니다.
  8. 인스턴스에 다시 액세스한 후 사용자 데이터 스크립트를 제거한 다음, 방화벽 구성이 정확한지 확인합니다.

관련 정보

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

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

SSH를 사용하여 Amazon EC2 Linux 인스턴스에 연결할 때 발생하는 문제를 해결하려면 어떻게 해야 합니까?

EC2 Linux 인스턴스에 연결할 수 없고 상태 확인에 실패하는 이유는 무엇입니까?

1 댓글

"연결 시간 초과" 오류가 계속 나길래 해결 방법 대로 모두 설정 했는데도, 계속 발생합니다. 어떻게 해야 하는지 모르겠습니다.

답글을 게시함 일 년 전