Private Endpoint 와 Private DNS (PaaS 를 사설 IP 로)
Private Endpoint 와 Private Link 서비스의 차이, 서비스 엔드포인트와 비교, 이름 확인이 CNAME 과 Private DNS 영역으로 사설 IP 가 되는 원리, 서비스별 privatelink 영역 이름, 허브 스포크와 온프레미스에서의 DNS 설계(DNS Private Resolver), 비용과 흔한 실수를 정리합니다.
무엇을 하는가
Private Endpoint 는 스토리지, SQL, Key Vault 같은 PaaS 리소스에 내 VNet 의 사설 IP 를 가진 NIC 를 만들어 주는 기능입니다. 트래픽이 인터넷이 아니라 Microsoft 백본의 Private Link 로 갑니다. 그 다음 PaaS 의 공용 네트워크 액세스를 끄면 인터넷에서는 아예 닿지 않습니다.
| 기능 | 무엇 | 대상 IP | 온프레미스에서 |
|---|---|---|---|
| Private Endpoint | 특정 리소스 하나에 사설 IP | 내 VNet 의 사설 IP | VPN, ExpressRoute 로 접근 가능 |
| 서비스 엔드포인트 | 서브넷에서 서비스로 가는 경로 최적화 + 서비스 방화벽에서 서브넷 허용 | 여전히 공용 IP | 안 됨 |
| Private Link 서비스 | 내가 만든 서비스(표준 LB 뒤)를 다른 고객 VNet 에 Private Endpoint 로 노출 |
데이터 유출 방지 관점에서는 Private Endpoint 가 낫습니다. 서비스 엔드포인트는 같은 종류의 다른 계정에도 갈 수 있지만, Private Endpoint 는 정한 리소스 하나에만 이어집니다.
이름 확인이 핵심
Private Endpoint 를 만들어도 앱은 여전히 stcontoso.blob.core.windows.net 같은 원래 이름으로 접속합니다. 그 이름이 사설 IP 로 풀리게 만드는 것이 DNS 의 일입니다.
- Private Endpoint 를 만들면 공용 DNS 에서
stcontoso.blob.core.windows.net이stcontoso.privatelink.blob.core.windows.net의 CNAME 이 됩니다. - VNet 에
privatelink.blob.core.windows.netPrivate DNS 영역이 링크되어 있으면, Azure DNS(168.63.129.16)가 그 영역의 A 레코드(사설 IP)를 돌려줍니다. - 영역이 없거나 VNet 에 링크되지 않았으면 CNAME 끝에서 공인 IP 가 나오고, 공용 액세스를 꺼 두었다면 연결이 거부됩니다.
그래서 "Private Endpoint 를 만들었는데 안 된다" 의 대부분은 DNS 문제입니다. 증상별 해결은 Private Endpoint DNS 이름 확인 실패에 있습니다.
서비스별 Private DNS 영역
서비스(그리고 하위 리소스)마다 영역 이름이 다릅니다. 자주 쓰는 것만 추렸습니다. 전체 목록은 Microsoft Learn 의 "Azure Private Endpoint DNS zone values" 를 봅니다.
| 서비스 (하위 리소스) | Private DNS 영역 |
|---|---|
Blob (blob) | privatelink.blob.core.windows.net |
ADLS Gen2 (dfs) | privatelink.dfs.core.windows.net |
Azure Files (file) | privatelink.file.core.windows.net |
Azure SQL Database (sqlServer) | privatelink.database.windows.net |
| PostgreSQL flexible server | privatelink.postgres.database.azure.com |
Cosmos DB NoSQL (Sql) | privatelink.documents.azure.com |
Key Vault (vault) | privatelink.vaultcore.azure.net |
App Service, Functions (sites) | privatelink.azurewebsites.net |
Container Registry (registry) | privatelink.azurecr.io |
Azure AI Search (searchService) | privatelink.search.windows.net |
Foundry, Azure OpenAI (account) | privatelink.cognitiveservices.azure.com, privatelink.openai.azure.com, privatelink.services.ai.azure.com |
Event Hubs, Service Bus (namespace) | privatelink.servicebus.windows.net |
주의 스토리지 계정은 하위 리소스마다 Private Endpoint 가 따로 필요합니다. Blob 용만 만들고 ADLS Gen2(dfs) 경로로 접근하면 공인 IP 로 풀립니다. Foundry 같은 AI 리소스도 영역이 여러 개입니다.
만들기
az network private-endpoint create -g rg-shop-prod -n pe-stshop-blob \
--vnet-name vnet-shop-prod --subnet snet-pe \
--private-connection-resource-id $(az storage account show -n stshopprodkrc --query id -o tsv) \
--group-id blob --connection-name stshop-blob
# 영역 그룹: Private Endpoint 가 영역에 A 레코드를 자동으로 넣고 지울 때 같이 지움
az network private-endpoint dns-zone-group create -g rg-shop-prod --endpoint-name pe-stshop-blob \
-n default --private-dns-zone privatelink.blob.core.windows.net --zone-name blobDNS 영역 그룹을 쓰지 않고 A 레코드를 손으로 넣으면 Private Endpoint 를 다시 만들 때 IP 가 바뀌어 레코드가 낡습니다. 영역 그룹이나 Azure Policy(DeployIfNotExists)로 자동화합니다.
대규모 설계: 영역은 한 곳에
Private DNS 영역을 스포크마다 만들면 같은 이름의 영역이 여러 개 생겨 서로 다른 답을 줍니다. 엔터프라이즈 랜딩 존의 권장 구조는 다음과 같습니다.
privatelink.*영역은 connectivity 구독에 한 벌만 만듭니다.- 영역을 허브 VNet 에 링크하고, 허브에 DNS Private Resolver 를 둡니다.
- 스포크 VNet 의 DNS 서버를 Resolver 인바운드 엔드포인트 IP 로 지정합니다(또는 스포크도 영역에 링크).
- 온프레미스 DNS 는
blob.core.windows.net같은 공용 영역 이름(privatelink 가 아닌)을 Resolver 인바운드 IP 로 조건부 전달합니다. - 각 랜딩 존에서 Private Endpoint 를 만들면 Azure Policy 가 중앙 영역에 레코드를 넣습니다.
온프레미스에서 privatelink.blob.core.windows.net 만 전달하면 앞 단계의 CNAME 질의가 인터넷 DNS 로 가므로, 반드시 원래 공용 영역 이름을 전달합니다. 허브 스포크 전체 그림은 허브 스포크와 방화벽에 있습니다.
비용과 한도
- Private Endpoint 는 시간당 요금 + 들어오고 나가는 데이터 GB 당 요금이 붙습니다. 리소스마다, 하위 리소스마다 만들면 수가 빠르게 늘어납니다.
- Private DNS 영역도 영역당 월 요금과 질의 요금이 있지만 작습니다.
- VNet 당 Private Endpoint 수, 영역당 VNet 링크 수에 한도가 있으니 큰 조직은 미리 확인합니다.
체크리스트
- 리소스의 공용 네트워크 액세스를 껐는가 (끄지 않으면 Private Endpoint 는 "추가 경로" 일 뿐)
- 필요한 하위 리소스(blob, dfs, file ...)마다 Private Endpoint 가 있는가
- 맞는 이름의 Private DNS 영역이 질의하는 VNet 에서 보이는가
- 사용자 지정 DNS 서버를 쓰면 168.63.129.16 이나 Resolver 로 전달하는가
- 온프레미스는 공용 영역 이름을 조건부 전달하는가