Network & Server Factory

개인 공부 기록

Cloud/Azure

[Azure] Azure NAT Gateway 정리

1nfra 2026. 9. 25. 17:54
NAT Gateway는 서브넷의 리소스가 인터넷으로 나갈 때 쓰는 관리형 아웃바운드 서비스로, 서브넷에 연결하면 그 안의 VM이 모두 NAT Gateway의 고정 공용 IP로 나갑니다. 2026년 3월 31일 이후 API로 만드는 새 VNet은 서브넷이 기본으로 비공개라서, 인터넷에 나가야 하는 서브넷에는 NAT Gateway 같은 명시적인 아웃바운드가 필요합니다. 새로 만든다면 영역 중복과 IPv6를 지원하는 StandardV2가 기본이고, 가격은 Standard와 같습니다.

1. NAT Gateway가 필요한 이유

예전에는 공용 IP가 없는 VM도 Azure가 자동으로 붙여 주는 기본 아웃바운드 IP로 인터넷에 나갈 수 있었습니다. 이 IP는 사용자가 정할 수 없고 바뀔 수도 있어서, 외부 서비스의 허용 목록에 등록하거나 운영 환경에서 믿고 쓰기 어렵습니다. Microsoft는 2026년 3월 31일 이후 API로 만드는 새 VNet의 서브넷을 기본으로 비공개(defaultOutboundAccess = false)로 바꿨습니다. 기존 VNet은 그대로 동작하지만, 새 VNet에서는 아웃바운드를 직접 구성해야 합니다(Virtual Machine Scale Sets 정리에서도 같은 이유로 NAT Gateway를 붙였습니다).

 

방법 출구 IP 특징 쓰는 경우
기본 아웃바운드 액세스 Azure가 자동 할당
(고정 아님)
새 VNet의 서브넷은 기본으로 꺼짐 운영에는 쓰지 않음
Load Balancer
아웃바운드 규칙
Load Balancer 공용 IP 백엔드 VM마다 SNAT 포트를 미리 나눠 줌 Load Balancer를 이미 쓰는 구성(Azure Load Balancer 정리)
VM 공용 IP VM마다 다른 IP 인바운드까지 열림 VM에 직접 접속해야 할 때
NAT Gateway 지정한 공용 IP·접두사 서브넷 단위, SNAT 포트를 필요할 때 동적으로 사용 대부분의 경우(Microsoft 권장)
Azure Firewall(UDR) 방화벽 또는 NAT Gateway IP 트래픽 검사와 필터링 아웃바운드를 중앙에서 통제할 때

2. 동작 구조

snet-web의 VM은 NAT Gateway의 Public IP로 나가고, NAT Gateway가 없는 snet-db는 인터넷으로 나가지 못하는 구성

 

NAT Gateway는 서브넷에 연결합니다. 연결된 서브넷의 VM이 인터넷으로 연결을 만들면, NAT Gateway가 출발지 주소를 자신의 공용 IP로 바꿔서(SNAT, 출발지 주소 변환) 내보내고 돌아오는 응답만 다시 VM으로 전달합니다. 밖에서 먼저 시작하는 인바운드 연결은 받지 않으므로, 서비스를 외부에 공개할 때는 Load Balancer나 Application Gateway를 따로 둡니다.

 

SNAT 포트는 VM마다 미리 나눠 주지 않고 서브넷 전체가 필요할 때 가져다 씁니다. 같은 포트로 서로 다른 목적지에 동시에 연결할 수 있고, 같은 목적지로 가는 연결끼리만 서로 다른 포트를 씁니다. 그래서 포트는 보통 외부 API 한 곳으로 연결이 몰릴 때 먼저 부족해집니다.

 

항목 값
공용 IP 수 IPv4 최대 16개(StandardV2는 IPv6도 16개)
공용 IP 1개당 SNAT 포트 64,512개
전체 SNAT 포트 100만 개 이상(16개 × 64,512)
같은 목적지 동시 연결 공용 IP 1개당 50,000개
전체 활성 연결 200만 개
TCP 유휴 시간 제한 기본 4분, 최대 120분
UDP 유휴 시간 제한 4분(변경 불가)
처리량 Standard 50Gbps, StandardV2 100Gbps

3. Standard와 StandardV2

SKU는 두 가지이고 가격은 같습니다. StandardV2는 한 영역에 장애가 나도 계속 동작하는 영역 중복 구성이고 IPv6와 흐름 로그를 지원하므로, 지원 지역이라면 새 배포는 StandardV2를 기본으로 잡습니다.

 

비교 항목 Standard StandardV2
영역 단일 영역 또는 영역 없음
(만든 뒤 변경 불가)
영역 중복
처리량 50Gbps 100Gbps
IPv6 지원 안 함 지원(NAT64 포함)
흐름 로그 지원 안 함 지원
공용 IP SKU Standard StandardV2만
가격 같음(시간당 요금 + 처리한 데이터 GB당 요금)

 

Standard를 StandardV2로 업그레이드할 수는 없어서, 바꾸려면 StandardV2를 새로 만들어 교체합니다. NAT64는 IPv6만 쓰는 워크로드가 IPv4 목적지와 통신하도록 주소를 변환하는 기능입니다. 작성 시점(2026년 9월) 기준으로 StandardV2를 쓸 수 없는 지역은 Canada East, India South Central, Sweden South, West India입니다.

4. 다른 아웃바운드와 함께 쓸 때

한 서브넷에 여러 아웃바운드 방법이 있으면 새 연결은 NAT Gateway가 우선입니다. Load Balancer 아웃바운드 규칙이나 VM 공용 IP가 있어도, 인터넷으로 나가는 새 연결은 NAT Gateway의 IP를 씁니다. 다만 UDR(사용자 정의 경로)로 0.0.0.0/0을 방화벽으로 보내는 서브넷은 트래픽이 먼저 방화벽으로 가므로, 이때는 방화벽 서브넷에 NAT Gateway를 붙입니다.

4.1 Azure Firewall과 함께 쓰기

Spoke의 인터넷 트래픽이 UDR로 Hub의 Azure Firewall을 거친 뒤, AzureFirewallSubnet에 연결한 NAT Gateway의 IP로 나가는 구성

 

AzureFirewallSubnet에 NAT Gateway를 연결하면 방화벽이 인터넷으로 보내는 트래픽이 UDR 설정 없이 NAT Gateway의 공용 IP로 나갑니다. 방화벽 인스턴스는 자신의 프라이빗 IP로 NAT Gateway에 넘기므로 이중 NAT도 생기지 않습니다. 구성 전체는 Hub-Spoke 네트워크 구성, Azure Firewall, NSG, WAF 역할 정리와 이어집니다.

 

항목 방화벽 공용 IP만 사용 NAT Gateway 연결
SNAT 포트 공용 IP 1개당
인스턴스별 2,496개
공용 IP 1개당 64,512개
최대 공용 IP 250개 16개
포트 할당 인스턴스마다 나눠 가짐 서브넷 전체에서 필요할 때 사용

 

Virtual WAN의 보안 허브에는 NAT Gateway를 붙일 수 없어서, 이때는 각 Spoke VNet에 직접 연결합니다(Hub-Spoke와 Virtual WAN 비교). 영역 중복 방화벽과 함께 쓸 때는 영역 중복을 지원하는 StandardV2를 씁니다.

5. Azure CLI로 만들어 보기

5.1 네트워크와 NAT Gateway

RG=rg-nat
LOC=koreacentral
az group create --name $RG --location $LOC

# 새 VNet의 서브넷은 기본으로 비공개(기본 아웃바운드 없음)
az network vnet create --resource-group $RG --name vnet-app \
  --address-prefixes 10.1.0.0/16 --subnet-name snet-web --subnet-prefixes 10.1.1.0/24

# StandardV2 NAT Gateway에는 StandardV2 공용 IP가 필요
az network public-ip create --resource-group $RG --name pip-nat --sku StandardV2
az network nat gateway create --resource-group $RG --name nat-web \
  --sku StandardV2 --public-ip-addresses pip-nat --idle-timeout 4

# 서브넷에 연결
az network vnet subnet update --resource-group $RG --vnet-name vnet-app \
  --name snet-web --nat-gateway nat-web

5.2 VM을 만들고 출구 IP 확인

# 공용 IP 없는 VM
az vm create --resource-group $RG --name vm-web --image Ubuntu2404 \
  --size Standard_D2s_v5 --vnet-name vnet-app --subnet snet-web \
  --public-ip-address "" --nsg "" --admin-username azureuser --generate-ssh-keys

# VM 안에서 본 출구 IP와 NAT Gateway 공용 IP 비교
az vm run-command invoke --resource-group $RG --name vm-web \
  --command-id RunShellScript --scripts "curl -s ifconfig.me"
az network public-ip show --resource-group $RG --name pip-nat \
  --query ipAddress --output tsv

# 실습이 끝나면 삭제
az group delete --name $RG --yes --no-wait

두 명령의 IP가 같으면 VM이 NAT Gateway를 통해 나가는 것입니다. 공용 IP가 없는 VM인데도 패키지 설치나 외부 호출이 된다면, 서브넷에 NAT Gateway가 제대로 연결된 것입니다.

6. 모니터링

Azure Monitor에서 NAT Gateway 메트릭을 볼 수 있습니다. 연결 수, 바이트, 패킷은 합계(Sum)로, Datapath Availability는 평균(Average)으로 봅니다.

 

메트릭 의미 활용
SNAT Connection Count 연결 상태(Attempted, Failed)별 SNAT 연결 수 Failed가 0보다 크면 알림(연결 한도나 포트 부족 의심)
Total SNAT Connection Count 활성 SNAT 연결 수 평소 연결 규모 파악
Dropped Packets 버려진 패킷 수 연결 문제 확인
Datapath Availability 데이터 경로 가용성 가용성 알림 기준

7. 운영 시 주의점

증상·항목 확인할 것
외부에서 VM으로 접속 안 됨 NAT Gateway는 응답 패킷만 받습니다. 인바운드는 Load Balancer, Application Gateway, Bastion으로 따로 엽니다.
SNAT Connection Count에 Failed 발생 유휴 시간 제한을 기본값(4분)보다 길게 잡지 않았는지 확인하고, 같은 목적지로 연결이 몰리면 공용 IP를 추가합니다.
서브넷에 연결이 안 됨 GatewaySubnet, SQL Managed Instance 서브넷, Basic SKU 리소스(Basic Load Balancer, Basic 공용 IP)가 있는 서브넷에는 연결할 수 없습니다.
서브넷 하나에 2개 연결 서브넷당 NAT Gateway는 1개입니다. 하나의 NAT Gateway를 여러 서브넷에 연결할 수는 있지만 다른 VNet으로 넘어갈 수는 없습니다.
StandardV2 생성 실패 공용 IP도 StandardV2여야 합니다. Standard 공용 IP는 연결할 수 없습니다.
IPv6 아웃바운드 끊김 StandardV2를 연결하면 Load Balancer 아웃바운드 규칙을 쓰던 IPv6 트래픽이 끊깁니다. 전환 전에 IPv6 경로를 확인합니다.
Standard의 영역 영역을 지정해 만든 Standard NAT Gateway는 나중에 영역을 바꿀 수 없습니다.

8. 정리

  • NAT Gateway는 서브넷 단위로 연결해 고정 공용 IP로 아웃바운드를 내보내고, 인바운드는 응답 패킷만 받습니다.
  • 2026년 3월 31일 이후 새 VNet의 서브넷은 기본으로 비공개라서, 인터넷이 필요한 서브넷에는 NAT Gateway를 붙이고 새 배포는 StandardV2로 만듭니다.
  • Hub-Spoke에서는 AzureFirewallSubnet에 NAT Gateway를 연결해 SNAT 포트를 늘리고, SNAT Connection Count의 Failed에 알림을 걸어 둡니다.

참고

728x90
서울
--:--:--
-전체 글
-카테고리
오늘 방문