Lý Thuyết Cốt Lõi
1. System Routes — Định Tuyến Mặc Định của Azure
Khi tạo một VNet, Azure tự động tạo các system routes cho mỗi subnet. Các route này không nhìn thấy được qua Portal nhưng luôn hoạt động ngầm. Chúng định tuyến traffic đến địa chỉ đích thông qua các next hop types được Azure quản lý.
| Address Prefix | Next Hop Type | Mô tả |
|---|---|---|
| 10.0.0.0/16 (VNet CIDR) | Virtual Network | Traffic trong cùng VNet đi trực tiếp — không qua router |
| 0.0.0.0/0 | Internet | Mọi traffic không khớp route nào → ra Internet |
| 10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16 | None (drop) | Private RFC1918 ranges không trong VNet → bị drop |
| 100.64.0.0/10 | None (drop) | Shared address space (RFC 6598) → bị drop |
- • VNet Peering: route đến address space của VNet peer được thêm tự động
- • VPN Gateway: BGP routes từ on-prem được propagate vào subnet
- • Virtual Network Service Endpoint: route đến service prefix
- • VNet Service Endpoint Policy: kiểm soát endpoint truy cập
- • Virtual Network: trong cùng VNet
- • Internet: ra Internet qua Azure Internet gateway
- • Virtual appliance: đến IP của NVA (VM)
- • Virtual network gateway: đến VPN/ExpressRoute Gateway
- • None: drop packet
2. User-Defined Routes (UDR) — Tùy Chỉnh Định Tuyến
UDR (còn gọi là custom routes) cho phép override system routes. Bạn tạo một Route Table, thêm các custom routes vào đó, rồi gắn Route Table vào một hoặc nhiều subnet. Route Table không áp dụng cho Gateway subnet.
- Tạo Route Table resource (cùng region với VNet)
- Thêm routes: Address prefix + Next hop type + Next hop IP
- Gắn Route Table vào subnet bằng Subnet Association
- Route table có thể gắn vào nhiều subnet
- Một subnet chỉ có thể gắn 1 route table
- Longest prefix match: route cụ thể hơn thắng (10.1.1.0/24 > 10.1.0.0/16)
- UDR thắng system route khi cùng prefix
- BGP routes từ on-prem có độ ưu tiên thấp hơn UDR
- Disable BGP route propagation nếu không muốn BGP routes vào subnet
UDR: 0.0.0.0/0 → Next hop: Virtual network gateway. Buộc toàn bộ Internet traffic qua on-prem hoặc NVA để inspect trước khi ra ngoài.
UDR: specific prefix → Next hop: None. Drop tất cả traffic đến địa chỉ đó — dùng để block truy cập vào IP độc hại hoặc tạo subnet isolation.
UDR → Virtual Appliance (NVA/Firewall). Traffic đi qua NVA để deep packet inspection, logging, IDS/IPS trước khi đến đích.
3. Service Endpoints — Truy Cập An Toàn Dịch Vụ PaaS
Service Endpoint mở rộng identity của VNet subnet đến các dịch vụ Azure PaaS (Storage, SQL Database, Key Vault...). Traffic từ subnet đến service đi qua Microsoft backbone thay vì Internet, nhưng vẫn đến public IP của service.
→ Internet (NAT public IP)
→ storage.core.windows.net
Traffic qua Internet công cộng
→ Microsoft Backbone
→ storage.core.windows.net
Traffic qua backbone, không ra Internet
- Vào VNet → Subnets → chọn subnet
- Mục "Service Endpoints" → chọn service (Microsoft.Storage, Microsoft.Sql...)
- Azure tự thêm route đến service prefix vào subnet
- Cấu hình Firewall/VNet rule trên Storage Account/SQL để chỉ cho phép subnet này
- ✓ Bảo mật tốt hơn — service chỉ nhận traffic từ subnet cụ thể
- ✓ Không cần Public IP trên VM để truy cập PaaS
- ✓ Không tốn phí thêm (miễn phí tính năng)
- ✗ Service vẫn có Public IP — không ẩn hoàn toàn (cần Private Endpoint)
- ✗ On-prem không benefit — chỉ áp dụng từ subnet Azure
4. Service Endpoint Services & So Sánh với Private Endpoint
Azure hỗ trợ Service Endpoint cho nhiều dịch vụ PaaS. Mỗi service có namespace riêng cần bật. Dưới đây là các dịch vụ phổ biến và so sánh với Private Endpoint.
Azure Blob, File, Queue, Table Storage. Bật trên subnet → cấu hình Storage Account Firewall chỉ cho phép VNet này.
Azure SQL Database, SQL Managed Instance, Azure Synapse. Cấu hình VNet rules trên SQL Server firewall.
Azure Key Vault. Secrets, certificates, keys chỉ accessible từ subnet được phép. Kết hợp với Managed Identity.
Azure Service Bus messaging. Queue và Topic chỉ nhận/gửi từ subnet whitelist.
Azure Event Hubs ingestion pipeline. Bảo vệ event stream từ IoT devices qua subnet dedicated.
Azure Container Registry. Chỉ cho phép AKS subnet pull images, block Internet access.
| Tiêu chí | Service Endpoint | Private Endpoint |
|---|---|---|
| IP của service | Public IP (vẫn giữ) | Private IP trong VNet của bạn |
| On-premises access | Không hỗ trợ trực tiếp | Có — qua VPN/ExpressRoute |
| Chi phí | Miễn phí | Tính phí per endpoint + data |
| DNS resolution | FQDN resolve public IP | FQDN resolve private IP (Private DNS) |
| Khi nào dùng | Bảo mật traffic từ Azure subnet đến PaaS | Yêu cầu hoàn toàn private, on-prem cần truy cập |
Bài Tập Thực Hành (Lab)
Tạo Resource Group, VNet với hai subnet và Route Table UDR
# Tạo Resource Group
az group create \
--name rg-az104-m13 \
--location southeastasia
# Tạo VNet với subnet-app (workload) và subnet-infra (NVA)
az network vnet create \
--name vnet-m13 \
--resource-group rg-az104-m13 \
--location southeastasia \
--address-prefix 10.13.0.0/16 \
--subnet-name subnet-app \
--subnet-prefix 10.13.1.0/24
# Thêm subnet-infra cho NVA/Firewall
az network vnet subnet create \
--resource-group rg-az104-m13 \
--vnet-name vnet-m13 \
--name subnet-infra \
--address-prefix 10.13.2.0/24
# Tạo NVA VM trong subnet-infra
az vm create \
--resource-group rg-az104-m13 \
--name vm-nva \
--image Ubuntu2204 \
--size Standard_B1s \
--vnet-name vnet-m13 \
--subnet subnet-infra \
--admin-username azureuser \
--generate-ssh-keys \
--public-ip-sku Standard \
--no-wait
echo "Tài nguyên cơ bản đã được tạo."
Tạo UDR với route Force Tunneling và Blackhole Route, gắn vào subnet-app
# Lấy Private IP của NVA VM
NVA_IP=$(az vm show \
--resource-group rg-az104-m13 \
--name vm-nva \
--show-details \
--query privateIps \
--output tsv)
echo "NVA IP: $NVA_IP"
# Bật IP Forwarding trên NIC của NVA
NIC_ID=$(az vm show \
--resource-group rg-az104-m13 \
--name vm-nva \
--query 'networkProfile.networkInterfaces[0].id' \
--output tsv)
NIC_NAME=$(basename $NIC_ID)
az network nic update \
--resource-group rg-az104-m13 \
--name $NIC_NAME \
--ip-forwarding true
# Tạo Route Table cho subnet-app
az network route-table create \
--resource-group rg-az104-m13 \
--name rt-app \
--location southeastasia \
--disable-bgp-route-propagation true
# Route 1: Force Tunneling — Internet traffic qua NVA
az network route-table route create \
--resource-group rg-az104-m13 \
--route-table-name rt-app \
--name force-tunnel-internet \
--address-prefix 0.0.0.0/0 \
--next-hop-type VirtualAppliance \
--next-hop-ip-address $NVA_IP
# Route 2: Blackhole — block traffic đến một IP suspicious (ví dụ: 1.2.3.4/32)
az network route-table route create \
--resource-group rg-az104-m13 \
--route-table-name rt-app \
--name blackhole-suspicious-ip \
--address-prefix 1.2.3.4/32 \
--next-hop-type None
# Gắn Route Table vào subnet-app
az network vnet subnet update \
--resource-group rg-az104-m13 \
--vnet-name vnet-m13 \
--name subnet-app \
--route-table rt-app
# Xem tất cả routes trong route table
az network route-table route list \
--resource-group rg-az104-m13 \
--route-table-name rt-app \
--output table
Bật Service Endpoint Microsoft.Storage trên subnet-app và cấu hình Storage Account firewall
# Bật Service Endpoint Microsoft.Storage trên subnet-app
az network vnet subnet update \
--resource-group rg-az104-m13 \
--vnet-name vnet-m13 \
--name subnet-app \
--service-endpoints Microsoft.Storage
# Tên Storage Account phải unique toàn cầu, 3-24 ký tự, viết thường, chỉ chữ và số
STORAGE_NAME="staz104m13$(head -c 4 /dev/urandom | xxd -p)"
# Tạo Storage Account với network access mặc định bị khóa
az storage account create \
--name $STORAGE_NAME \
--resource-group rg-az104-m13 \
--location southeastasia \
--sku Standard_LRS \
--kind StorageV2 \
--access-tier Hot \
--https-only true \
--min-tls-version TLS1_2 \
--default-action Deny
echo "Storage Account: $STORAGE_NAME"
# Cho phép subnet-app truy cập Storage Account qua Service Endpoint
az storage account network-rule add \
--resource-group rg-az104-m13 \
--account-name $STORAGE_NAME \
--vnet-name vnet-m13 \
--subnet subnet-app
# Kiểm tra network rules đã áp dụng
az storage account network-rule list \
--resource-group rg-az104-m13 \
--account-name $STORAGE_NAME \
--output table
Kiểm tra Effective Routes trên VM để xác nhận UDR đang hoạt động
# Tạo VM test trong subnet-app để kiểm tra routing
az vm create \
--resource-group rg-az104-m13 \
--name vm-app-test \
--image Ubuntu2204 \
--size Standard_B1s \
--vnet-name vnet-m13 \
--subnet subnet-app \
--admin-username azureuser \
--generate-ssh-keys \
--public-ip-sku Standard \
--nsg-rule SSH
# Lấy NIC ID của vm-app-test
TEST_NIC_ID=$(az vm show \
--resource-group rg-az104-m13 \
--name vm-app-test \
--query 'networkProfile.networkInterfaces[0].id' \
--output tsv)
TEST_NIC_NAME=$(basename $TEST_NIC_ID)
# Xem Effective Routes — các route thực tế đang áp dụng cho NIC này
az network nic show-effective-route-table \
--resource-group rg-az104-m13 \
--name $TEST_NIC_NAME \
--output table
# Kết quả kỳ vọng:
# Source State AddressPrefix NextHopType NextHopIpAddress
# User Active 0.0.0.0/0 VirtualAppliance 10.13.2.x (NVA IP)
# User Active 1.2.3.4/32 None -
# Default Active 10.13.0.0/16 VnetLocal -
Cleanup — Dọn dẹp tài nguyên để tránh phát sinh chi phí
# Xóa toàn bộ Resource Group — kéo theo VNet, VMs, Route Table, Storage Account
az group delete --name rg-az104-m13 --yes --no-wait
echo "Cleanup đã được gửi. RG sẽ bị xóa trong vài phút."
Kết Quả Đầu Ra
Giải thích được Azure tự động tạo route nào khi tạo VNet và logic longest prefix match
Tạo Route Table với multiple routes, gắn vào subnet, xác minh Effective Routes trên NIC
Buộc Internet traffic qua NVA bằng UDR 0.0.0.0/0 → Virtual Appliance để inspect traffic
Cấu hình Microsoft.Storage endpoint trên subnet và whitelist subnet trong Storage Firewall
Phân tích trade-off về chi phí, bảo mật, on-prem access để chọn đúng giải pháp theo yêu cầu
Drop traffic đến IP/CIDR cụ thể bằng Next hop = None để tạo security block hoặc subnet isolation
Ứng Dụng Thực Tế
Tình huống 1: Công ty chứng khoán — Bảo vệ dữ liệu giao dịch trên Azure Storage
Dữ liệu giao dịch nhạy cảm lưu trên Azure Blob Storage. Yêu cầu chỉ các server trading trong subnet cụ thể mới được đọc/ghi, tuyệt đối không cho phép access từ Internet.
Bật Service Endpoint Microsoft.Storage trên subnet-trading. Storage Account Firewall: Default action = Deny, chỉ whitelist subnet-trading. VM trading dùng Managed Identity để authenticate vào Storage — không cần storage key.
UDR trên subnet-trading: 0.0.0.0/0 → Azure Firewall (force tunnel). Service Endpoint policy (Microsoft.Storage) giới hạn chỉ storage accounts trong subscription nội bộ — chặn data exfiltration sang storage ngoài.
Dữ liệu giao dịch không thể bị lộ qua Internet. Không cần Private Endpoint (tiết kiệm chi phí). Traffic đến Storage đi qua backbone, độ trễ thấp — quan trọng cho high-frequency trading.
Tình huống 2: ISP lớn tại Việt Nam — Force Tunneling kiểm soát Internet outbound
ISP vận hành hệ thống billing và OSS/BSS trên Azure. Theo quy định, toàn bộ traffic Internet từ server phải đi qua Proxy/Firewall nội bộ để logging và compliance.
UDR: 0.0.0.0/0 → Virtual Appliance (Azure Firewall Premium với URL filtering). Tất cả Internet egress từ subnet-oss, subnet-billing bị buộc qua Firewall. Firewall log đến Log Analytics workspace.
Route table rt-oss và rt-billing đều có force tunnel route. Blackhole routes cho các IP CDN tải về malware đã biết. Disable BGP propagation để tránh BGP routes từ on-prem bypass UDR.
100% Internet traffic được log — đáp ứng yêu cầu BSTT Bộ TT&TT. Blackhole tự động block IP độc hại từ threat intelligence feed. Phát hiện data exfiltration qua anomaly detection trên log.
Tình huống 3: Startup thương mại điện tử — Service Endpoint cho SQL và Key Vault
Startup xây dựng backend trên Azure App Service + Azure SQL + Key Vault. Ngân sách hạn chế, không muốn trả phí Private Endpoint nhưng vẫn cần bảo mật tốt cho database và secrets.
Bật cả 3 Service Endpoints trên subnet-backend: Microsoft.Sql, Microsoft.KeyVault, Microsoft.Storage. SQL Server firewall: Default deny + VNet rule cho subnet-backend. Key Vault network ACL tương tự.
App Service Integrated VNet vào subnet-backend. UDR: route đến SQL public prefix → Virtual Network Service Endpoint (không qua NVA — đã có service endpoint xử lý). Key Vault access policy kết hợp Managed Identity.
Chi phí: $0 cho Service Endpoints so với ~$150/tháng cho 3 Private Endpoints. SQL, Key Vault không accessible từ Internet. Startup đạt được bảo mật mức doanh nghiệp với chi phí startup.