BLOG
AWS NAT 인스턴스 이중화 가이드
작성 : 메가존 SA팀
NAT 란 Network Address Translation(네트워크 주소변환)이라고 합니다. 이는 일반 가정이나 회사에서 주로 하나의 공인 아이피를 이용하여 인터넷에 접속하기 위한 방법으로 많이 사용합니다. AWS 에서 서비스 단(WEB, WAS)은 사설망으로 구축을 하기 때문에 사설망에 존재하는 EC2 인스턴스가 운영체제의 패치나 설치할 소스를 다운로드의 목적 내지는 인터넷에 접근하기 위해서는 NAT 가 반드시 필요합니다. 가용영역별로 2개를 설치하게 되며, 만일 하나의 가용영역에 설치시에는 해당 가용영역의 장애발생시에 해당 가용영역은 서비스가 되지 않습니다. 따라서, 이를 이중화 하여 구성하게 됩니다. 아래 그림을 참고하시면 됩니다. 하나의 가용영역 자체가 장애시에는 다른 가용영역에서 해당 NAT를 통해서 인터넷에 접근할 수가 있습니다. NAT 서버의 장애시에는 Ap-northeast-2a존의 WEB#1번 서버는 라우팅 테이블이 변경되어 NAT-B로 트래픽을 보내서 사용할 수가 있습니다.
구성 순서
- 준비사항
- 인스턴스에 NAT 설정
- 준비사항
먼저 NAT 인스턴스에 부여할 정책(Policy)을 만들어야 합니다. 아래의 정책을 IAM 서비스로 이동하여 생성합니다.
Name : NATPolicy
{ "Version": "2012-10-17", "Statement": [ { "Action": [ "ec2:DescribeInstances", "ec2:CreateRoute", "ec2:ReplaceRoute", "ec2:StartInstances", "ec2:StopInstances" ], "Effect": "Allow", "Resource": "*" } ] } [IAM]을 클릭하고 [Policies]로 이동하여 [Create Policy]를 클릭합니다.
맨아래에 있는 [Create Your Own Policy] 옆에 [Select]를 클릭합니다.
다음 화면에서 [Policy Name]에는 “NATPolicy”를 입력하고 [Policy Document]에 위에 있는 Policy 를 붙여 넣으시면 됩니다. 아래 그림을 참고하세요.
위와 같이 입력하고 하단에 있는 [Create Policy]를 클릭합니다. 이제 [Roles]로 이동한 후 [Create New Role]을 클릭합니다. 롤 이름은 “NATRole”이라고 입력하고 [Next Step]을 누룹니다. [Amazon EC2]를 클릭합니다. 아래 그림을 참고하세요 클릭 후 [Filter]에서 nat를 검색합니다. 검색 후 나오는 “NATPolicy”를 클릭한 후 정책을 Role에 attach 시켜줍니다.
[Next Step]을 누리면 정보를 보여주고 아래에 [Create Role]을 클릭하여 생성해 줍니다.
아래와 같이 생성된 것을 확인할 수가 있습니다.
이제 ap-northeast-2a와 ap-northeast-2c 가용영역에 각각 NAT로 사용할 인스턴스를 생성합니다.
EC2를 생성할때는 “Amazon Linux”로 생성하시고, t2.micro타입을 선택하신 다음에 아래와 같이 위에서 생성한 NATRole을 부여해줍니다.
위 롤을 NAT 인스턴스에 적용해 주시고 EC2인스턴스를 생성하여 줍니다. 가용영역 각각에 하나씩 생성해주면 됩니다.
- 인스턴스에 NAT 설정
아마존 웹콘솔에서 NAT 인스턴스를 클릭 후 오른쪽 버튼을 클릭하여 [Networking] 에서 [Change Source/Dest. Check]을 클릭합니다.
클릭 후 [Yes, Disable]을 클릭하여 줍니다.
EC2 메뉴로 이동후 [Security Group] 메뉴로 이동합니다. 이동 후 NAT Security Group에서 아래와 같이 ICMP를 오픈해 줍니다. NAT-A와 NAT-B간 ICMP를 오픈해야 서로의 상태를 확인 후 라우팅을 유지하거나 변경할 수가 있습니다.
위와 같이 ALL ICMP를 NAT Security Group 간 오픈합니다. 오픈 후 PrivateA라우팅이 연결한 NAT-A의 인터페이스를 라우팅 테이블에 설정하면 됩니다.
위에서 NAT-A의 인터페이스를 연결해주면 인터넷으로 연결할수 있는 라우팅이 설정됩니다. [Save]를 클릭하여 저장하고, PrivateB 라우팅 테이블에 대해서는 위와 반대로 0.0.0.0/0에 대해서 NAT-B 인터페이스를 입력하여 줍니다.
라우팅 테이블 설정이 끝나면, NAT-A, NAT-B에 접속하여 아래와 같이 설정합니다.
yum -y update aws* echo 1 > /proc/sys/net/ipv4/ip_forward echo 0 > /proc/sys/net/ipv4/conf/eth0/send_redirects /sbin/iptables -t nat -A POSTROUTING -o eth0 -s 0.0.0.0/0 -j MASQUERADE /sbin/iptables-save > /etc/sysconfig/iptables mkdir -p /etc/sysctl.d/ echo " net.ipv4.ip_forward = 1 net.ipv4.conf.eth0.send_redirects = 0 " >> /etc/sysctl.d/nat.conf wget http://media.amazonwebservices.com/articles/nat_monitor_files/nat_monitor.sh chmod a+x nat_monitor.sh echo '@reboot /home/ec2-user/nat_monitor.sh >> /tmp/nat_monitor.log' | crontab
위와 같이 스크립트를 실행하면 nat_monitor.sh 이 다운로드 되며 nat_monitor.sh을 아래와 같이 수정한 후 실행하면 됩니다.
1번에서 NAT_ID는 NAT-B의 인스턴스 아이디를 입력하면 됩니다. NAT_RT_ID는 NAT-B의 라우팅 테이블 ID, My_RT_ID 에는 NAT-A의 인스턴스 아이디를 입력하면 됩니다. 마지막으로 EC2_URL은 해당 리전의 URL을 입력하면 됩니다. 위 3번의 경우에는 서울리전의 경우에 해당되며 만일, 도쿄리전의 경우에는 https://ec2.ap-northeast-1.amazonaws.com 으로 입력하면 됩니다.
NAT-B의 nat_monitor.sh의 경우에도 위와 같은 방법으로 수정합니다.
위와 같은 방식으로 넣으시면 됩니다. 라우팅 테이블의 ID는 Web/Was 서버의 private subnet이 사용하는 라우팅 테이블을 넣으시면 됩니다.
위와같이 설정하시고, 마지막으로 아래와 같이 실행하면 되며,
/home/ec2-user/nat_monitor.sh >> /tmp/nat_monitor.log &
실제, 연동상황을 확인 할때에는 Web/Was 서버에서 NAT-A나 NAT-B를 리부팅이나 정지를 시키시면 라우팅 테이블이 변경되는 것을 확인 할 수가 있습니다. [VPC] -> [Routing Tables]에 가셔서 가용영역 A존에 private 망의 라우팅 테이블이 변경되는 것을 확인하시면 됩니다.
사설망에 EC2 인스턴스에 접속하여 외부로 접속이 되는지를 확인해 보셔도 됩니다.
끝까지 읽어주셔서 감사합니다.