[AWS] NAT Gateway 비용 절감 — iptables로 NAT 인스턴스 직접 구축 (2부)

글의 개요

  1. Why NAT Instance (NAT Gateway 대신) — 1부
  2. AWS 커뮤니티 제공 NAT Instance AMI 이용 — 1부
  3. iptables로 NAT Instance 직접 구성 — 2부 (이 글)

1부에서는 AWS 커뮤니티 AMI로 NAT Instance를 구축했다. 하지만 그 AMI는 서비스 종료된 구형 OS라 유지 관리가 어렵다는 단점이 있다. 그래서 2부에서는 AWS 최신 OS에서 iptables를 조작해 직접 NAT Instance를 구성한다.

[AWS] NAT Gateway 비용 절감 — AMI로 NAT 인스턴스 구축 (1부)
NAT Gateway는 월 $32+ 고정비가 든다. 비용을 아끼려 EC2(NAT Instance)로 Private Subnet 인터넷을 연결한 방법 — 1부는 AWS 커뮤니티 AMI(amzn-ami-vpc-nat)를 이용한 구성.
taystudios.com/blog

네트워크 개략도는 1부에서 다뤘으니 상황만 짚는다. 사설망(Private Subnet)이 인터넷과 통신하려면 NAT Gateway가 필요하다(Public IP ↔ Private IP 변환, 즉 공유기 역할). AWS NAT Gateway 대신 비용 절감을 위해 NAT Instance를 직접 구축하며, 2부에서는 NAT 설정이 안 된 기본 OS가 NAT 역할을 하도록 설정하는 방법을 다룬다.

NAT Instance(EC2) 구성 방법

1. 기본 EC2 생성

최신 Ubuntu LTS AMI로 NAT Instance용 EC2 생성 그림 1. NAT Instance EC2 생성

커뮤니티가 아닌 AWS가 직접 제공하는 LTS AMI를 사용한다. 나는 Ubuntu를 선호해 Ubuntu 24.04 LTS를 골랐다. NAT Instance는 당연히 Public Subnet에 위치해야 하며, 그 외 라우팅 테이블 예시는 모두 1부에 정리해 두었다.

2. EC2 OS에서 iptables 조작 (NAT 설정)

iptables란? Linux의 강력한 방화벽·패킷 필터링 도구로, 네트워크 트래픽 관리·방화벽·네트워크 주소 변환(NAT)을 구현할 수 있다. 이 글에서는 방화벽이 아니라 NAT 기능을 사용한다.

위에서 만든 NAT Instance에 SSH로 접속한 뒤 다음 절차를 밟는다.

2-1. IP 포워딩 활성화

echo "net.ipv4.ip_forward = 1" | sudo tee -a /etc/sysctl.conf
sudo sysctl -p

NAT Instance는 트래픽을 자기 자신이 아니라 다른 곳으로 라우팅해야 하므로, 패킷이 들어오고 나가는 경로를 허용해야 한다.

  • net.ipv4.ip_forward = 1 — IP 포워딩 활성화 설정.
  • /etc/sysctl.conf — 위 설정을 영구 적용.
  • sudo sysctl -p — 설정을 즉시 적용.

/etc/sysctl.conf 편집기 — net.ipv4.ip_forward 주석 처리 상태 그림 2. /etc/sysctl.conf 편집기 화면

또는 sysctl.conf를 편집기로 열면 그림 2처럼 net.ipv4.ip_forward=1#으로 비활성화돼 있다. 그 주석을 풀고 적용해도 된다.

2-2. iptables NAT 규칙 추가

sudo iptables -t nat -A POSTROUTING -o {본인의 eth} -j MASQUERADE

프라이빗 네트워크의 IP를 NAT Instance의 퍼블릭 IP로 변환하는 NAT 규칙이다. 각 옵션은 다음과 같다.

  • -t nat — NAT 테이블에 규칙을 추가.
  • -A POSTROUTING — 패킷이 라우팅된 이후(출발 직전)에 NAT 처리.
  • -o {eth} — 본인의 인터페이스(예: eth0, ens5)로 나가는 트래픽에 규칙 적용(퍼블릭 네트워크 인터페이스).
  • -j MASQUERADE — 출발지 IP를 NAT Instance의 퍼블릭 IP로 변환(사설망 → 인터넷).

본인의 네트워크 인터페이스 이름은 ip addr로 확인한다(ifconfig도 가능, net-tools 설치 후).

ip addr

ip addr 실행 — 네트워크 인터페이스 이름 확인 (ens5) 그림 3. 네트워크 인터페이스 이름 확인 (예: ens5)

위 그림에서는 ens5가 인터페이스 이름이다.

2-3. 적용 결과 확인

sudo iptables -t nat -L -n -v

iptables에 적용된 NAT 테이블을 확인하는 명령이다.

  • -t nat — NAT 테이블 확인.
  • -L — 모든 체인·규칙 나열.
  • -n — 호스트 이름 대신 IP 표시.
  • -v — 상세 정보(패킷 수·바이트 등) 표시.

iptables NAT 규칙 추가 전후 비교 — POSTROUTING MASQUERADE 그림 4. iptables 규칙 추가 결과 (위: before / 아래: after)

그림 4처럼 POSTROUTING 체인에 MASQUERADE 규칙이 추가돼 있어야 한다. 확인했다면 재부팅 후에도 설정이 유지되게 저장한다.

2-4. 규칙 저장 (재부팅 후 유지)

sudo apt-get update
sudo apt-get install -y iptables-persistent

iptables-persistent는 iptables 규칙을 저장하고 부팅 시 자동 로드하는 유틸리티다. 설치 중 현재 규칙을 저장할지 물으면 모두 yes.

sudo netfilter-persistent save

현재 규칙을 /etc/iptables/rules.v4 등에 저장한다. 저장된 규칙은 재부팅해도 유지된다.

sudo systemctl enable netfilter-persistent

재부팅 후에도 규칙이 자동 로드되도록 서비스를 활성화한다.

이렇게 하면 OS 측 NAT Instance 설정이 끝난다. 나머지(Private Subnet 라우팅 테이블 설정, EC2 소스/대상 확인 중지)는 1부와 동일하다.

3. 결과 — Private Subnet 인터넷 연결 확인

NAT Instance 구축 후 Private Subnet EC2에서 apt-get update 성공 그림 5. NAT Instance 구축 결과 — 인터넷 연결 확인

설정을 끝내고 Private Subnet의 EC2에서 sudo apt-get update를 실행하면 인터넷이 연결된 것을 확인할 수 있다.

맺음말

2부에서는 커뮤니티 AMI 대신 직접 OS에서 NAT Instance를 설정·구성했다. 나머지 라우팅 테이블·콘솔 설정은 1부와 동일하다. 나는 Reverse Proxy / NAT Instance / Bastion 세 역할을 모두 겸하게 해야 했기에, 버전 관리가 되는 최신 OS에 위처럼 직접 설정해 운영하고 있다.


📦 이 글은 제가 운영하던 티스토리 블로그에서 옮겨온(migration) 글입니다. 원문: taehyuklee.tistory.com/28

이 글 공유𝕏f

댓글