카카오클라우드 NAT 인스턴스 설정하기

김유경·2025년 5월 29일

들어가며

클라우드에서 내부 리소스의 보안을 위해 Public Subnet과 Private Subnet을 분리해서 구성하는 것은 매우 일반적인 설계입니다.

하지만 Private Subnet에 있는 인스턴스가 인터넷으로 소프트웨어 업데이트나 외부 API 호출을 해야 할 때, Private Subnet에 있는 인스턴스는 퍼블릭 IP를 할당받지 않기 때문에, 인터넷과 직접 통신할 수 없습니다. 따라서 NAT(Network Address Translation)가 필요합니다.


NAT란?

NAT(Network Address Translation)는 내부 IP 주소를 외부 IP로 변환해주는 기술로, Private Subnet에 있는 인스턴스가 인터넷에 나갈 수 있도록 중계 역할을 합니다.

핵심 개념

  • 내부 IP → NAT 인스턴스 → 공용 IP로 변환 → 외부 요청
  • 응답은 다시 NAT를 통해 내부로 전달
  • 외부에서는 NAT를 통해 들어온 요청이 누구에서 왔는지 모름 (보안 유지)

❗ NAT는 내부 → 외부 방향의 요청만 허용하며, 외부에서 내부로 직접 접근하는 것은 불가능합니다.


카카오 클라우드에서 NAT 인스턴스 구성하기

저희 프로젝트에서는 다음과 같은 구조로 NAT를 설정했습니다.

1. 서브넷 및 라우팅 테이블 설정

  • Public Subnet과 Private Subnet 생성
  • 각각 라우팅 테이블 연결

2. NAT 인스턴스 생성 및 IP 연결

  • 퍼블릭 서브넷에 인스턴스 생성 (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. 패킷 송신 허용 설정

  • KakaoCloud 콘솔 → VM 목록 → NAT 인스턴스
  • [더보기] → 패킷 송신 허용 IP 수정
  • 0.0.0.0/0 입력 → 적용

이 설정이 없으면 프라이빗 인스턴스의 트래픽이 NAT를 거쳐도 외부로 나가지 못합니다.

5. 보안 그룹 설정

  • 인바운드 규칙: 프라이빗 서브넷 CIDR → ALL

현재 구성에서는 프라이빗 서브넷 CIDR에서 들어오는 모든 트래픽(ALL)을 허용하고 있으며, NAT 인스턴스를 통해 주로 사용하는 포트는 80(HTTP), 443(HTTPS)입니다.

이는 설정을 단순화하고 모든 TCP 트래픽을 허용하는 방식이지만, 보안 측면에서 최소 권한 원칙(Principle of Least Privilege)을 적용하려면 다음과 같이 더 강하게 제한할 수 있습니다.

  • 프라이빗 서브넷 CIDR → TCP 80, 443만 명시적으로 허용
  • 서비스 목적에 따라 DNS(53), NTP(123) 등을 선택적으로 추가

6. 라우팅 테이블 업데이트

퍼블릭 서브넷 라우팅 테이블

  • 0.0.0.0/0: 인터넷 게이트웨이(IGW)

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

  • 0.0.0.0/0: NAT 인스턴스 (Instance ID)

0개의 댓글