클라우드에서 내부 리소스의 보안을 위해 Public Subnet과 Private Subnet을 분리해서 구성하는 것은 매우 일반적인 설계입니다.
하지만 Private Subnet에 있는 인스턴스가 인터넷으로 소프트웨어 업데이트나 외부 API 호출을 해야 할 때, Private Subnet에 있는 인스턴스는 퍼블릭 IP를 할당받지 않기 때문에, 인터넷과 직접 통신할 수 없습니다. 따라서 NAT(Network Address Translation)가 필요합니다.
NAT(Network Address Translation)는 내부 IP 주소를 외부 IP로 변환해주는 기술로, Private Subnet에 있는 인스턴스가 인터넷에 나갈 수 있도록 중계 역할을 합니다.
핵심 개념
❗ NAT는 내부 → 외부 방향의 요청만 허용하며, 외부에서 내부로 직접 접근하는 것은 불가능합니다.
저희 프로젝트에서는 다음과 같은 구조로 NAT를 설정했습니다.

1. 서브넷 및 라우팅 테이블 설정
2. NAT 인스턴스 생성 및 IP 연결

3. NAT 기능 설정 (Ubuntu 기준)
1) IP 포워딩 영구 활성화
# 일시 적용 (재부팅 시 사라짐)
sudo sysctl -w net.ipv4.ip_forward=1
# 영구 설정 적용
echo "net.ipv4.ip_forward=1" | sudo tee -a /etc/sysctl.conf
sudo sysctl -p
2) iptables NAT(Masquerading) 규칙 등록
‼️ 실제 인터페이스 이름은 ip addr 또는 ip link 명령어로 확인 (eth0, ens3, enp3s0 등)
# NAT 트래픽이 나가는 인터페이스가 enp3s0인 경우
sudo iptables -t nat -A POSTROUTING -o enp3s0 -j MASQUERADE
3) iptables 규칙을 재부팅 후에도 유지되도록 저장
저장된 규칙은 /etc/iptables/rules.v4 에 기록됩니다.
sudo apt-get update
sudo apt-get install -y iptables-persistent
‼️ 설치 중에 현재 iptables 설정 저장 여부를 묻는 프롬프트가 뜨면 ‘Yes’ 선택
4. 패킷 송신 허용 설정
이 설정이 없으면 프라이빗 인스턴스의 트래픽이 NAT를 거쳐도 외부로 나가지 못합니다.

5. 보안 그룹 설정
현재 구성에서는 프라이빗 서브넷 CIDR에서 들어오는 모든 트래픽(ALL)을 허용하고 있으며, NAT 인스턴스를 통해 주로 사용하는 포트는 80(HTTP), 443(HTTPS)입니다.
이는 설정을 단순화하고 모든 TCP 트래픽을 허용하는 방식이지만, 보안 측면에서 최소 권한 원칙(Principle of Least Privilege)을 적용하려면 다음과 같이 더 강하게 제한할 수 있습니다.

6. 라우팅 테이블 업데이트
퍼블릭 서브넷 라우팅 테이블

프라이빗 서브넷 라우팅 테이블
