kimyu0218
  • [aws] vpc 설정하기 (Connection timed out 이슈/네트워크 acl)
    2024년 01월 03일 15시 12분 41초에 업로드 된 글입니다.
    작성자: @kimyu0218
    # ssh -i ${PATH}${KEY_PAIR_NAME}.pem ${INSTANCE_USER_NAME}@${INSTANCE_PUBLIC_DNS_NAME}
    ssh -i ${KEY_PATH}.pem ubuntu@ec2-${PUBLIC_IP}.ap-northeast-2.compute.amazonaws.com

    위의 명령어를 이용하여 ec2에 접속하려는데 `Connection timed out` 에러가 발생했다. 보안 그룹의 인바운드 규칙에 ssh 인바운드 규칙을 추가했는데 뭐가 문제일까? (인스턴스 정보 확인하기)

    How do I troubleshoot Amazon EC2 instance connection timeout errors from the internet?

    • ec2 인스턴스 보안 그룹 확인 : 내 ip 대역에서의 ssh 접속을 허용하는 규칙을 추가한다.
    • 네트워크 acl 확인 : 인스턴스와 연결된 서브넷의 인바운드/아웃바운드 규칙을 확인한다.
    • 라우팅 테이블의 인터넷 연결 여부 확인 : 인터넷 게이트웨이와 연결되었는지 확인한다.

    ec2의 규칙이 올바르기 때문에 vpc 설정을 살펴봐야 한다. vpc를 만들기 전에 ec2를 생성했기 때문에 기본 vpc에서 ec2가 실행되고 있다.

    vpc 설정하기

    vpc 설정을 살펴보기 전에 vpc 관련 개념들을 짚고 넘어가자.

    vpc

    vpc는 virtual private cloud의 약자로, 가상 네트워크 환경을 의미한다. vpc는 다른 가상 네트워크와 논리적으로 분리되어 있다. vpc는 aws 클라우드 내에서 리소스를 격리함으로써 높은 수준의 네트워크 제어를 제공한다.
     

    서브넷

    서브넷은 vpc의 ip 주소 대역으로, vpc를 세분화하여 네트워크 구성을 더욱 정교하게 제어하기 위해 사용한다. (= vpc를 더 작은 네트워크 단위로!)

     

    서브넷에는 크게 두 종류가 있다.

    1. 퍼블릭 서브넷 : 인터넷 게이트웨이와 연결된 서브넷 → 외부 인터넷과 직접 통신 가능 (ex. 웹 서버)
    2. 프라이빗 서브넷 : 인터넷 게이트웨이와 연결되지 않은 서브넷 → 외부 인터넷과 직접 통신 불가 (ex. 데이터베이스)
    🚨 서브넷을 생성하면 5개의 ip 주소는 aws에 의해 사용된다. 이들은 네트워크 주소, 라우터 주소, DNS 서버 주소 등으로 사용된다.
    🤔 프라이빗 서브넷 vs. 보안 그룹
    • 프라이빗 서브넷은 외부 인터넷 통신으로부터 보안을 강화한다.
    • 보안 그룹은 특정 IP 주소나 서브넷에서만 접근하도록 하여 특정 포트 번호나 대상만 통신할 수 있도록 한다.

     

    라우팅 테이블

    라우팅 테이블은 네트워크 트래픽을 전달할 위치를 결정한다. 각 라우팅은 트래픽을 전달할 ip 주소 대역, 게이트웨이, 네트워크 인스턴스 등을 지정한다.

     

    인터넷 게이트웨이

    인터넷 게이트웨이는 vpc가 인터넷과 통신할 수 있도록 해준다. (라우팅 테이블이 인터넷 게이트웨이와 연결된 경우, 해당 라우팅 테이블을 가진 서브넷을 퍼블릭 서브넷이라고 한다.)

    🚨 vpc에는 단 하나의 인터넷 게이트웨이만 생성할 수 있다.
      라우팅 테이블 인터넷 게이트웨이
    용도 트래픽 경로 지정 vpc와 인터넷 간의 통신 (→ 퍼블릭 서브넷과 연결)
    위치 vpc 내부 vpc 경계
    🤔 인터넷 게이트웨이와 라우팅 테이블 동작 방식
    • 서브넷 인스턴스 → 라우팅 테이블 → 목적지
      1. 서브넷 내부 인스턴스에서 나가는 트래픽은 서브넷에 연결된 라우팅 테이블을 참조한다.
      2. 라우팅 테이블은 트래픽의 목적지에 따라 경로를 지정한다. 외부 인터넷으로 나가는 경우, 인터넷 게이트웨이로 라우팅된다.
    • 인터넷 → 인터넷 게이트웨이 → 퍼블릭 서브넷
      1. 인터넷에서 들어오는 트래픽은 인터넷 게이트웨이를 통해 vpc로 들어온다.
      2. 인터넷 게이트웨이는 퍼블릭 서브넷으로 트래픽을 전달한다.
      3. 퍼블릭 서브넷의 인스턴스는 트래픽을 수신하고, 보안 그룹 규칙에 따라 필터링한다.

     

    네트워크 acl

    네트워크 acl은 보안 그룹과 유사하지만 적용 범위가 다르다. 보안 그룹은 인스턴스 레벨에서 적용되는 반면, acl은 서브넷 레벨에서 운영된다. 해당 서브넷에 여러 인스턴스가 연결된 경우, 규칙이 모든 인스턴스에 적용된다.

     

    라우팅 테이블 확인하기

    vpc가 인터넷에 연결되었는지 확인해보자. 라우팅 테이블을 별도로 생성한 적이 없기 때문에 메인 라우팅 테이블을 사용하고 있다.

    서비스 - VPC - 라우팅 테이블

    라우팅 테이블이 기본 인터넷 게이트웨이와 연결되어 있으므로 라우팅 테이블의 문제는 아니다.

     

    네트워크 acl 확인하기

    vpc 상세 페이지에서 네트워크 acl을 따라가보자. 

    인바운드 규칙을 위와 같이 수정하여 22번 포트로 접속할 수 있도록 설정한다. 추후에 80번, 443번 포트도 사용할 예정이므로 모든 ip 대역에 대해 허용해준다.

     

    ssh 키 에러 해결하기

    네트워크 acl을 수정함으로써 타임아웃 문제는 사라졌지만 이번엔 키 에러가 발생했다.

    해당 에러는 포스트를 참고하여 해결했다. 이제 ec2에 접속할 수 있다!

     

    ssh 포트 번호 변경하기

    ssh를 이용하면 원격으로 서버에 접속할 수 있으므로 공격자가 예측할 수 없는 번호로 변경하는 것이 좋다. ec2에 접속하여 다음 명령어를 입력한다.

    sudo vim /etc/ssh/sshd_config

    해당 파일에서 `Port 22` 부분을 찾아 주석을 제거하고 22번 대신 사용하려는 포트 번호를 작성한다. 파일을 수정하고 나면 `sudo systemctl restart sshd`로 ssh를 재시작 해준다.

     

    이제 네트워크 acl과 보안 그룹에 변경된 ssh 번호를 반영하면 된다.

    네트워크 acl
    보안 그룹

    ssh -i ${KEY_PATH}.pem ubuntu@ec2-${PUBLIC_IP}.ap-northeast-2.compute.amazonaws.com -p ${SSH_PORT_NO}

    참고자료

    댓글