Private EC2 인스턴스에서 NAT 인스턴스를 통한 외부 통신

NAT 인스턴스에 대해서 정리해 봤습니다.
2021.10.05

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

안녕하세요 클래스메소드 김재욱(Kim Jaewook) 입니다. 이번에는 NAT 인스턴스를 이용해서 Private EC2 인스턴스를 외부 인터넷으로 통신이 가능하게 해봤습니다.

현재 환경

현재 환경은 Private Subnet에 2개의 EC2 인스턴스가 생성되어 있고, Public Subnet에는 NAT Instance가 생성되어 있는 상태입니다.

하지만 아직 Private EC2 인스턴스와 NAT Instance가 연결되어 있는 상태는 아니기 때문에 Private EC2 인스턴스에서 외부로 통신은 불가능한 상태입니다.

현재 환경 테스트

ifconfig eth0

NAT Instance에서 다음 명령어로 NAT Instance의 Private IP를 확인합니다.

curl http://checkip.amazonaws.com/

Public IP 또한 확인합니다.

curl http://checkip.amazonaws.com/ --connect-timeout 3

이어서 Private EC2에서 외부 통신을 확인해 보면 접속이 되지 않습니다.

Private EC2 인스턴스에 접속하는 방법은 아래 링크를 참고해 주세요

스크립트 확인

먼저 NAT Instance 동작 확인을 위해서 IPv4 라우팅 처리와 IP masquerade 동작을 확인해야합니다.

masquerade(마스커레이드)는 내부 컴퓨터들이 리눅스 서버를 통해서 인터넷 등 다른 네트워크에 접속할 수 있도록 해주는 기능입니다.

cat /proc/sys/net/ipv4/ip_forward

해당 명령어를 입력했을 때,  ip_forward가 1이 나와야합니다.

sudo iptables -nL POSTROUTING -t nat -v

NAT Instance 설정

먼저 NAT Instance 설정으로는

  • 프라이빗 서브넷에 라우팅 정보 추가
  • 소스/대상 확인 비활성화

2가지를 수행해야 합니다.

프라이빗 서브넷에 라우팅 정보 추가

NATInstance-Private-rt1 라우팅 테이블로 들어와서 다음 이미지와 같이 설정합니다. 외부 통신을 위해 0.0.0.0을 입력하고, 네트워크 인터페이스를 선택한 다음, NAT Instance를 선택하고「변경 사항 저장」버튼을 클릭합니다.

소스/대상 확인 비활성화

기본적으로 인스턴스는 트래픽이 자신이 목적지가 아닌 IP 트래픽이 들어왔을 경우 폐기합니다. 반대로 인스턴스에서 나가는 트래픽의 출발지 IP가 자기자신이 아닌 경우도 폐기합니다.

NAT Instance는 masquerade(마스커레이드)를 통해서 출발지 IP와 포트 번호를 변경하고 기록합니다. 이후 라우팅 테이블에 따라서 인터넷 게이트웨이로 트래픽을 보내게 됩니다. 즉 Private EC2에서 보내는 출발지 IP와 포트 번호를 변경하기 때문에「소스/대상 확인 비활성화」를 할 필요가 있습니다.

인스턴스에서 NAT Instance를 선택하고 작업->네트워킹->소스/대상 확인 변경으로 들어옵니다.

소스/대상 확인 중지 체크를하고 저장 버튼을 클릭합니다.

Private EC2 인스턴스에서 NAT Instance 경유

이제 Private EC2 인스턴스에서 NAT Instance를 경유해서 인터넷과 통신하는 지 확인해 보겠습니다.

curl http://checkip.amazonaws.com/ --connect-timeout 3
ping www.naver.com

인터넷과 통신이 되는걸 확인할 수 있습니다.

이제 NAT Instance에서 제대로 경유하고 있는지 tcpdump 명령어로 확인해 봅시다.

sudo yum install tcpdump
sudo tcpdump -nni eth0 tcp port 80

tcpdump 명령어로 확인해 보면, Private EC2 인스턴스의 IP가 NAT Instance에서 변경이 되는것을 볼 수 있습니다. 반대로 변경된 IP가 다시 Private EC2 인스턴스의 IP로 변경 되어 Private EC2 인스턴스에서 통신을 받고 있는 것을 확인할 수 있습니다.

참고