Lý Thuyết Cốt Lõi
1. Domain, Custom Domain và Xác Minh
Mỗi Microsoft Entra ID tenant được gán 1 tên miền mặc định dạng tenantname.onmicrosoft.com. Doanh nghiệp thường muốn dùng tên miền riêng như hoatranlab.io.vn cho UPN và email.
- Entra ID → Custom domain names → Add custom domain
- Nhập tên miền:
hoatranlab.io.vn - Azure cung cấp TXT record để xác minh
- Thêm TXT record vào DNS registrar (domain provider)
- Nhấn Verify — Azure kiểm tra TXT record qua DNS
- Sau xác minh: đặt làm Primary domain nếu muốn
Sau khi Azure verify thành công, TXT record có thể xóa khỏi registrar.
2. Tạo DNS Zones và Ủy Quyền Nameserver
Azure DNS là dịch vụ hosting DNS zone, cho phép quản lý DNS records bằng Azure Portal, CLI, hoặc API — tích hợp với RBAC và Azure Monitor. Không hỗ trợ mua domain — chỉ host zone.
az network dns zone create → Azure tạo 4 nameserver (ns1-XX.azure-dns.com) cho zone
Tại domain registrar (Mắt Bão, PA Web, GoDaddy): thay NS record thành 4 nameserver Azure cung cấp
Tạo A, CNAME, MX, TXT, SRV records trong Azure DNS zone qua Portal hoặc CLI
| Record Type | Mục đích | Ví dụ |
|---|---|---|
| A | Hostname → IPv4 | www → 20.10.5.100 |
| AAAA | Hostname → IPv6 | www → 2600:1f18::1 |
| CNAME | Alias → hostname khác | blog → hoatranlab.io.vn |
| MX | Mail exchanger | @ → 10 mail.protection.outlook.com |
| TXT | Text data (SPF, DKIM, verification) | @ → "v=spf1 include:spf.protection.outlook.com ~all" |
| NS | Nameserver cho zone/subdomain | @ → ns1-01.azure-dns.com |
| SOA | Start of Authority — tự động tạo | Azure tự quản lý |
3. Private DNS Zones — Phân Giải Tên Nội Bộ
Azure Private DNS Zone cung cấp DNS resolution cho tên miền nội bộ trong VNet — không accessible từ Internet. Dùng cho private endpoints, VM naming, service discovery giữa các microservices.
| Đặc điểm | Public | Private |
|---|---|---|
| Accessible | Internet | VNet only |
| VNet link | Không cần | Bắt buộc |
| Auto-register | Không | Hỗ trợ |
| Split-horizon | Không | Hỗ trợ |
Khi link VNet vào Private DNS Zone với auto-registration enabled: Azure tự động tạo A record cho mỗi VM trong VNet khi VM được tạo hoặc có IP thay đổi.
- • VM
vm-web-01tự có recordvm-web-01.internal.corp - • Record xóa tự động khi VM bị xóa
- • Tối đa 1 auto-registration VNet per Private Zone
- • Không giới hạn VNet resolution link
privatelink.blob.core.windows.net) để traffic đi qua private IP thay vì public IP. Đây là cấu hình bảo mật quan trọng trong hybrid architecture.
4. Ủy Quyền Subdomain (Delegation)
Delegation cho phép một phần của DNS namespace được quản lý bởi zone con. Ví dụ: hoatranlab.io.vn host trên Azure DNS, nhưng dev.hoatranlab.io.vn được delegate sang zone riêng do team DevOps quản lý.
- Tạo child zone:
dev.hoatranlab.io.vn - Ghi lại 4 nameserver của child zone
- Trong parent zone
hoatranlab.io.vn: tạo NS record set têndevtrỏ đến 4 NS của child zone - Xác minh:
nslookup -type=NS dev.hoatranlab.io.vn
Delegation + RBAC cho phép phân quyền quản lý DNS theo đội nhóm:
- • IT Network: Owner trên zone
hoatranlab.io.vn - • DevOps team: DNS Zone Contributor trên
dev.hoatranlab.io.vn - • Marketing: DNS Zone Contributor trên
web.hoatranlab.io.vn
Bài Tập Thực Hành (Lab)
Tạo Resource Group và Public DNS Zone
# Tạo Resource Group
az group create \
--name rg-az104-m11 \
--location southeastasia \
--tags Course=AZ-104 Module=11
# Tạo Public DNS Zone
# Thay "yourdomain.io.vn" bằng domain bạn sở hữu
az network dns zone create \
--resource-group rg-az104-m11 \
--name yourdomain.io.vn
# Xem 4 nameserver Azure cấp phát cho zone
az network dns zone show \
--resource-group rg-az104-m11 \
--name yourdomain.io.vn \
--query nameServers \
-o table
# Liệt kê tất cả record sets trong zone (SOA và NS mặc định)
az network dns record-set list \
--resource-group rg-az104-m11 \
--zone-name yourdomain.io.vn \
--query "[].{name:name, type:type, ttl:ttl}" \
-o table
Thêm A record, CNAME, MX và TXT record
# A record: www → 20.10.5.100 (TTL 3600s)
az network dns record-set a add-record \
--resource-group rg-az104-m11 \
--zone-name yourdomain.io.vn \
--record-set-name www \
--ipv4-address 20.10.5.100 \
--ttl 3600
# A record: @ (apex) → cùng IP
az network dns record-set a add-record \
--resource-group rg-az104-m11 \
--zone-name yourdomain.io.vn \
--record-set-name "@" \
--ipv4-address 20.10.5.100 \
--ttl 3600
# CNAME: blog → www.yourdomain.io.vn
az network dns record-set cname set-record \
--resource-group rg-az104-m11 \
--zone-name yourdomain.io.vn \
--record-set-name blog \
--cname www.yourdomain.io.vn \
--ttl 3600
# MX record: mail server (Microsoft 365)
az network dns record-set mx add-record \
--resource-group rg-az104-m11 \
--zone-name yourdomain.io.vn \
--record-set-name "@" \
--exchange "yourdomain-io-vn.mail.protection.outlook.com" \
--preference 10 \
--ttl 3600
# TXT record: SPF cho Microsoft 365
az network dns record-set txt add-record \
--resource-group rg-az104-m11 \
--zone-name yourdomain.io.vn \
--record-set-name "@" \
--value "v=spf1 include:spf.protection.outlook.com ~all" \
--ttl 3600
# Kiểm tra tất cả records đã tạo
az network dns record-set list \
--resource-group rg-az104-m11 \
--zone-name yourdomain.io.vn \
-o table
nslookup www.yourdomain.io.vn từ máy local.
Tạo Private DNS Zone, link VNet và bật auto-registration
# Tạo VNet cho lab Private DNS
az network vnet create \
--resource-group rg-az104-m11 \
--name vnet-az104-m11 \
--address-prefix 10.11.0.0/16 \
--location southeastasia
az network vnet subnet create \
--resource-group rg-az104-m11 \
--vnet-name vnet-az104-m11 \
--name snet-default \
--address-prefix 10.11.1.0/24
# Tạo Private DNS Zone (tên miền nội bộ)
az network private-dns zone create \
--resource-group rg-az104-m11 \
--name "internal.corp"
# Link VNet vào Private DNS Zone với auto-registration
VNET_ID=$(az network vnet show \
--resource-group rg-az104-m11 \
--name vnet-az104-m11 \
--query id -o tsv)
az network private-dns link vnet create \
--resource-group rg-az104-m11 \
--zone-name "internal.corp" \
--name "link-vnet-m11" \
--virtual-network $VNET_ID \
--registration-enabled true
# Thêm A record tĩnh cho server nội bộ
az network private-dns record-set a add-record \
--resource-group rg-az104-m11 \
--zone-name "internal.corp" \
--record-set-name "dc01" \
--ipv4-address 10.11.1.10
az network private-dns record-set a add-record \
--resource-group rg-az104-m11 \
--zone-name "internal.corp" \
--record-set-name "sqlprod" \
--ipv4-address 10.11.1.20
# Xem tất cả record sets trong Private DNS Zone
az network private-dns record-set list \
--resource-group rg-az104-m11 \
--zone-name "internal.corp" \
--query "[].{name:name,type:type}" \
-o table
# Xác nhận VNet link đã active
az network private-dns link vnet list \
--resource-group rg-az104-m11 \
--zone-name "internal.corp" \
--query "[].{name:name,registrationEnabled:registrationEnabled,virtualNetworkLinkState:virtualNetworkLinkState}" \
-o table
Tạo VM trong VNet và xác minh auto-registration DNS hoạt động
# Tạo VM trong VNet đã link Private DNS
az vm create \
--resource-group rg-az104-m11 \
--name vm-dns-test-m11 \
--vnet-name vnet-az104-m11 \
--subnet snet-default \
--image Ubuntu2204 \
--size Standard_B1s \
--admin-username azureadmin \
--generate-ssh-keys \
--public-ip-sku Standard
# Đợi VM sẵn sàng
az vm wait \
--resource-group rg-az104-m11 \
--name vm-dns-test-m11 \
--created
# Kiểm tra Private DNS Zone — VM vừa tạo phải xuất hiện tự động
az network private-dns record-set list \
--resource-group rg-az104-m11 \
--zone-name "internal.corp" \
--query "[?contains(type, 'A')].{name:name,ip:aRecords[0].ipv4Address}" \
-o table
# Lấy Public IP để SSH test DNS resolution
PUBLIC_IP=$(az vm show \
--resource-group rg-az104-m11 \
--name vm-dns-test-m11 \
--show-details \
--query publicIps -o tsv)
echo "Public IP: $PUBLIC_IP"
# SSH vào VM và test DNS resolution
ssh azureadmin@$PUBLIC_IP "nslookup dc01.internal.corp && nslookup sqlprod.internal.corp"
vm-dns-test-m11.internal.corp phải xuất hiện tự động với IP private của nó. Kết quả nslookup dc01.internal.corp từ trong VM phải trả về 10.11.1.10. Đây là xác nhận auto-registration hoạt động.
Cleanup — Dọn dẹp tài nguyên tránh phát sinh chi phí
# Gỡ VNet link trước khi xóa Private DNS Zone
az network private-dns link vnet delete \
--resource-group rg-az104-m11 \
--zone-name "internal.corp" \
--name "link-vnet-m11" \
--yes
# Xóa Private DNS Zone
az network private-dns zone delete \
--resource-group rg-az104-m11 \
--name "internal.corp" \
--yes
# Xóa toàn bộ Resource Group (VM, VNet, Public DNS Zone đều bị xóa)
az group delete --name rg-az104-m11 --yes --no-wait
echo "Đang xóa rg-az104-m11... Quá trình mất 3-5 phút."
Kết Quả Đầu Ra
Thêm custom domain vào Entra ID tenant, tạo TXT record xác minh tại registrar, verify thành công và hiểu sự khác biệt với Azure DNS zone
Tạo zone trên Azure DNS, ghi lại 4 nameserver, cấu hình NS delegation tại domain registrar để ủy quyền quản lý về Azure
Tạo A, AAAA, CNAME, MX, TXT, NS records bằng CLI và Portal, hiểu TTL và apex record (@)
Tạo Private DNS Zone, link VNet với auto-registration, xác minh VM tự động đăng ký A record khi được tạo trong VNet
Hiểu cách delegate subdomain bằng NS record trong parent zone, áp dụng RBAC cho phép team phụ quản lý zone con độc lập
Hiểu kịch bản dùng Private DNS Zone cho Azure Private Endpoint (privatelink zones) để traffic đi qua private IP
Ứng Dụng Thực Tế
Tình huống 1: Startup SaaS — Migration DNS về Azure
Công ty khởi nghiệp đang dùng GoDaddy DNS, muốn chuyển toàn bộ quản lý DNS về Azure để tích hợp với CI/CD pipeline và RBAC.
Tạo zone mystartup.vn trên Azure DNS. Export records hiện có từ GoDaddy dưới dạng BIND zone file. Import vào Azure DNS. Sau khi verify records đúng: cập nhật NS tại GoDaddy thành 4 NS Azure.
CI/CD: Azure DevOps pipeline tự động cập nhật A record khi deploy app mới (az network dns record-set a update). RBAC: Developer được DNS Zone Contributor — tự cập nhật CNAME không cần ticket IT.
DNS thay đổi cùng deployment pipeline — zero manual work. Alert khi records bị thay đổi ngoài pipeline. SLA 100% availability của Azure DNS (backed by anycast). Giảm MTTR khi incident.
Tình huống 2: Tập đoàn Logistics — Private DNS cho Microservices
Hệ thống tracking đơn hàng gồm 20 microservices cần discover lẫn nhau bằng tên miền nội bộ, không IP hardcode.
Private DNS Zone svc.logistics.internal. Mỗi microservice có CNAME record: order-api.svc.logistics.internal, tracking-api.svc.logistics.internal. VNet link với auto-registration cho VM/AKS nodes.
Khi scale out: Private Load Balancer IP tĩnh gán cho A record service → application code dùng tên miền thay IP. Private DNS Zone cũng dùng cho Azure Private Endpoint tới Azure SQL và Cosmos DB.
Zero IP hardcode trong code base. Thay đổi IP khi DR/failover chỉ cần cập nhật 1 DNS record — không rebuild Docker image. Traffic tới Azure SQL đi qua private link, không expose Internet.
Tình huống 3: Trường Đại học — Phân quyền DNS theo khoa
Trường có domain university.edu.vn, mỗi khoa muốn tự quản lý subdomain của mình mà không cần xin phép IT trung tâm.
IT trung tâm quản lý zone university.edu.vn. Tạo child zones: cntt.university.edu.vn, kinh-te.university.edu.vn. Trong parent zone: thêm NS record sets cho từng subdomain trỏ về NS của child zone.
RBAC: Khoa CNTT nhận DNS Zone Contributor trên cntt.university.edu.vn — tự tạo subdomain lab.cntt.university.edu.vn. IT trung tâm giữ Owner trên zone gốc, kiểm soát delegation.
Giảm 80% ticket IT cho việc tạo subdomain. Khoa tự chủ mà vẫn trong khuôn khổ domain trường. Không có rủi ro thay đổi nhầm zone gốc. Audit log đầy đủ qua Azure Activity Log.