NAT Instance 사용해보기

redwood
8 min readFeb 5, 2019

--

나만의 VPC 만들기에서 인터넷 통신을 하기 위해서 Public Subnet에 Web서버를 구성했습니다.

이번 블로그에서는 Private Subnet에 Web 서버를 생성하고, Public Subent에서 NAT Instance를 만들어 인터넷 통신이 가능하도록 구성해보겠습니다. Web 서버를 외부에서는 접속을 못 하지만 Web 서버 안에서는 인터넷 접속이 가능하게 됩니다. 인터넷 접속이 가능하면 Web 서버 안에서 yum update 같은 명령어를 수행할 수 있습니다.

참고로, 여기서는 다루지는 않지만 Web 서버 앞에 ALB를 구성해야 외부에서 HTTP/HTTPS프로토콜로 Web서버에 접근할 수 있습니다.

NAT Instance Lab 구성도

Private Subnet 만들기

테스트에 사용할 Private Subnet을 AZ별로 생성합니다. 생성할 Subnet 명은 PrivateSubnet-2a, PrivateSubnet-2c입니다. 테스트는 편의상 PrivateSubnet-2a에서만 진행을 합니다.

PrivateSubnet-2a 생성

VPC는 MyVPC를 선택해주고, AZ와 IPv4 CIDR block에 아래와 같이 입력을 해줍니다.

PrivateSubnet-2c 생성

Public Subnet 에 NAT Instance 만들기

(1) Community AMI 에서 NAT Instance 로 생성되어 있는 AMI Image를 선택해서 생성합니다.

AMI 이미지 선택
Instance Type 선택
Instance Details 선택
Add Storage 선택

NAT SecurityGroup을 새로 생성해 Private Subnet의 주소인 10.10.11.0/24를 Source에 입력합니다. NAT SecurityGroup은 10.10.11.0/24 에서 접속하는 모든 Port의 Traffic을 허용합니다.

Security Group 선택

NAT Instance 생성 시 에러가 발생합니다.

Launch Status

에러의 발생 원인은 Community AMI 사용에 대해 동의를 하지 않아서입니다. 사용 시 비용이 발생할 수 있으므로 동의가 필요합니다.

동의했지만 또 에러가 발생했습니다. 선택한 AMI에서 t2.small EC2 타입을 지원하지 않아서입니다. Mesosphere DC/OS 사에서 권고하는 인스턴스 타입 중에 가장 작은 m4.large로 변경하겠습니다.

생성된 NAT Instance — i-089b6aec9f409b78f

Disable Source/Destination Check

인터넷 트래픽은 TCP/IP 프로토콜을 사용하여 통신합니다. NAT Instance는 Packet이 거치가는 서버이므로 IP Packet에 있는 Source IP와 Destination IP를 체크하지 않는다는 의미입니다.

Private Subnet에서 사용할 Route Table 만들기

Web 서버를 Private Subnet에 생성하였고 Private Subnet에서 사용할 Route Table을 PrivateRouteTable 라는 이름으로 생성하였습니다.

PrivateRouteTable 생성

Private Subnet에서 0.0.0.0/0 을 목적지로 하는 (인터넷 통신용) 패킷은 앞에서 생성해준 NAT Instance로 보냅니다. Target에는 NAT Instance의 ID를 입력합니다.

PrivateRouteTable 경로 추가

생성해준 PrivateRouteTable을 Private Subnet에 연결을 해줍니다.

Private Subnet과 PrivateRouteTable을 연결

Private Subnet에 Web 서버 만들기

Private Subnet 안에 Web 서버를 생성하겠습니다. Network를 MyVPC로 선택하고 Private Subnet을 선택했습니다. Private Subnet 에 있기 때문에 Public IP는 할당하지 않습니다.

Web 서버 Instance Details 입력

Web Server 에서 사용할 Security Group을 Private SecurityGroup이라는 이름으로 생성하였습니다.

Security Group

Public Subnet (10.10.1.0/24) 에서 SSH 접속을 해야 하기 때문에 Inbound에 SSH 접속 Rule을 추가합니다.

Security Group Rule 추가

Web서버에 접속하여 Ping 테스트

Web 서버에 SSH로 접속을 해서 인터넷 통신이 되는지 ping 테스트를 해보도록 하겠습니다. 문제는 Web 서버에 공인 IP가 없으므로 바로 SSH 접속을 할 수 없습니다.

따라서 Public Subnet에 Bastion Host를 생성해서 Web 서버에 SSH 접속하겠습니다.

ssh -> Bastion Host -> Web Server

Bastion Host 생성
Tag 입력
Public Subnet에 있는 MySecurityGroup 선택

Web Server (0–10–11–112)에 접속하였습니다. 접속해서 ping www.google.com을 수행한 결과 정상적으로 ping 이 수행됩니다.

[ec2-user@ip-10-10-1-51 .ssh]$ ssh -i "aws-redwood.pem" ec2-user@10.10.11.112
Last login: Tue Feb 5 14:09:27 2019 from 10.10.1.51
__| __|_ )_| ( / Amazon Linux AMI___|\___|___|https://aws.amazon.com/amazon-linux-ami/2018.03-release-notes/
[ec2-user@ip-10-10-11-112 ~]$
[ec2-user@ip-10-10-11-112 ~]$ ping www.google.com
PING www.google.com (172.217.31.132) 56(84) bytes of data.
64 bytes from nrt20s08-in-f4.1e100.net (172.217.31.132): icmp_seq=1 ttl=44 time=30.7 ms
64 bytes from nrt20s08-in-f4.1e100.net (172.217.31.132): icmp_seq=2 ttl=44 time=30.7 ms

정리하며

NAT Instance를 사용하면 보안성 높은 인프라를 구성할 수 있습니다. 그러나 NAT Instance를 직접 구성할 경우 용량산정 및 이중화 등 관리 요소가 증가하게 됩니다. 직접 구성해서 사용하는 것보다는 AWS에서 제공하는 관리형 서비스인 NAT Gateway를 사용하면 편리합니다.

다음에는 같은 구현을 NAT Gateway로 테스트를 해보도록 하겠습니다.

--

--