프라이빗 리소스가 VPC 외부에서 통신할 수 있도록 지원
이 섹션에서는 프라이빗 서브넷의 리소스가 가상 프라이빗 외부에서 통신할 수 있도록 NAT 인스턴스를 생성하고 사용하는 방법을 설명합니다.
Tasks
1. NAT 인스턴스의 VPC 생성
다음 절차를 따라 퍼블릭 서브넷 및 프라이빗 서브넷이 있는 VPC를 생성합니다.
VPC를 생성하려면
-
https://console.aws.amazon.com/vpc/
에서 Amazon VPC 콘솔을 엽니다. -
VPC 생성을 선택합니다.
-
Resources to create(생성할 리소스)에서 VPC and more(VPC 등)를 선택합니다.
-
Name tag auto-generation(이름 태그 자동 생성)에 VPC의 이름을 입력합니다.
-
서브넷을 구성하려면 다음을 수행합니다.
-
Number of Availability Zones(가용 영역 수)에서 필요에 따라 1 또는 2를 선택합니다.
-
Number of public subnets(퍼블릭 서브넷 수)에서 가용 영역당 하나의 퍼블릭 서브넷이 있는지 확인합니다.
-
Number of private subnets(프라이빗 서브넷 수)에서 가용 영역당 하나의 프라이빗 서브넷이 있는지 확인합니다.
-
-
VPC 생성을 선택합니다.
2. 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 액세스 허용 |
보안 그룹을 생성하려면
-
https://console.aws.amazon.com/vpc/
에서 Amazon VPC 콘솔을 엽니다. -
탐색 창에서 Security groups를 선택합니다.
-
보안 그룹 생성을 선택합니다.
-
보안 그룹의 이름과 설명을 입력합니다.
-
VPC인 경우 NAT 인스턴스에 대한 VPC ID를 선택합니다.
-
다음과 같이 인바운드 규칙(Inbound Rules) 하에 인바운드 트래픽에 대한 규칙을 추가합니다.
-
규칙 추가를 선택합니다. 유형으로 HTTP를 선택하고 소스(Source)에 대한 프라이빗 서브넷의 IP 주소 범위를 입력합니다.
-
규칙 추가를 선택합니다. 유형으로 HTTPS를 선택하고 소스(Source)에 대한 프라이빗 서브넷의 IP 주소 범위를 입력합니다.
-
규칙 추가를 선택합니다. 유형으로 SSH를 선택하고 소스(Source)에 대한 네트워크의 IP 주소 범위를 입력합니다.
-
-
다음과 같이 아웃바운드 규칙(Outbound Rules) 하에 아웃바운드 트래픽에 대한 규칙을 추가합니다.
-
규칙 추가를 선택합니다. 유형으로 HTTP를 선택하고 대상에 0.0.0.0/0을 입력합니다.
-
규칙 추가를 선택합니다. 유형으로 HTTPS를 선택하고 대상에 0.0.0.0/0을 입력합니다.
-
-
보안 그룹 생성을 선택합니다.
자세한 내용은 보안 그룹 단원을 참조하십시오.
3. NAT AMI 생성
EC2 인스턴스에서 NAT를 실행하기 위해 NAT AMI가 구성됩니다. NAT AMI를 생성한 다음 NAT AMI를 사용하여 NAT 인스턴스를 시작해야 합니다.
NAT AMI에 Amazon Linux 이외의 운영 체제를 사용하려는 경우 해당 운영 체제의 설명서를 참조하여 NAT 구성 방법을 확인하십시오. 인스턴스를 재부팅한 후에도 이 설정이 유지되도록 설정을 저장해야 합니다.
Amazon Linux용 NAT AMI 생성
-
AL2023 또는 Amazon Linux 2를 실행하는 EC2 인스턴스를 시작합니다. NAT 인스턴스용으로 생성한 보안 그룹을 지정해야 합니다.
-
인스턴스에 연결하고 인스턴스에서 다음 명령을 실행하여 iptables를 활성화합니다.
sudo yum install iptables-services -y sudo systemctl enable iptables sudo systemctl start iptables
-
인스턴스에서 다음 작업을 수행하여 IP 전달을 활성화하고 IP 전달이 재부팅 후에도 계속 유지되도록 합니다.
nano 또는 vim 등의 텍스트 편집기를 사용하여 구성 파일(
/etc/sysctl.d/custom-ip-forwarding.conf
)을 생성합니다.-
구성 파일에 다음 줄을 추가합니다.
net.ipv4.ip_forward=1
구성 파일을 저장하고 텍스트 편집기를 종료합니다.
-
다음 명령을 실행하여 구성 파일을 적용합니다.
sudo sysctl -p /etc/sysctl.d/custom-ip-forwarding.conf
-
인스턴스에서 다음 명령을 실행하고, 기본 네트워크 인터페이스의 이름을 기록해 둡니다. 다음 단계에서 이 정보가 필요합니다.
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
-
인스턴스에서 다음 명령을 실행하여 NAT를 구성합니다. 기본 네트워크 인터페이스가
eth0
이 아닌 경우eth0
을 이전 단계에서 기록한 기본 네트워크 인터페이스로 바꿉니다.sudo /sbin/iptables -t nat -A POSTROUTING -o
eth0
-j MASQUERADE sudo /sbin/iptables -F FORWARD sudo service iptables save -
EC2 인스턴스에서 NAT AMI를 생성합니다. 자세한 내용은 Amazon EC2 사용 설명서의 인스턴스에서 Linux AMI 생성을 참조하세요.
4. NAT 인스턴스 시작
다음 절차에 따라 생성한 VPC, 보안 그룹, NAT AMI를 사용하여 NAT 인스턴스를 시작합니다.
NAT 인스턴스를 시작하려면
https://console.aws.amazon.com/ec2/
에서 Amazon EC2 콘솔을 엽니다. -
대시보드에서 인스턴스 시작을 선택합니다.
-
이름(Name)에 NAT 인스턴스의 이름을 입력합니다.
-
애플리케이션 및 OS 이미지에서 NAT AMI를 선택합니다(더 많은 AMI 찾아보기, 내 AMI 선택).
-
인스턴스 유형에서 NAT 인스턴스에 필요한 컴퓨팅, 메모리, 스토리지 리소스를 제공하는 인스턴스 유형을 선택합니다.
-
키 페어에서 기존 키 페어를 선택하거나 새 키 페어 생성을 선택합니다.
-
Network settings(네트워크 설정)에서 다음을 수행합니다.
-
편집을 선택합니다.
-
[VPC ]에 대해 생성된 VPC를 선택합니다.
-
서브넷에서 생성한 퍼블릭 서브넷을 선택합니다.
-
Auto-assign Public IP(퍼블릭 IP 자동 할당)에서 Enable(활성화)을 선택합니다. 또는 NAT 인스턴스를 시작한 후 탄력적 IP 주소를 할당하고 이를 NAT 인스턴스에 할당합니다.
-
방화벽에서 기존 보안 그룹 선택을 선택한 다음 생성한 보안 그룹을 선택합니다.
-
-
인스턴스 시작을 선택합니다. 인스턴스 ID를 선택하여 인스턴스 세부 정보 페이지를 엽니다. 인스턴스 상태가 실행 중으로 변경되고 상태 확인이 성공할 때까지 기다립니다.
-
NAT 인스턴스의 소스/대상 확인을 비활성화합니다(5. 원본/대상 확인 비활성화 참조).
-
NAT 인스턴스로 트래픽을 보내기 위한 라우팅 테이블을 업데이트합니다(6. 라우팅 테이블 업데이트 참조).
5. 원본/대상 확인 비활성화
각각의 EC2 인스턴스는 기본적으로 원본/대상 확인을 수행합니다. 이는 인스턴스가 보내거나 받는 트래픽의 원본 또는 대상이어야 한다는 의미입니다. 하지만, NAT 인스턴스는 원본 또는 대상이 그 자신이 아닐 때 트래픽을 보내고 받을 수 있어야 합니다. 따라서 NAT 인스턴스에서 원본/대상 확인을 비활성화해야 합니다.
소스/대상 확인을 비활성화하려면
-
https://console.aws.amazon.com/ec2/
에서 Amazon EC2 콘솔을 엽니다. -
탐색 창에서 Instances(인스턴스)를 선택합니다.
-
NAT 인스턴스를 선택합니다.
-
작업, 네트워킹, 소스/대상 확인 변경을 선택합니다.
-
소스/대상 확인에서 중지를 선택합니다.
-
Save(저장)를 선택합니다.
-
NAT 인스턴스에 보조 네트워크 인터페이스가 있는 경우 [네트워크 인터페이스(Network interfaces)]에서 [네트워킹(Networking)] 탭을 선택합니다. 인터페이스 ID를 선택하여 네트워크 인터페이스 페이지로 이동합니다. [작업(Actions)], [소스/대상 변경. 확인(Change source/dest)]을 선택하고 [활성화(Enable)]을 지우고 [저장(Save)]을 선택합니다.
6. 라우팅 테이블 업데이트
프라이빗 서브넷의 라우팅 테이블에는 NAT 인스턴스로 인터넷 트래픽을 보내는 경로가 있어야 합니다.
라우팅 테이블을 업데이트하려면
-
https://console.aws.amazon.com/vpc/
에서 Amazon VPC 콘솔을 엽니다. -
탐색 창에서 Route tables을 선택합니다.
-
프라이빗 서브넷에 대한 라우팅 테이블을 선택합니다.
-
경로(Routes) 탭에서 경로 편집(Edit routes) 및 경로 추가(Add route)를 차례로 선택합니다.
-
대상(Destination)에 0.0.0.0/0을, 타겟(Target)에 NAT 인스턴스의 인스턴스 ID를 입력합니다.
-
Save changes(변경 사항 저장)를 선택합니다.
자세한 내용은 라우팅 테이블 구성 단원을 참조하십시오.
7. NAT 인스턴스 테스트
NAT 인스턴스를 시작하고 위의 구성 단계를 완료한 후, NAT 인스턴스를 bastion 서버로 사용하여 프라이빗 서브넷의 인스턴스가 NAT 인스턴스를 통해 인터넷에 액세스할 수 있는지 여부를 테스트할 수 있습니다.
1단계: NAT 인스턴스 보안 그룹 업데이트
프라이빗 서브넷의 인스턴스가 ping 트래픽을 NAT 인스턴스로 전송하도록 허용하려면 인바운드 및 아웃바운드 ICMP 트래픽을 허용하는 규칙을 추가합니다. NAT 인스턴스가 Bastion 서버 역할을 하도록 허용하려면 프라이빗 서브넷으로의 아웃바운드 SSH 트래픽을 허용하는 규칙을 추가합니다.
NAT 인스턴스의 보안 그룹 업데이트
https://console.aws.amazon.com/vpc/
에서 Amazon VPC 콘솔을 엽니다. 탐색 창에서 보안 그룹을 선택합니다.
NAT 인스턴스와 연결된 보안 그룹의 확인란을 선택합니다.
[인바운드 규칙(Inbound rules)] 탭에서 [인바운드 규칙 편집(Edit inbound rules)]을 선택합니다.
[Add another rule]을 선택합니다. [유형(Type)]에서 [모든 ICMP - IPv4(All ICMP - IPv4)]를 선택합니다. 소스(Source)에서 사용자 정의(Custom)를 선택하고 프라이빗 서브넷의 IP 주소 범위를 입력합니다. 규칙 저장을 선택합니다.
-
아웃바운드 규칙(Outbound rules) 탭에서 아웃바운드 규칙 편집(Edit outbound rules)을 선택합니다.
-
[Add another rule]을 선택합니다. [유형(Type)]에서 SSH를 선택합니다. Destination(대상)에서 사용자 정의(Custom)를 선택하고 프라이빗 서브넷의 IP 주소 범위를 입력합니다.
-
[Add another rule]을 선택합니다. [유형(Type)]에서 [모든 ICMP - IPv4(All ICMP - IPv4)]를 선택합니다. 대상(Destination)에 대해 어디서나 - IPv4(Anywhere - IPv4)를 선택합니다 규칙 저장을 선택합니다.
2단계: 프라이빗 서브넷에서 테스트 인스턴스 시작
프라이빗 서브넷으로 인스턴스를 시작합니다. NAT 인스턴스에서 SSH 액세스를 허용해야 하며 NAT 인스턴스에 사용한 것과 동일한 키 쌍을 사용해야 합니다.
프라이빗 서브넷에서 테스트 인스턴스 시작
https://console.aws.amazon.com/ec2/
에서 Amazon EC2 콘솔을 엽니다. -
대시보드에서 인스턴스 시작을 선택합니다.
-
프라이빗 서브넷을 선택합니다.
-
이 인스턴스에는 퍼블릭 IP 주소를 할당하지 마세요.
-
이 인스턴스의 보안 그룹은 NAT 인스턴스 또는 퍼블릭 서브넷의 IP 주소 범위에서 오는 인바운드 SSH 액세스와 아웃바운드 ICMP 트래픽를 허용해야 합니다.
-
NAT 인스턴스에 사용한 것과 동일한 키 페어를 선택합니다.
3단계: ICMP 지원 웹사이트 ping
프라이빗 서브넷의 테스트 인스턴스가 NAT 인스턴스를 사용하여 인터넷과 통신할 수 있는지 확인하려면 ping 명령을 실행합니다.
프라이빗 인스턴스에서 인터넷 연결을 테스트하려면
-
로컬 컴퓨터에서 SSH 에이전트 전달을 구성하여 NAT 인스턴스를 Bastion 서버로 사용할 수 있습니다.
-
로컬 컴퓨터에서 NAT 인스턴스에 연결합니다.
-
NAT 인스턴스에서 ping 명령을 실행하여 ICMP에 대해 활성화된 웹 사이트를 지정합니다.
[ec2-user@ip-10-0-4-184]$
pingietf.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 ...
-
NAT 인스턴스에서 프라이빗 IP 주소를 사용하여 프라이빗 서브넷의 인스턴스에 연결합니다.
[ec2-user@ip-10-0-4-184]$
ssh ec2-user@private-server-private-ip-address
-
프라이빗 인스턴스에서 ping 명령을 실행하여 인터넷에 연결할 수 있는지 테스트합니다.
[ec2-user@ip-10-0-135-25]$
pingietf.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 인스턴스에 대해 소스/대상 확인을 비활성화했는지 확인합니다. 자세한 내용은 5. 원본/대상 확인 비활성화 단원을 참조하십시오.
-
라우팅 테이블을 올바로 구성했는지 확인합니다. 자세한 내용은 6. 라우팅 테이블 업데이트 단원을 참조하십시오.
4단계: 정리
프라이빗 서브넷에 테스트 서버가 더 이상 필요하지 않은 경우 더 이상 요금이 청구되지 않도록 인스턴스를 종료합니다. 자세한 내용은 Amazon EC2 사용 설명서의 인스턴스 종료를 참조하세요.
NAT 인스턴스가 더 이상 필요하지 않은 경우 요금이 더 이상 청구되지 않도록 중지하거나 종료할 수 있습니다. NAT AMI를 생성한 경우 필요할 때마다 새 NAT 인스턴스를 생성할 수 있습니다.