VPC 구축하기(+ NAT Instance)

민정·2025년 1월 26일
post-thumbnail

서론

VPC 구축은 정말 어렵지 않다! 네트워크 개념을 어느 정도 알고 있다면 금방 구축 가능하다. 주로 설정해야 할 사항은 다음과 같다.

  • IPv4 CIDR 대역 결정하기
  • NAT Gateway / Instance 설정하기
  • 라우팅 테이블 설정하기


VPC 구축하기

기초 지식

필수적으로 반드시 알아야 하는 지식을 아주 간단하게 정리했다.

  • IP
    • 네트워크 주소 + 호스트 주소로 구성된다.
    • IPv4는 총 32비트, IPv6은 총 128비트이다.
  • CIDR
    • AWS의 CIDR 공식문서를 참고하면 이해가 쉽다.
    • 기존의 클래스 기반 주소를 벗어나 서브넷 마스크를 사용해 네트워크-호스트 주소 간 비트 수를 자유롭게 설정하는 방식이다.
  • 서브넷 마스크
    • 네트워크 주소와 호스트 주소를 구분한다.
    • x.x.x.x/x와 같이 / 뒤의 숫자로 네트워크 주소의 비트 수를 표현한다.
  • Public IP, Private IP
    • Public IP는 외부에 공개되어 있으며, 전 세계에서 유일하다. 인터넷에 연결된 다른 PC로부터 접근 가능하다.
    • Private IP는 사설망 내에 위치하며 사설망 내에서 유일하다. 외부에 공개되지 않아 외부 접근이 불가능하다.
  • VPC 구성요소 개념
    • 서브넷
      • 서브 네트워크의 줄임말로, 논리적으로 나뉜 하위 네트워크이다.
      • 퍼블릭과 프라이빗으로 나뉘며 퍼블릭의 경우 Public IP가 할당되어 인터넷과 통신 가능하다.
    • IGW 인터넷 게이트웨이
      • 퍼블릭 서브넷이 인터넷 게이트웨이를 통해 인터넷과 직접적으로 통신 가능하다.
    • NAT
      • Public IP - Private IP를 변환해주는 기술
      • 프라이빗 서브넷이 인터넷과 통신하는 것을 돕는다.
      • 프라이빗 서브넷 → 인터넷으로 통신은 가능하지만 인터넷 → 프라이빗 서브넷 통신은 불가능하다.
    • 라우팅 테이블
      • 트래픽 전송 방향을 결정한다.
      • NAT, IGW 연결을 위해 설정이 필요하다.

[AWS] VPC의 개념 이 글에서 VPC의 개념 및 구성요소에 대해 자세히 설명되어 있으니 참고하자!


비용

VPC는 기본적으로 무료이다. 서브넷, 라우팅 테이블, 보안그룹, NACL, IGW, gateway endpoint도 무료로 제공된다. 그러나 이 이외의 요소는 비용이 발생한다. 특히 아래 세 가지 요소를 유의하자. 세 요소는 자주 사용되는데, 비용을 생각하지 않고 생성 후 방치한다면 비용 폭탄을 맞을 것이다...

  • elastic IP: 시간 당 $0.005
  • NAT Gateway: 시간 당 $0.059(서울 리전 기준), 데이터 처리 비용 별도
  • Interface Endpoint: 시간 당 $0.013(서울 리전 기준), 데이터 처리 비용 별도


VPC 구축하기

IPv4 대역 결정하기

aws에서 사용 가능한 IPv4 대역은 아래와 같다.

  • 10.0.0.0/8
  • 172.16.0.0/12
  • 192.168.0.0/16

CIDR는 /16 ~ /28까지 사용 가능하다. 자신의 프로젝트에 맞게 적절한 IPv4 대역을 선택해 생성하면 된다.

VPC 생성 시 설정할 요소

VPC 생성 시 생성할 리소스에서 VPC 등을 선택하면, 서브넷, 라우팅 테이블, NAT Gateway, IGW가 자동 생성되어 매우 편리하다.


NAT Gateway vs NAT Instance

둘의 차이는 AWS 공식 문서에서 자세히 설명되어있다.

  • NAT Gateway
    • AWS가 직접 관리하기 때문에 가용성, 확장성, 유지 관리 부분에서 더 낫다.
    • 라우팅 테이블만 설정하면 된다.
    • 비용이 매우 비싸다. 시간당 서울 리전 기준 $0.059 비용이 발생한다. 데이터 처리 비용은 별도로 더 발생한다.
  • NAT Instance
    • 인스턴스를 NAT로 설정해서 사용한다.
    • 라우팅 테이블 외에도 별도의 인스턴스 설정 및 보안 그룹 설정이 필요하다.
    • 사용자가 직접 관리해야 한다.
    • 비용이 저렴하다. 인스턴스 비용 + 탄력적 IP 비용만 발생한다. 인스턴스를 프리티어로 사용하고 있다고 가정하면 탄력적 IP 비용인 $0.005만 발생한다.

VPC 생성

나는 아래와 같이 설정해 VPC를 생성했다.


  • 가용영역은 2개 지정해 이후 ALB를 설정해 부하 분산할 예정이다.
  • NAT Gateway 대신 NAT Instance를 사용한다.
  • 3tier Architecture를 생성할 예정이기 때문에 서브넷은 프레젠테이션(퍼블릭 2) + 애플리케이션(프라이빗 2) + 데이터(프라이빗 2)으로 생성한다.

NAT Instance 생성하기

NAT Gateway는 너무 비싸기 때문에 NAT Instance를 사용한다. 인스턴스에 아래의 설정이 필요하다.

  • 퍼블릭 서브넷에 인스턴스 배치하기

  • NAT 전용 ami 사용하기: amzn-ami-vpc-nat를 검색해서 나오는 가장 상단의 ami를 선택한다.

  • 보안그룹 설정하기

    • 인바운드
      • 유형: HTTPS / 소스 유형: 사용자 지정 / 소스: VPC CIDR
      • 유형: HTTP / 소스 유형: 사용자 지정 / 소스: VPC CIDR
      • 유형: 모든 ICMP -IPv4 / 소스 유형: 사용자 지정 / 소스: VPC CIDR
        • ICMP는 ping 테스트를 위해 설정한다.
    • 아웃바운드
      • 유형: 모든 트래픽 / 대상 유형: 사용자 지정 / 대상: 0.0.0.0/0

  • 소스-대상 확인 변경 끄기: 작업 > 네트워킹 > 소스/대상 확인 변경에서 소스/대상 확인을 중지한다.


  • 탄력적 IP 주소 할당하기: EC2 > 탄력적 IP 주소로 이동해 탄력적 IP 주소를 할당하고, 할당받은 IP를 아까 만든 인스턴스에 연결한다. 이제부터 비용이 발생하니 유의하자.

    • 참고로 탄력적 IP 할당 안해도 퍼블릭 IP가 인스턴스에 할당되어 있다면 NAT로 기능한다. EC2에 부여된 퍼블릭 IP는 프리티어 범위에 포함되어 있다.
    • 학습용으로 잠시만 NAT를 사용하는 거라면 탄력적 IP를 굳이 할당하지 않고 NAT를 생성하는 것도 추천한다.


NAT Instance + Bastion host

NAT Instance를 사용한다면 NAT 겸 Bastion host로 사용가능하다. 설정 방법도 매우 쉽다. bastion host에 하는 설정을 NAT Instance에도 똑같이 하면 된다.
bastion host와 대안 글을 참고해 NAT 겸 Bastion host로 설정하자.

라우팅 테이블 설정

라우팅 테이블은 퍼블릭, 프라이빗 서브넷에 각각 할당할 2개를 생성한다. 위에서 VPC 외의 리소스도 한 번에 생성했다면, 퍼블릭, 프라이빗 서브넷을 제외한 나머지 서브넷은 모두 삭제하자.


퍼블릭 라우팅 테이블에는 퍼블릭 서브넷 2개를 연결하고, 라우팅에 인터넷 게이트웨이 설정을 추가한다. 위에서 VPC 외의 리소스도 한 번에 생성했다면 자동으로 연결되어 있을 것이다.


프라이빗 라우팅 테이블에는 프라이빗 서브넷 4개를 연결하고, NAT 설정을 추가한다.
대상 0.0.0.0/0 , 대상 NAT 인스턴스로 선택해 설정한다.


프라이빗 서브넷 인터넷 연결 확인하기

bastion host를 통해 프라이빗 서브넷의 인스턴스로 접속해 ping 테스트를 진행해서 인터넷 연결 여부를 확인하는게 가장 쉽고 빠르다. ping 8.8.8.8 명령어를 사용하자.

$ ping 8.8.8.8
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
64 bytes from 8.8.8.8: icmp_seq=1 ttl=104 time=34.6 ms
64 bytes from 8.8.8.8: icmp_seq=2 ttl=104 time=34.2 ms
64 bytes from 8.8.8.8: icmp_seq=3 ttl=104 time=34.8 ms

위와 같이 패킷이 잘 도착하면 인터넷 연결이 잘 된 것이다. 그러나 timeout이 뜬다면 연결이 제대로 안된 것이니 NAT 인스턴스, 보안그룹, 라우팅 테이블 설정을 점검하자.

profile
시스템 + 리눅스 + 클라우드

0개의 댓글