MODULE 11 Virtual Networking · 15–20% ~3 giờ

Cấu hình Azure DNS

Quản lý DNS public và private trên Azure — từ xác minh custom domain, tạo Public DNS zones, ủy quyền nameserver, đến triển khai Private DNS zones cho phân giải tên nội bộ trong VNet.

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.

Quy trình thêm Custom Domain
  1. Entra ID → Custom domain names → Add custom domain
  2. Nhập tên miền: hoatranlab.io.vn
  3. Azure cung cấp TXT record để xác minh
  4. Thêm TXT record vào DNS registrar (domain provider)
  5. Nhấn Verify — Azure kiểm tra TXT record qua DNS
  6. Sau xác minh: đặt làm Primary domain nếu muốn
TXT Record xác minh (ví dụ)
Type: TXT
Name: @ (root)
Value: MS=ms12345678
TTL: 3600

Sau khi Azure verify thành công, TXT record có thể xóa khỏi registrar.

Lưu ý: Xác minh custom domain trong Entra ID khác hoàn toàn với tạo DNS zone trên Azure DNS. Entra ID verification chứng minh bạn sở hữu tên miền đó. Azure DNS là dịch vụ host zone DNS — hai tính năng độc lập nhau.

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.

Bước 1
Tạo Public DNS Zone

az network dns zone create → Azure tạo 4 nameserver (ns1-XX.azure-dns.com) cho zone

Bước 2
Cập nhật NS ở Registrar

Tại domain registrar (Mắt Bão, PA Web, GoDaddy): thay NS record thành 4 nameserver Azure cung cấp

Bước 3
Thêm DNS Records

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.

Public DNS Zone vs Private DNS Zone
Đặc điểm Public Private
AccessibleInternetVNet only
VNet linkKhông cầnBắt buộc
Auto-registerKhôngHỗ trợ
Split-horizonKhôngHỗ trợ
Auto-registration

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-01 tự có record vm-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
Kịch bản Private DNS quan trọng: Khi dùng Azure Private Endpoint (cho Storage, SQL, Key Vault, v.v.), bắt buộc phải có Private DNS Zone tương ứng (VD: 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ý.

Quy trình Subdomain Delegation
  1. Tạo child zone: dev.hoatranlab.io.vn
  2. Ghi lại 4 nameserver của child zone
  3. Trong parent zone hoatranlab.io.vn: tạo NS record set tên dev trỏ đến 4 NS của child zone
  4. Xác minh: nslookup -type=NS dev.hoatranlab.io.vn
Child zone và RBAC

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)

Lab 11-A: Public DNS Zone Lab 11-B: DNS Records Lab 11-C: Private DNS Zone Lab 11-D: Cleanup
1

Tạo Resource Group và Public DNS Zone

Azure CLI— Chạy được trên PowerShell, CMD, Bash hoặc Azure Cloud Shell
# 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
Verify Portal: Portal → DNS zones → yourdomain.io.vn → Overview → ghi lại 4 Nameservers (dạng ns1-XX.azure-dns.com đến ns4-XX.azure-dns.net). Đây là giá trị cần nhập vào DNS registrar của bạn để ủy quyền zone.
2

Thêm A record, CNAME, MX và TXT record

Azure CLI— Chạy được trên PowerShell, CMD, Bash hoặc Azure Cloud Shell
# 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
Verify Portal: Portal → DNS zones → yourdomain.io.vn → Record sets → xác nhận: A record "www" và "@", CNAME "blog", MX "@", TXT "@". Nếu đã delegate NS ở registrar, test bằng: nslookup www.yourdomain.io.vn từ máy local.
3

Tạo Private DNS Zone, link VNet và bật auto-registration

Bash— Linux/macOS/Cloud Shell, KHÔNG chạy CMD
# 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
Verify Portal: Portal → Private DNS zones → internal.corp → Virtual network links → link-vnet-m11 phải có Status = Completed và Auto registration = Enabled. Vào Record sets → xác nhận dc01 (10.11.1.10) và sqlprod (10.11.1.20).
4

Tạo VM trong VNet và xác minh auto-registration DNS hoạt động

Azure CLI— Chạy được trên PowerShell, CMD, Bash hoặc Azure Cloud Shell
# 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"
Verify: Sau khi VM tạo xong, chạy lại lệnh list record-set — VM 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.
5

Cleanup — Dọn dẹp tài nguyên tránh phát sinh chi phí

Azure CLI— Chạy được trên PowerShell, CMD, Bash hoặc Azure Cloud Shell
# 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

Xác minh Custom Domain Entra ID

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 Public DNS Zone thành công

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

Quản lý đầy đủ loại DNS record

Tạo A, AAAA, CNAME, MX, TXT, NS records bằng CLI và Portal, hiểu TTL và apex record (@)

Private DNS Zone triển khai

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

Subdomain Delegation nắm vững

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

Private Endpoint DNS pattern

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.

Giải pháp

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.

Triển khai

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.

Lợi ích

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.

Giải pháp

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.

Triển khai

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.

Lợi ích

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.

Giải pháp

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.

Triển khai

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.

Lợi ích

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.

Zalo