블록체인
블록체인

NAT Device

목차

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
복사
상세 동작 과정