목차
NAT디바이스(NAT Gateway + NAT Instance)
•
프라이빗 서브넷에 배치된 인스턴스가 인터넷또는 AWS 퍼블릭 서비스에 연결할 수 있도록 사용(외부 인터넷에서 내부 AWS 구간으로 직접 통신은 불가능)
NAT Gateway와 NAT Instance의 비교
•
소규모의 트래픽만 발생하고 서비스 중요도가 낮은경우 NAT 인스턴스 구성 권장
•
더 나은 가용성과 향상된 대역폭을 제공하면서 관리작업을 최소화하려면 NAT 게이트웨이 사용 권장
속성 | NAT 게이트웨이 | NAT 인스턴스 |
유지관리 | - AWS에서 관리
- 유지 관리 작업 수행 필요 없음 | - 사용자가 직접 관리
Ex) 인스턴스 소프트웨어 업데이트 또는 운영체제 패치 설치 |
가용성 | - 고가용성
- 가용영역에 각기 NAT 게이트웨이를 만들어 고가용성 제공 | - 스크립트를 사용하여 인스턴스 간의 장애 조치를 관리 |
대역폭 | - 최대 45Gbps까지 확장 | - 인스턴스 유형의 대역폭에 따라 다름 |
비용 | - 사용하는 NAT 게이트웨이 수, 사용 기간, NAT 게이트웨이를 통해 보내는 데이터의 양에 따라 요금이 청구 | - 사용하는 NAT 인스턴스 수, 사용 기간, 인스턴스 유형과 크기에 따라 요금이 청구 |
유형 및 크기 | - 균일하게 제공되므로, 유형 또는 크기를 결정할 필요가 없음 | - 예상 워크로드에 따라 적합한 인스턴스 유형과 크기를 선택 |
퍼블릭 IP 주소 | - 생성할 때 퍼블릭 NAT 게이트웨이와 연결할 탄력적 IP 주소를 선택 | - 탄력적 IP 주소 또는 퍼블릭 IP 주소를 NAT 인스턴스와 함께 사용
- 새 탄력적 IP 주소를 인스턴스와 연결하여 언제든지 퍼블릭 IP 주소를 변경 가능 |
프라이빗 IP 주소 | - 게이트웨이를 만들 때 서브넷의 IP 주소 범위에서 자동 선택 | - 인스턴스를 시작할 때 서브넷의 IP 주소 범위에서 특정 프라이빗 IP 주소를 할당 |
보안 그룹 | - 보안 그룹을 NAT 게이트웨이와 연결할 수 없음
- 보안 그룹을 NAT 게이트웨이 기반 리소스와 연결하여 인바운드 및 아웃바운드 트래픽을 제어 가능 | - NAT 인스턴스 뒤의 리소스 및 NAT 인스턴스와 연결하여 인바운드 및 아웃바운드 트래픽을 제어 |
흐름 로그 | - 흐름 로그를 사용하여 트래픽을 캡처 | - 흐름 로그를 사용하여 트래픽을 캡처 |
접속 서버 | - 지원하지 않음(Ex. SSH) | - 접속 서버로 사용(Ex. SSH) |
NAT Gateway
프라이빗 서브넷과 퍼블릿 서브넷 연결
프라이빗 서브넷을 위한 인터넷 액세스
•
퍼블릭 서브넷에 추가(=서브넷 구성요소)
•
프라이빗 서브넷의 EC2 인스턴스를 인터넷 연결 가능하게 하는 기능
•
고가용성 - 가용 영역 내 중복으로 구현가능
•
IPv4에만 해당
•
VPC 피어링 연결, Site-to-Site VPN 연결 또는 Direct Connect를 통해 트래픽을 NAT 게이트웨이로 라우팅 불가
•
NAT 게이트웨이는 한쪽방향으로 동작하므로 서브넷에서 외부 인터넷으로 통신은 가능하지만 외부 인터넷에서 프라이빗 서브넷으로 통신이 불가능
NAT Gateway 제약사항
•
5Gbps의 대역폭을 지원, 최대 45Gbps까지 자동 확장
•
단일 대상(Ex. 외부 웹서버 1대의 IP)에 대해 분당 최대 55000개의 동시 연결을 지원할 수 있음
•
가용 영역당 기본 할당량은 5개(5개 이상 필요할 경우 AWS 케이스 오픈을 통해 증가 요청이 가능)
실습 : 퍼블릭 서브넷 VPC 구성
1. VPC 생성
2. 프라이빗 서브넷 생성
3. NAT 게이트웨이 생성(탄력적 IP(프라이빗) 할당)
4. 프라이빗 라우팅 테이블 생성 및 서브넷 연결 및 프라이빗 라우팅 테이블 경로 추가
5. 인스턴스 생성 후 퍼블릭 IP 할당하지 않음 + 메타데이터 추가(http://bit.ly/cnbl0202 - 키 페어 없이 root 계정의 암호 입력 방식으로 로그인)
•
프라이빗 서브넷은 외부 네트워크에서 내부 프라이빗 서브넷으로 접근 할 수 없기 때문에 퍼블릭 EC2 인스턴스에 최초 접근 한 후 로컬 통신을 통해 프라이빗 EC2 인스턴스로 SSH 접근 시도
ssh root@프라이빗 IP
YAML
복사
NAT 인스턴스
접속 과정(NAT 게이트웨이의 동작과 동일하다고 봐도 무방함)
•
프라이빗 서브넷에 연결된 내부 인스턴스에서 외부 인터넷과 통신 시 퍼블릭 서브넷의 NAT 인스턴스로 트래픽을 전송
•
NAT 인스턴스는 IP masquerading 기능을 통하여 내부 인스턴스의 IP와 포트를 NAT 인스턴스의 IP와 포트로 변환(PAT)
•
변환된 후 인터넷 게이트웨이로 트래픽을 전송
•
인터넷 게이트웨이는 NAT 인스턴스의 프라이빗 IP를 미리 매핑된 탄력적 IP로 1:1 IP NAT하여 외부 인터넷으로 전송
⇒ IP변환이 2번 이루어짐
⇒ 다수의 인스턴스 출발지 IP가 1개의 탄력적 IP를 공유하여 사용하여 포트 정보를 기준으로 내부 인스턴스의 트래픽을 구별할 수 있음
실습 : NAT 인스턴스를 통한 인터넷 연결
1. CloudFormation으로 AWS 자원 자동생성
[참고] NAT 인스턴스 AMI는 amzn-ami-vpc-nat로 검색하여 이미지 선택함
2. 기본 환경 검증
→ Private-EC2-1과 Private-EC2-2 인스턴스에 접속하여 외부 인터넷 구간 통신 확인
•
프라이빗 서브넷 내에 있는 Private-EC2-1, Private-EC2-2인스턴스가 외부 인터넷과 통신이 되지 않는 것을 확인
NAT인스턴스 터미널
[ec2-user@NAT-Instance ~]$ ifconfig eth0
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 9001
inet 10.40.1.100 netmask 255.255.255.0 broadcast 10.40.1.255
inet6 fe80::a7:30ff:fe81:3402 prefixlen 64 scopeid 0x20<link>
ether 02:a7:30:81:34:02 txqueuelen 1000 (Ethernet)
RX packets 46590 bytes 65002026 (61.9 MiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 3373 bytes 249166 (243.3 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
[ec2-user@NAT-Instance ~]$ curl http://checkip.amazonaws.com/
3.36.241.148
Bash
복사
Private-EC2-1, Private-EC2-2 터미널
[root@Private-EC2-1 ~]# curl http://checkip.amazonaws.com/ --connect-timeout 3
curl: (28) Failed to connect to checkip.amazonaws.com port 80 after 2954 ms: Connection timed out
[root@Private-EC2-1 ~]#
Bash
복사
3. NAT 인스턴스 동작을 위한 설정
1) 프라이빗 서브넷에 라우팅 정보 추가
•
대상 : 외부인터넷, 대상 타깃 : NAT인스턴스의 eth0
2) 소스/대상 확인 중지
•
소스/대상 확인 : 인스턴스로 들어오는 트래픽의 목적지가 자신의 IP가 아닐 경우, 인스턴스에서 나가는 트래픽의 출발지 IP가 자신이 아닐경우 폐기
•
NAT 인스턴스는 자신이 목적지가 아닌 트래픽이 NAT 인스턴스를 경유해서 외부로 나가기 때문에 소스/대상 확인을 비활성화해야 함
4. 프라이빗 서브넷에 위치한 인스턴스에서 외부로 통신 확인
•
프라이빗 서브넷 내에 있는 Private-EC2-1, Private-EC2-2인스턴스가 외부 인터넷과 통신이 되는 것을 확인
Private-EC2-1, Private-EC2-2 터미널
[root@Private-EC2-1 ~]# curl http://checkip.amazonaws.com/ --connect-timeout 3
3.36.241.148
[root@Private-EC2-1 ~]# ping www.google.com
PING www.google.com (216.58.197.196) 56(84) bytes of data.
64 bytes from nrt13s48-in-f196.1e100.net (216.58.197.196): icmp_seq=1 ttl=103 time=32.0 ms
64 bytes from nrt13s48-in-f196.1e100.net (216.58.197.196): icmp_seq=2 ttl=103 time=31.9 ms
^C
--- www.google.com ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1001ms
rtt min/avg/max/mdev = 31.980/32.036/32.092/0.056 ms
Bash
복사
5.
tcpdump로 트래픽이 NAT 인스턴스를 경유하는지 확인
•
NAT인스턴스에서 tcpdump 실행 후 Private-EC2에서 외부 인터넷 접속 시도하면 아래와 같이 확인 가능
◦
Private-EC2 IP(10.40.2.101)가 NAT인스턴스 IP(10.40.1.100)로 변환
[ec2-user@NAT-Instance ~]$ sudo tcpdump -nni eth0 tcp port 80
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes
14:36:48.455105 IP 10.40.2.101.37904 > 34.254.3.33.80: Flags [S], seq 1631082925, win 26883, options [mss 8961,sackOK,TS val 2427566153 ecr 0,nop,wscale 7], length 0
14:36:48.455125 IP 10.40.1.100.37904 > 34.254.3.33.80: Flags [S], seq 1631082925, win 26883, options [mss 8961,sackOK,TS val 2427566153 ecr 0,nop,wscale 7], length 0
14:36:48.684591 IP 34.254.3.33.80 > 10.40.1.100.37904: Flags [S.], seq 3873539546, ack 1631082926, win 26847, options [mss 1460,sackOK,TS val 3485389232 ecr 2427566153,nop,wscale 8], length 0
14:36:48.684602 IP 34.254.3.33.80 > 10.40.2.101.37904: Flags [S.], seq 3873539546, ack 1631082926, win 26847, options [mss 1460,sackOK,TS val 3485389232 ecr 2427566153,nop,wscale 8], length 0
Bash
복사
상세 동작 과정