Azure 안의 이름 해석은 VNet에 링크한 Private DNS Zone이 맡고, 온프레미스와 주고받는 이름 해석은 DNS Private Resolver가 맡습니다. 온프레미스에서 Azure 이름을 물을 때는 Inbound Endpoint로, Azure에서 온프레미스 이름을 물을 때는 Outbound Endpoint와 Forwarding Ruleset으로 보냅니다. 두 서비스를 함께 쓰면 DNS 서버 VM을 따로 두지 않고도 하이브리드 DNS를 구성할 수 있습니다.
1. Azure DNS의 기본 동작
VNet의 VM은 따로 설정하지 않으면 Azure 제공 DNS인 168.63.129.16으로 질의합니다. 이 주소는 VNet 안에서만 쓸 수 있는 가상 IP라서 온프레미스에서는 직접 질의할 수 없습니다. 하이브리드 환경에서 DNS가 막히는 이유가 대부분 여기서 시작합니다.
| 대상 | VNet 안의 VM | 온프레미스 서버 |
| 공용 도메인 | Azure 제공 DNS가 해석 | 온프레미스 DNS가 해석 |
| Private DNS Zone | VNet에 링크된 Zone이면 해석 | 그대로는 불가(Inbound Endpoint 필요) |
| 온프레미스 도메인 | 그대로는 불가(Outbound Endpoint 필요) | 온프레미스 DNS가 해석 |
2. Private DNS Zone
Private DNS Zone은 인터넷에 공개되지 않는 DNS Zone입니다. Zone을 만들고 VNet에 VNet Link를 연결하면, 그 VNet의 VM이 Zone의 레코드를 해석할 수 있습니다. Zone은 특정 리전에 속하지 않는 전역 리소스입니다.
| 기능 | 설명 |
| VNet Link | 링크된 VNet만 Zone을 해석합니다. 한 Zone에 여러 VNet을 링크할 수 있습니다. |
| Auto Registration | 링크에서 켜면 VM을 만들거나 IP가 바뀔 때 A 레코드가 자동으로 생기고 지워집니다. |
| split-horizon | 같은 이름을 VNet 안에서는 사설 IP로, 인터넷에서는 공인 IP로 해석할 수 있습니다. |
| 레코드 종류 | A, AAAA, CNAME, MX, PTR, SOA, SRV, TXT |
Auto Registration을 켠 링크는 VNet 하나당 Zone 하나만 둘 수 있습니다. 해석만 하는 링크는 여러 Zone에 걸 수 있습니다. Zone 이름으로 .local은 운영체제에 따라 동작하지 않을 수 있어 쓰지 않는 것이 좋습니다.
3. Private Endpoint와 privatelink Zone

같은 이름이 링크된 VNet 안에서는 Private Endpoint IP로, 밖에서는 공인 IP로 해석되는 과정
Private Endpoint를 만들면 st01.blob.core.windows.net 같은 공용 이름이 st01.privatelink.blob.core.windows.net으로 CNAME됩니다. 이 privatelink Zone을 Private DNS Zone으로 만들어 VNet에 링크해 두면, 앱은 접속 주소를 바꾸지 않고도 Private Endpoint의 사설 IP로 접속합니다.
| 서비스 | Private DNS Zone | 온프레미스 전달 대상 |
| Blob Storage | privatelink.blob.core.windows.net | blob.core.windows.net |
| SQL Database | privatelink.database.windows.net | database.windows.net |
| Key Vault | privatelink.vaultcore.azure.net | vault.azure.net vaultcore.azure.net |
| Azure Cache for Redis | privatelink.redis.cache.windows.net | redis.cache.windows.net |
온프레미스 DNS에서 Conditional Forwarding을 걸 때는 privatelink Zone이 아니라 공용 Zone 이름(blob.core.windows.net)을 Inbound Endpoint로 보냅니다. 앱이 묻는 이름은 공용 이름이고, CNAME을 따라가는 과정은 Azure 쪽에서 처리되기 때문입니다.
4. DNS Private Resolver

온프레미스는 Inbound Endpoint로 Azure 이름을 묻고, Azure VM은 Forwarding Rule에 따라 Outbound Endpoint를 거쳐 온프레미스 이름을 묻는 구성
DNS Private Resolver는 VNet 안에 두는 관리형 DNS 전달 서비스입니다. 예전에는 이 역할을 위해 DNS 서버 VM을 Hub에 두고 직접 이중화했지만, Resolver는 가용성과 Zone Redundancy가 기본으로 포함되어 있습니다.
| 구성 요소 | 역할 | 조건 |
| Inbound Endpoint | 온프레미스 → Azure 질의를 받는 사설 IP | 전용 서브넷, Microsoft.Network/dnsResolvers 위임 |
| Outbound Endpoint | Azure → 온프레미스 질의를 내보내는 출구 | 인바운드와 다른 전용 서브넷, 같은 위임 |
| Forwarding Ruleset | 도메인별로 보낼 DNS 서버를 정한 규칙 묶음 | Outbound Endpoint에 연결, 규칙 최대 1,000개 |
| VNet Link | Ruleset을 적용할 VNet 지정 | Ruleset당 최대 500개 |
엔드포인트 서브넷은 /28 이상 /24 이하이고, 다른 리소스와 함께 쓸 수 없습니다. 엔드포인트 하나는 초당 약 1만 개의 쿼리를 처리하고, Resolver 하나에 인바운드와 Outbound Endpoint를 각각 5개까지 둘 수 있습니다.
5. Hub-Spoke에 적용하는 두 방식
| 방식 | Spoke 설정 | 특징 |
| Ruleset 링크(분산) | DNS 서버는 Azure 제공 그대로 두고 Ruleset을 Spoke VNet에 링크 | Spoke DNS 설정을 바꾸지 않고, 질의가 Hub로 몰리지 않음 |
| Custom DNS(중앙) | Spoke VNet의 DNS 서버를 Inbound Endpoint IP로 지정 | 모든 질의가 Hub를 거쳐 한곳에서 관리, Private DNS Zone은 Hub에만 링크 |
어느 방식이든 Inbound Endpoint를 대상으로 하는 규칙이 들어 있는 Ruleset을, 그 Inbound Endpoint가 있는 VNet에 링크하면 안 됩니다. 질의가 자기 자신에게 돌아와 해석 루프가 생깁니다.
6. Azure CLI로 만들어 보기
vnet-hub(10.0.0.0/16)와 vnet-spoke(10.1.0.0/16)가 Peering되어 있고, 온프레미스 DNS 서버가 192.168.10.10이라고 가정합니다. dns-resolver 명령은 CLI 확장이라 처음 실행할 때 자동으로 설치됩니다.
6.1 Private DNS Zone과 링크
RG=rg-dns
az network private-dns zone create --resource-group $RG --name azure.1nfra.kr
# 스포크는 자동 등록, 허브는 해석만
az network private-dns link vnet create --resource-group $RG \
--zone-name azure.1nfra.kr --name link-spoke \
--virtual-network vnet-spoke --registration-enabled true
az network private-dns link vnet create --resource-group $RG \
--zone-name azure.1nfra.kr --name link-hub \
--virtual-network vnet-hub --registration-enabled false
6.2 Resolver와 엔드포인트
az network vnet subnet create --resource-group $RG --vnet-name vnet-hub \
--name snet-dns-in --address-prefixes 10.0.10.0/28 \
--delegations Microsoft.Network/dnsResolvers
az network vnet subnet create --resource-group $RG --vnet-name vnet-hub \
--name snet-dns-out --address-prefixes 10.0.11.0/28 \
--delegations Microsoft.Network/dnsResolvers
HUB_ID=$(az network vnet show --resource-group $RG --name vnet-hub --query id -o tsv)
az dns-resolver create --resource-group $RG --name dnspr-hub --id $HUB_ID
az dns-resolver inbound-endpoint create --resource-group $RG \
--dns-resolver-name dnspr-hub --name in-hub \
--ip-configurations "[{private-ip-address:'',private-ip-allocation-method:Dynamic,id:$HUB_ID/subnets/snet-dns-in}]"
az dns-resolver outbound-endpoint create --resource-group $RG \
--dns-resolver-name dnspr-hub --name out-hub --id $HUB_ID/subnets/snet-dns-out
# 온프레미스 DNS의 조건부 전달 대상 IP
az dns-resolver inbound-endpoint show --resource-group $RG \
--dns-resolver-name dnspr-hub --name in-hub \
--query "ipConfigurations[0].privateIpAddress" -o tsv
6.3 Forwarding Ruleset
OUT_ID=$(az dns-resolver outbound-endpoint show --resource-group $RG \
--dns-resolver-name dnspr-hub --name out-hub --query id -o tsv)
az dns-resolver forwarding-ruleset create --resource-group $RG \
--name rs-onprem --outbound-endpoints "[{id:$OUT_ID}]"
# 도메인 끝에 점(.)을 붙임
az dns-resolver forwarding-rule create --resource-group $RG \
--ruleset-name rs-onprem --name onprem \
--domain-name onprem.1nfra.kr. \
--target-dns-servers "[{ip-address:192.168.10.10,port:53}]"
SPOKE_ID=$(az network vnet show --resource-group $RG --name vnet-spoke --query id -o tsv)
az dns-resolver vnet-link create --resource-group $RG \
--ruleset-name rs-onprem --name link-spoke --id $SPOKE_ID
az dns-resolver vnet-link create --resource-group $RG \
--ruleset-name rs-onprem --name link-hub --id $HUB_ID
이 Ruleset에는 Inbound Endpoint를 대상으로 하는 규칙이 없으므로 Hub에 링크해도 루프가 생기지 않습니다. 설정 후 Spoke VM에서 nslookup으로 온프레미스 이름을, 온프레미스 서버에서 nslookup vm-app.azure.1nfra.kr 10.0.10.4로 Azure 이름을 확인합니다.
7. 운영 시 주의점
| 항목 | 조치 |
| Private Endpoint 이름이 공인 IP로 해석됨 | privatelink Zone이 질의한 VNet(중앙 방식이면 Hub)에 링크되어 있고 A 레코드가 있는지 확인합니다. |
| 온프레미스에서 사설 IP가 안 나옴 | Conditional Forwarding을 privatelink Zone이 아니라 공용 Zone 이름으로 Inbound Endpoint에 보냈는지 확인합니다. |
| 해석 시간 초과, 루프 | Inbound Endpoint를 대상으로 하는 Ruleset이 Hub VNet에 링크되어 있지 않은지 확인합니다. |
| Auto Registration이 안 됨 | VNet마다 Auto Registration Zone은 하나뿐입니다. 다른 Zone에 이미 Auto Registration 링크가 있는지 확인합니다. |
| 온프레미스에서 Inbound Endpoint 응답 없음 | VPN, ExpressRoute 경로와 방화벽, NSG에서 53번 포트(UDP, TCP)가 열려 있는지 확인합니다. |
| VNet DNS 서버 변경이 반영 안 됨 | Custom DNS로 바꾼 뒤 기존 VM은 재시작하거나 DHCP를 갱신해야 반영됩니다. |
8. 정리
- Private DNS Zone은 링크된 VNet 안에서만 해석되고, Private Endpoint는 privatelink Zone으로 사설 IP를 돌려줍니다.
- 온프레미스 → Azure는 Inbound Endpoint, Azure → 온프레미스는 Outbound Endpoint와 Forwarding Ruleset이 맡습니다.
- 온프레미스 Conditional Forwarding은 공용 Zone 이름으로 걸고, Inbound Endpoint를 가리키는 Ruleset은 Hub에 링크하지 않습니다.
참고
'Cloud > Azure' 카테고리의 다른 글
| [Azure] Azure NAT Gateway 정리 (0) | 2026.09.25 |
|---|---|
| [Azure] Azure Kubernetes Service 구성 정리 (0) | 2026.09.25 |
| [Azure] Virtual Machine Scale Sets 정리 (0) | 2026.09.25 |
| [Azure] Azure 부하 분산 서비스 비교 (0) | 2026.09.25 |
| [Azure] Front Door와 Application Gateway 연동 정리 (0) | 2026.09.25 |