NAT 인스턴스 - Amazon Virtual Private Cloud

NAT 인스턴스

NAT 인스턴스는 Network Address Translation(NAT)을 제공합니다. NAT 인스턴스를 사용하면 프라이빗 서브넷의 리소스가 인터넷이나 온프레미스 네트워크와 같은 Virtual Private Cloud(VPC) 외부의 대상과 통신할 수 있습니다. 프라이빗 서브넷의 리소스는 인터넷으로 향하는 아웃바운드 IPv4 트래픽을 시작할 수 있지만 인터넷에서 시작된 인바운드 트래픽을 수신할 수는 없습니다.

중요

NAT AMI는 2020년 12월 31일에 표준 지원이 종료되고 2023년 12월 31일에 유지 관리 지원이 종료된 Amazon Linux AMI, 2018.03의 마지막 버전을 기반으로 구축되었습니다. 자세한 내용은 Amazon Linux AMI 지원 종료 블로그 게시물을 참조하세요.

기존 NAT AMI 사용하는 경우 AWS는 NAT 게이트웨이로의 마이그레이션을 권장합니다. NAT 게이트웨이는 더 나은 가용성과 향상된 대역폭을 제공하면서 관리 작업은 간소화합니다. 자세한 내용은 NAT 게이트웨이 및 NAT 인스턴스 비교 단원을 참조하십시오.

NAT 게이트웨이보다 NAT 인스턴스가 사용 사례와 더 잘 일치하는 경우 NAT AMI 생성에 설명된 대로 Amazon Linux 현재 버전에서 자체 NAT AMI를 생성할 수 있습니다.

NAT 인스턴스 기본 사항

다음 그림에서는 NAT 인스턴스 기본 사항을 보여줍니다. 프라이빗 서브넷과 연결된 라우팅 테이블은 프라이빗 서브넷의 인스턴스에서 퍼블릭 서브넷의 NAT 인스턴스로 인터넷 트래픽을 전송합니다. 그러면 NAT 인스턴스는 인터넷 게이트웨이로 트래픽을 전송합니다. 트래픽은 NAT 인스턴스의 퍼블릭 IP 주소로 귀속됩니다. NAT 인스턴스는 응답에 대해 높은 포트 번호를 지정합니다. 즉, 응답이 되돌아오면 NAT 인스턴스가 응답에 대한 포트 번호를 기준으로 프라이빗 서브넷에 있는 인스턴스로 이 응답을 보냅니다.

NAT 인스턴스는 인터넷에 액세스할 수 있어야 하므로, 퍼블릭 서브넷(인터넷 게이트웨이로 가는 경로가 있는 라우팅 테이블이 있는 서브넷)에 있어야 하며, NAT 인스턴스에는 퍼블릭 IP 주소 또는 탄력적 IP 주소가 있어야 합니다.

NAT 인스턴스 설정

NAT 인스턴스를 시작하려면 NAT AMI를 생성하고 NAT 인스턴스용 보안 그룹을 생성한 다음 VPC로 NAT 인스턴스를 시작합니다.

NAT 인스턴스 할당량은 리전의 인스턴스 할당량에 따라 다릅니다. 자세한 내용은 AWS 일반 참조Amazon EC2 서비스 할당량을 참조하세요.

NAT 인스턴스의 VPC 생성

다음 절차를 따라 퍼블릭 서브넷 및 프라이빗 서브넷이 있는 VPC를 생성합니다.

VPC를 생성하려면
  1. https://console.aws.amazon.com/vpc/에서 Amazon VPC 콘솔을 엽니다.

  2. VPC 생성을 선택합니다.

  3. Resources to create(생성할 리소스)에서 VPC and more(VPC 등)를 선택합니다.

  4. Name tag auto-generation(이름 태그 자동 생성)에 VPC의 이름을 입력합니다.

  5. 서브넷을 구성하려면 다음을 수행합니다.

    1. Number of Availability Zones(가용 영역 수)에서 필요에 따라 1 또는 2를 선택합니다.

    2. Number of public subnets(퍼블릭 서브넷 수)에서 가용 영역당 하나의 퍼블릭 서브넷이 있는지 확인합니다.

    3. Number of private subnets(프라이빗 서브넷 수)에서 가용 영역당 하나의 프라이빗 서브넷이 있는지 확인합니다.

  6. VPC 생성을 선택합니다.

NAT 인스턴스에 대한 보안 그룹 생성

다음 표에 설명된 규칙을 사용하여 보안 그룹을 생성합니다. 이 규칙을 사용하면 NAT 인스턴스가 프라이빗 서브넷에 있는 인스턴스로부터 오는 인터넷 트래픽뿐 아니라, 네트워크에서 오는 SSH 트래픽도 수신할 수 있습니다. 또한 NAT 인스턴스는 인터넷으로 트래픽을 전송할 수 있으며 따라서 프라이빗 서브넷의 인스턴스가 소프트웨어 업데이트를 받을 수 있습니다.

다음에는 권장 규칙이 나와 있습니다.

인바운드
소스 프로토콜 포트 범위 설명
프라이빗 서브넷 CIDR TCP 80 프라이빗 서브넷의 서버로부터의 인바운드 HTTP 트래픽 허용
프라이빗 서브넷 CIDR TCP 443 프라이빗 서브넷의 서버로부터의 인바운드 HTTPS 트래픽 허용
네트워크의 퍼블릭 IP 주소 범위 TCP 22 네트워크로부터 NAT 인스턴스에 대한 인바운드 SSH 액세스 허용(인터넷 게이트웨이를 통해)
아웃바운드
대상 주소 프로토콜 포트 범위 설명
0.0.0.0/0 TCP 80 인터넷에 대한 아웃바운드 HTTP 액세스 허용
0.0.0.0/0 TCP 443 인터넷에 대한 아웃바운드 HTTPS 액세스 허용
보안 그룹을 생성하려면
  1. https://console.aws.amazon.com/vpc/에서 Amazon VPC 콘솔을 엽니다.

  2. 탐색 창에서 보안 그룹을 선택합니다.

  3. 보안 그룹 생성을 선택합니다.

  4. 보안 그룹의 이름과 설명을 입력합니다.

  5. VPC인 경우 NAT 인스턴스에 대한 VPC ID를 선택합니다.

  6. 다음과 같이 인바운드 규칙(Inbound Rules) 하에 인바운드 트래픽에 대한 규칙을 추가합니다.

    1. 규칙 추가를 선택합니다. 유형으로 HTTP를 선택하고 소스(Source)에 대한 프라이빗 서브넷의 IP 주소 범위를 입력합니다.

    2. 규칙 추가를 선택합니다. 유형으로 HTTPS를 선택하고 소스(Source)에 대한 프라이빗 서브넷의 IP 주소 범위를 입력합니다.

    3. 규칙 추가를 선택합니다. 유형으로 SSH를 선택하고 소스(Source)에 대한 네트워크의 IP 주소 범위를 입력합니다.

  7. 다음과 같이 아웃바운드 규칙(Outbound Rules) 하에 아웃바운드 트래픽에 대한 규칙을 추가합니다.

    1. 규칙 추가를 선택합니다. 유형으로 HTTP를 선택하고 대상에 0.0.0.0/0을 입력합니다.

    2. 규칙 추가를 선택합니다. 유형으로 HTTPS를 선택하고 대상에 0.0.0.0/0을 입력합니다.

  8. 보안 그룹 생성을 선택합니다.

자세한 내용은 보안 그룹 단원을 참조하십시오.

NAT AMI 생성

EC2 인스턴스에서 NAT를 실행하기 위해 NAT AMI가 구성됩니다. NAT AMI를 생성한 다음 NAT AMI를 사용하여 NAT 인스턴스를 시작해야 합니다.

NAT AMI에 Amazon Linux 이외의 운영 체제를 사용하려는 경우 해당 운영 체제의 설명서를 참조하여 NAT 구성 방법을 확인하십시오. 인스턴스를 재부팅한 후에도 이 설정이 유지되도록 설정을 저장해야 합니다.

Amazon Linux용 NAT AMI 생성
  1. AL2023 또는 Amazon Linux 2를 실행하는 EC2 인스턴스를 시작합니다. NAT 인스턴스용으로 생성한 보안 그룹을 지정해야 합니다.

  2. 인스턴스에 연결하고 인스턴스에서 다음 명령을 실행하여 iptables를 활성화합니다.

    sudo yum install iptables-services -y sudo systemctl enable iptables sudo systemctl start iptables
  3. 인스턴스에서 다음 작업을 수행하여 IP 전달을 활성화하고 IP 전달이 재부팅 후에도 계속 유지되도록 합니다.

    1. nano 또는 vim 등의 텍스트 편집기를 사용하여 구성 파일(/etc/sysctl.d/custom-ip-forwarding.conf)을 생성합니다.

    2. 구성 파일에 다음 줄을 추가합니다.

      net.ipv4.ip_forward=1
    3. 구성 파일을 저장하고 텍스트 편집기를 종료합니다.

    4. 다음 명령을 실행하여 구성 파일을 적용합니다.

      sudo sysctl -p /etc/sysctl.d/custom-ip-forwarding.conf
  4. 인스턴스에서 다음 명령을 실행하고, 기본 네트워크 인터페이스의 이름을 기록해 둡니다. 다음 단계에서 이 정보가 필요합니다.

    netstat -i

    다음 예제 출력에서 docker0은 도커에 의해 생성된 네트워크 인터페이스이고, eth0은 기본 네트워크 인터페이스이고, lo는 루프백 인터페이스입니다.

    Iface MTU RX-OK RX-ERR RX-DRP RX-OVR TX-OK TX-ERR TX-DRP TX-OVR Flg docker0 1500 0 0 0 0 0 0 0 0 BMU eth0 9001 7276052 0 0 0 5364991 0 0 0 BMRU lo 65536 538857 0 0 0 538857 0 0 0 LRU

    다음 예제 출력에서 기본 네트워크 인터페이스는 enX0입니다.

    Iface MTU RX-OK RX-ERR RX-DRP RX-OVR TX-OK TX-ERR TX-DRP TX-OVR Flg enX0 9001 1076 0 0 0 1247 0 0 0 BMRU lo 65536 24 0 0 0 24 0 0 0 LRU

    다음 예제 출력에서 기본 네트워크 인터페이스는 ens5입니다.

    Iface MTU RX-OK RX-ERR RX-DRP RX-OVR TX-OK TX-ERR TX-DRP TX-OVR Flg ens5 9001 14036 0 0 0 2116 0 0 0 BMRU lo 65536 12 0 0 0 12 0 0 0 LRU
  5. 인스턴스에서 다음 명령을 실행하여 NAT를 구성합니다. 기본 네트워크 인터페이스가 eth0이 아닌 경우 eth0을 이전 단계에서 기록한 기본 네트워크 인터페이스로 바꿉니다.

    sudo /sbin/iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE sudo /sbin/iptables -F FORWARD sudo service iptables save
  6. EC2 인스턴스에서 NAT AMI를 생성합니다. 자세한 내용은 Amazon EC2 사용 설명서의 인스턴스에서 Linux AMI 생성을 참조하세요.

NAT 인스턴스 시작

다음 절차에 따라 생성한 VPC, 보안 그룹, NAT AMI를 사용하여 NAT 인스턴스를 시작합니다.

NAT 인스턴스를 시작하려면
  1. https://console.aws.amazon.com/ec2/에서 Amazon EC2 콘솔을 엽니다.

  2. 대시보드에서 인스턴스 시작을 선택합니다.

  3. 이름(Name)에 NAT 인스턴스의 이름을 입력합니다.

  4. 애플리케이션 및 OS 이미지에서 NAT AMI를 선택합니다(더 많은 AMI 찾아보기, 내 AMI 선택).

  5. 인스턴스 유형에서 NAT 인스턴스에 필요한 컴퓨팅, 메모리, 스토리지 리소스를 제공하는 인스턴스 유형을 선택합니다.

  6. 키 페어에서 기존 키 페어를 선택하거나 새 키 페어 생성을 선택합니다.

  7. Network settings(네트워크 설정)에서 다음을 수행합니다.

    1. 편집을 선택합니다.

    2. [VPC ]에 대해 생성된 VPC를 선택합니다.

    3. 서브넷에서 생성한 퍼블릭 서브넷을 선택합니다.

    4. Auto-assign Public IP(퍼블릭 IP 자동 할당)에서 Enable(활성화)을 선택합니다. 또는 NAT 인스턴스를 시작한 후 탄력적 IP 주소를 할당하고 이를 NAT 인스턴스에 할당합니다.

    5. 방화벽에서 기존 보안 그룹 선택을 선택한 다음 생성한 보안 그룹을 선택합니다.

  8. 인스턴스 시작을 선택합니다. 인스턴스 ID를 선택하여 인스턴스 세부 정보 페이지를 엽니다. 인스턴스 상태가 실행 중으로 변경되고 상태 확인이 성공할 때까지 기다립니다.

  9. NAT 인스턴스의 소스/대상 확인을 비활성화합니다(원본/대상 확인 비활성화 참조).

  10. NAT 인스턴스로 트래픽을 보내기 위한 라우팅 테이블을 업데이트합니다(라우팅 테이블 업데이트 참조).

원본/대상 확인 비활성화

각각의 EC2 인스턴스는 기본적으로 원본/대상 확인을 수행합니다. 이는 인스턴스가 보내거나 받는 트래픽의 원본 또는 대상이어야 한다는 의미입니다. 하지만, NAT 인스턴스는 원본 또는 대상이 그 자신이 아닐 때 트래픽을 보내고 받을 수 있어야 합니다. 따라서 NAT 인스턴스에서 원본/대상 확인을 비활성화해야 합니다.

소스/대상 확인을 비활성화하려면
  1. https://console.aws.amazon.com/ec2/에서 Amazon EC2 콘솔을 엽니다.

  2. 탐색 창에서 Instances(인스턴스)를 선택합니다.

  3. NAT 인스턴스를 선택합니다.

  4. 작업네트워킹소스/대상 확인 변경을 선택합니다.

  5. 소스/대상 확인에서 중지를 선택합니다.

  6. Save(저장)를 선택합니다.

  7. NAT 인스턴스에 보조 네트워크 인터페이스가 있는 경우 [네트워크 인터페이스(Network interfaces)]에서 [네트워킹(Networking)] 탭을 선택합니다. 인터페이스 ID를 선택하여 네트워크 인터페이스 페이지로 이동합니다. [작업(Actions)], [소스/대상 변경. 확인(Change source/dest)]을 선택하고 [활성화(Enable)]을 지우고 [저장(Save)]을 선택합니다.

라우팅 테이블 업데이트

프라이빗 서브넷의 라우팅 테이블에는 NAT 인스턴스로 인터넷 트래픽을 보내는 경로가 있어야 합니다.

라우팅 테이블을 업데이트하려면
  1. https://console.aws.amazon.com/vpc/에서 Amazon VPC 콘솔을 엽니다.

  2. 탐색 창에서 라우팅 테이블을 선택합니다.

  3. 프라이빗 서브넷에 대한 라우팅 테이블을 선택합니다.

  4. 경로(Routes) 탭에서 경로 편집(Edit routes) 및 경로 추가(Add route)를 차례로 선택합니다.

  5. 대상(Destination)에 0.0.0.0/0을, 타겟(Target)에 NAT 인스턴스의 인스턴스 ID를 입력합니다.

  6. Save changes(변경 사항 저장)를 선택합니다.

자세한 내용은 라우팅 테이블 구성 단원을 참조하십시오.

NAT 인스턴스 테스트

NAT 인스턴스를 시작하고 위의 구성 단계를 완료한 후, NAT 인스턴스를 bastion 서버로 사용하여 프라이빗 서브넷의 인스턴스가 NAT 인스턴스를 통해 인터넷에 액세스할 수 있는지 여부를 테스트할 수 있습니다.

1단계: NAT 인스턴스 보안 그룹 업데이트

프라이빗 서브넷의 인스턴스가 ping 트래픽을 NAT 인스턴스로 전송하도록 허용하려면 인바운드 및 아웃바운드 ICMP 트래픽을 허용하는 규칙을 추가합니다. NAT 인스턴스가 Bastion 서버 역할을 하도록 허용하려면 프라이빗 서브넷으로의 아웃바운드 SSH 트래픽을 허용하는 규칙을 추가합니다.

NAT 인스턴스의 보안 그룹 업데이트
  1. https://console.aws.amazon.com/vpc/에서 Amazon VPC 콘솔을 엽니다.

  2. 탐색 창에서 보안 그룹을 선택합니다.

  3. NAT 인스턴스와 연결된 보안 그룹의 확인란을 선택합니다.

  4. [인바운드 규칙(Inbound rules)] 탭에서 [인바운드 규칙 편집(Edit inbound rules)]을 선택합니다.

  5. [Add another rule]을 선택합니다. [유형(Type)]에서 [모든 ICMP - IPv4(All ICMP - IPv4)]를 선택합니다. 소스(Source)에서 사용자 정의(Custom)를 선택하고 프라이빗 서브넷의 IP 주소 범위를 입력합니다. 규칙 저장을 선택합니다.

  6. 아웃바운드 규칙(Outbound rules) 탭에서 아웃바운드 규칙 편집(Edit outbound rules)을 선택합니다.

  7. [Add another rule]을 선택합니다. [유형(Type)]에서 SSH를 선택합니다. Destination(대상)에서 사용자 정의(Custom)를 선택하고 프라이빗 서브넷의 IP 주소 범위를 입력합니다.

  8. [Add another rule]을 선택합니다. [유형(Type)]에서 [모든 ICMP - IPv4(All ICMP - IPv4)]를 선택합니다. 대상(Destination)에 대해 어디서나 - IPv4(Anywhere - IPv4)를 선택합니다 규칙 저장을 선택합니다.

2단계: 프라이빗 서브넷에서 테스트 인스턴스 시작

프라이빗 서브넷으로 인스턴스를 시작합니다. NAT 인스턴스에서 SSH 액세스를 허용해야 하며 NAT 인스턴스에 사용한 것과 동일한 키 쌍을 사용해야 합니다.

프라이빗 서브넷에서 테스트 인스턴스 시작
  1. https://console.aws.amazon.com/ec2/에서 Amazon EC2 콘솔을 엽니다.

  2. 대시보드에서 인스턴스 시작을 선택합니다.

  3. 프라이빗 서브넷을 선택합니다.

  4. 이 인스턴스에는 퍼블릭 IP 주소를 할당하지 마세요.

  5. 이 인스턴스의 보안 그룹은 NAT 인스턴스 또는 퍼블릭 서브넷의 IP 주소 범위에서 오는 인바운드 SSH 액세스와 아웃바운드 ICMP 트래픽를 허용해야 합니다.

  6. NAT 인스턴스에 사용한 것과 동일한 키 페어를 선택합니다.

3단계: ICMP 지원 웹사이트 ping

프라이빗 서브넷의 테스트 인스턴스가 NAT 인스턴스를 사용하여 인터넷과 통신할 수 있는지 확인하려면 ping 명령을 실행합니다.

프라이빗 인스턴스에서 인터넷 연결을 테스트하려면
  1. 로컬 컴퓨터에서 SSH 에이전트 전달을 구성하여 NAT 인스턴스를 Bastion 서버로 사용할 수 있습니다.

    Linux and macOS
    ssh-add key.pem
    Windows

    아직 설치되지 않은 경우 Pageant를 다운로드하여 설치합니다.

    PuTTYgen을 사용하여 프라이빗 키를 .ppk 형식으로 변환합니다.

    Pageant를 시작하고 작업 표시줄에서 Pageant 아이콘(숨겨져 있을 수 있음)을 마우스 오른쪽 버튼으로 클릭한 다음 키 추가를 선택합니다. 생성한 .ppk 파일을 선택하고 필요한 경우 암호를 입력한 다음 열기를 선택합니다.

  2. 로컬 컴퓨터에서 NAT 인스턴스에 연결합니다.

    Linux and macOS
    ssh -A ec2-user@nat-instance-public-ip-address
    Windows

    PuTTY를 사용하여 NAT 인스턴스에 연결합니다. 인증의 경우 에이전트 전달 허용을 선택하고 인증을 위한 프라이빗 키 파일을 비워 두어야 합니다.

  3. NAT 인스턴스에서 ping 명령을 실행하여 ICMP에 대해 활성화된 웹 사이트를 지정합니다.

    [ec2-user@ip-10-0-4-184]$ ping ietf.org

    NAT 인스턴스에 인터넷 액세스 권한이 있는지 확인하려면 다음과 같은 출력을 수신했는지 확인한 다음 Ctrl+C를 눌러 ping 명령을 취소합니다. 아니면 NAT 인스턴스가 퍼블릭 서브넷에 있는지 확인합니다(라우팅 테이블에 인터넷 게이트웨이에 대한 경로가 있음).

    PING ietf.org (104.16.45.99) 56(84) bytes of data. 64 bytes from 104.16.45.99 (104.16.45.99): icmp_seq=1 ttl=33 time=7.88 ms 64 bytes from 104.16.45.99 (104.16.45.99): icmp_seq=2 ttl=33 time=8.09 ms 64 bytes from 104.16.45.99 (104.16.45.99): icmp_seq=3 ttl=33 time=7.97 ms ...
  4. NAT 인스턴스에서 프라이빗 IP 주소를 사용하여 프라이빗 서브넷의 인스턴스에 연결합니다.

    [ec2-user@ip-10-0-4-184]$ ssh ec2-user@private-server-private-ip-address
  5. 프라이빗 인스턴스에서 ping 명령을 실행하여 인터넷에 연결할 수 있는지 테스트합니다.

    [ec2-user@ip-10-0-135-25]$ ping ietf.org

    프라이빗 인스턴스가 NAT 인스턴스를 통해 인터넷에 액세스할 수 있는지 확인하려면 다음과 같은 출력을 수신했는지 확인한 다음 Ctrl+C를 눌러 ping 명령을 취소합니다.

    PING ietf.org (104.16.45.99) 56(84) bytes of data. 64 bytes from 104.16.45.99 (104.16.45.99): icmp_seq=1 ttl=33 time=8.76 ms 64 bytes from 104.16.45.99 (104.16.45.99): icmp_seq=2 ttl=33 time=8.26 ms 64 bytes from 104.16.45.99 (104.16.45.99): icmp_seq=3 ttl=33 time=8.27 ms ...
문제 해결

프라이빗 서브넷의 서버에서 ping 명령이 실패하는 경우 다음 단계에 따라 문제를 해결하십시오.

  • ICMP가 활성화된 웹 사이트를 ping했는지 확인합니다. 수행되지 않았으면 서버가 응답 패킷을 수신할 수 없습니다. 이를 테스트하려면 사용자 컴퓨터의 명령줄 터미널에서 똑같은 ping 명령을 수행하세요.

  • NAT 인스턴스의 보안 그룹이 프라이빗 서브넷에서 오는 인바운드 ICMP 트래픽을 허용하는지 확인합니다. 허용하지 않으면, NAT 인스턴스가 프라이빗 인스턴스로부터 ping 명령을 수신할 수 없습니다.

  • NAT 인스턴스에 대해 소스/대상 확인을 비활성화했는지 확인합니다. 자세한 내용은 원본/대상 확인 비활성화 단원을 참조하십시오.

  • 라우팅 테이블을 올바로 구성했는지 확인합니다. 자세한 내용은 라우팅 테이블 업데이트 단원을 참조하십시오.

4단계: 정리

프라이빗 서브넷에 테스트 서버가 더 이상 필요하지 않은 경우 더 이상 요금이 청구되지 않도록 인스턴스를 종료합니다. 자세한 내용은 Amazon EC2 사용 설명서인스턴스 종료를 참조하세요.

NAT 인스턴스가 더 이상 필요하지 않은 경우 요금이 더 이상 청구되지 않도록 중지하거나 종료할 수 있습니다. NAT AMI를 생성한 경우 필요할 때마다 새 NAT 인스턴스를 생성할 수 있습니다.