본문 바로가기
MegazoneCloud
← 전체 글
AWS

IGW/NAT 없는 완전 폐쇄망(Private VPC) EC2를 외부에 안전하게 서비스하는 방법 (PrivateLink + NLB + ALB)

개요

  • 보안 요구사항이 까다로운 환경에서는 종종 IGW(Internet Gateway)나 NAT Gateway조차 존재하지 않는 완전한 폐쇄망(Isolated VPC)에 리소스를 배치해야 합니다.
  • 하지만 이런 격리된 환경에서도 내부에 구성된 웹 애플리케이션을 외부 인터넷 사용자에게 서비스해야 하는 경우가 발생합니다.
  • 본 포스팅에서는 AWS PrivateLink와 VPC 엔드포인트, ALB와 NLB의 조합을 통해 인터넷 구간 노출 없이 폐쇄망의 리소스를 외부로 서비스하는 아키텍처를 구현했습니다.

전체 트래픽 흐름

외부 사용자 → [VPC A] External ALB → VPC Endpoint → AWS PrivateLink → [VPC B] Endpoint Service → Internal NLB → Private EC2(Nginx)

사전 준비

  • 이 구성을 위해서는 두 개의 VPC가 필요합니다.
  • VPC A (퍼블릭): 사용자의 요청을 받을 Public Subnet과 External ALB가 위치할 VPC
  • VPC B (폐쇄망): IGW, NAT가 없는 완전 통제된 VPC. EC2와 Internal NLB가 위치함

VPC B (폐쇄망) 설정 요건

  1. Private Subnet에 위치한 Private IP 전용 EC2 인스턴스
    1. 본 테스트에서는 Nginx 설치 및 80 포트 리스너 오픈하였습니다.

2. Private Subnet에 위치한 Internal NLB (트래픽을 EC2 타겟 그룹으로 전달)

3. 보안 그룹 : NLB는 VPC A의 CIDR 대역으로부터 들어오는 HTTP 80 포트를 허용

NLB의 교차 영역 로드 밸런싱은 꼭 활성화해야 합니다. 그렇지 않으면 추후 생성할 VPC A의 ALB 타겟 그룹에서 엔드포인트로 향하는 헬스 체크가 Fail될 수 있습니다.

엔드포인트 서비스(Endpoint Service) 생성 [VPC B]

폐쇄망에 있는 NLB를 다른 VPC에서 접근할 수 있도록 서비스를 열어주는 작업입니다.

  1. AWS 콘솔에서 VPC > 엔드포인트 서비스 로 이동하여 생성을 클릭합니다.
  2. 로드 밸런서 유형에서 네트워크(Network)를 선택하면, 미리 생성해 둔 Internal NLB가 목록에 나타납니다. 이를 선택합니다.
  3. 지원 리전 설정은 기본값으로 두어도 무방합니다.

4. 생성을 완료한 후, 부여된 서비스 이름을 복사해 기록해 둡니다.

5. 승인이 필요하도록 설정했다면, <엔드포인트 연결> 탭에서 요청을 수락해야 연결이 완료됩니다.

VPC 엔드포인트(Endpoint) 생성 [VPC A]

앞서 만든 엔드포인트 서비스를 VPC A에서 호출할 수 있도록 연결 통로(ENI)를 뚫어주는 작업입니다.

  1. VPC > 엔드포인트 > 엔드포인트 생성 으로 이동합니다.
  2. 서비스 범주에서 <NLB 및 GWLB를 사용하는 엔드포인트 서비스>를 선택합니다.
  3. 서비스 설정에서 위에서 복사해 둔 서비스 이름을 붙여넣고 확인합니다.

4. VPC 및 서브넷 : VPC A를 선택합니다. 서브넷은 요구사항에 맞게 Public 또는 Private 모두 선택 가능합니다.

5. 보안 그룹 : 이후 생성할 ALB에서 들어오는 트래픽(HTTP 80)을 허용하도록 설정합니다.

6. 생성이 완료되면 서브넷에 할당된 IPv4 주소를 미리 적어둡니다. 이 IP 주소들이 바로 외부 ALB가 바라볼 타겟이 됩니다.

External ALB 및 타겟 그룹 생성 [VPC A]

인터넷에서 들어오는 사용자 트래픽을 받아줄 퍼블릭 로드 밸런서를 생성합니다.

  1. ALB 생성
  • VPC A의 Public Subnet에 External ALB를 생성합니다.
  • 보안 그룹은 인터넷 접근을 위해 HTTP 80, 0.0.0.0/0 으로 오픈합니다.

2. 타겟 그룹 생성

  • 대상 유형 : IP
  • 프로토콜/포트: HTTP / 80 (Nginx용)
  • 대상 등록 : VPC 엔드포인트 생성 후 적어두었던 VPC 엔드포인트의 IPv4 주소를 타겟으로 등록합니다.
  • 리스너의 트래픽 전달 대상을 방금 만든 타겟 그룹으로 지정합니다.

구조

  • ALB (VPC A)
    • 퍼블릭 인터넷과 직접 맞닿아 있어 클라이언트의 요청을 최초로 수신합니다. 퍼블릭 요청을 VPC 내부의 엔드포인트(PrivateLink IP)로 포워딩합니다.
  • NLB (VPC B)
    • VPC Endpoint를 통해 들어온 VPC A의 트래픽을 받아 VPC B 내부의 실제 타겟(EC2)으로 전달해줍니다.

결과

  • 모든 구성을 마친 후, ALB의 DNS 주소를 브라우저에 입력해 봅니다. 웹 페이지가 정상적으로 출력되면 성공입니다.

장점/단점

  • 장점
    • 보안성 극대화 : EC2가 위치한 VPC에 IGW나 NAT가 없어 라우팅 테이블 수준에서 외부로부터 침입이나 데이터 유출 통로를 차단할 수 있습니다. VPC 전체 네트워크가 아닌 특정 엔드포인트 서비스만을 외부에 노출시킬 수 있습니다.
    • CIDR 대역 중복 허용 : AWS PrivateLink 덕분에 두 VPC 대역이 동일하거나 겹쳐도 네트워크 충돌이 없습니다.
  • 단점
    • 비용 : ALB, NLB, PrivateLink Endpoint의 시간당 요금과 트래픽 요금이 중복 발생합니다.
    • 클라이언트 원본 IP 유실 : ALB → PrivateLink → NLB 구조를 타며 IP가 변환되어 실제 사용자 IP가 아닌 엔드포인트나 NLB 내부 IP만 기록됩니다.

정리

  • EC2가 위치한 VPC B는 IGW도 없고 NAT도 없는 폐쇄망이지만, AWS PrivateLink(Endpoint Service)와 외부 통신을 담당하는 VPC A의 ALB를 연결함으로써 안전하게 웹 애플리케이션을 외부에 노출시킬 수 있습니다.

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다