🎯 Mục Tiêu Lab
Tạo VNet với 3 subnet: snet-app, snet-firewall, snet-mgmt
Deploy NVA (Network Virtual Appliance) đóng vai firewall trong snet-firewall
Tạo Route Table với UDR: 0.0.0.0/0 → next hop = IP firewall
Gán Route Table vào snet-app để ép egress traffic qua firewall
Dùng Next Hop tool trong Network Watcher để xác nhận route
Hiểu khái niệm IP forwarding trên NIC của NVA
📋 Chuẩn Bị
- Azure subscription với quyền Contributor
- Hoàn thành Lab 19 và 20 (hiểu NSG cơ bản)
- Network Watcher được bật tại southeastasia
- VNet: 10.21.0.0/16
- snet-app: 10.21.1.0/24 (VM ứng dụng)
- snet-firewall: 10.21.2.0/24 (NVA/firewall)
- NVA private IP: 10.21.2.4
🏗️ Kịch Bản
HoaTranLab cần đảm bảo mọi outbound traffic từ subnet ứng dụng đều đi qua firewall/NVA để kiểm tra, log, và lọc. Mặc định Azure dùng system route tự động ra internet. UDR (User Defined Route) sẽ ghi đè system route, ép toàn bộ traffic đi qua NVA trước khi ra ngoài.
🧪 Các Bước Thực Hiện
Tạo VNet với 2 Subnet và Deploy NVA (Firewall VM)
- 1.1Tạo RG
rg-az500-udr-lab21, region Southeast Asia - 1.2Tạo VNet
vnet-az500-lab21(10.21.0.0/16) với subnetsnet-app(10.21.1.0/24) - 1.3Thêm subnet
snet-firewall(10.21.2.0/24) vào VNet - 1.4Tạo VM
vm-az500-nvatrong snet-firewall, Ubuntu 22.04, Standard_B1s — đây là NVA giả lập firewall - 1.5NIC của vm-nva → IP configurations → Bật IP forwarding → Save
RG="rg-az500-udr-lab21"
az group create --name $RG --location southeastasia \
--tags "owner=hoatranlab" "env=lab" "module=az500-ch05"
# VNet + 2 subnets
az network vnet create \
--resource-group $RG \
--name vnet-az500-lab21 \
--address-prefix 10.21.0.0/16 \
--subnet-name snet-app \
--subnet-prefix 10.21.1.0/24
az network vnet subnet create \
--resource-group $RG \
--vnet-name vnet-az500-lab21 \
--name snet-firewall \
--address-prefix 10.21.2.0/24
# Public IP cho NVA (Standard SKU)
az network public-ip create \
--resource-group $RG --name pip-nva \
--sku Standard --allocation-method Static
# NIC cho NVA - bật IP forwarding
az network nic create \
--resource-group $RG --name nic-nva \
--vnet-name vnet-az500-lab21 \
--subnet snet-firewall \
--public-ip-address pip-nva \
--ip-forwarding true
# Deploy NVA (Ubuntu giả lập firewall)
az vm create \
--resource-group $RG --name vm-az500-nva \
--nics nic-nva \
--image Ubuntu2204 --size Standard_B1s \
--admin-username azureadmin --generate-ssh-keys \
--no-wait
# Lấy private IP của NVA (sẽ dùng làm next hop)
NVA_IP=$(az network nic show \
--resource-group $RG --name nic-nva \
--query "ipConfigurations[0].privateIPAddress" -o tsv)
echo "NVA Private IP (next hop): $NVA_IP"
Tạo Route Table và Thêm UDR Custom Route
- 2.1Portal → search "Route tables" → + Create → RG:
rg-az500-udr-lab21, Name:rt-az500-lab21, Region: Southeast Asia - 2.2Vào Route table → Routes → + Add: Route name:
route-to-firewall, Destination:0.0.0.0/0, Next hop type: Virtual appliance, Next hop address:10.21.2.4→ Add - 2.3Route table → Subnets → Associate → chọn VNet
vnet-az500-lab21, Subnet:snet-app→ OK
RG="rg-az500-udr-lab21"
NVA_IP="10.21.2.4" # Private IP của NVA (thay bằng IP thực nếu khác)
# Tạo Route Table
az network route-table create \
--resource-group $RG \
--name rt-az500-lab21 \
--location southeastasia \
--disable-bgp-route-propagation false
# Thêm UDR: 0.0.0.0/0 → Virtual Appliance (NVA)
az network route-table route create \
--resource-group $RG \
--route-table-name rt-az500-lab21 \
--name route-to-firewall \
--address-prefix 0.0.0.0/0 \
--next-hop-type VirtualAppliance \
--next-hop-ip-address $NVA_IP
# Thêm route giữ traffic nội bộ VNet dùng VnetLocal
az network route-table route create \
--resource-group $RG \
--route-table-name rt-az500-lab21 \
--name route-vnet-local \
--address-prefix 10.21.0.0/16 \
--next-hop-type VnetLocal
# Gán Route Table vào snet-app
az network vnet subnet update \
--resource-group $RG \
--vnet-name vnet-az500-lab21 \
--name snet-app \
--route-table rt-az500-lab21
# Xem routes
az network route-table route list \
--resource-group $RG \
--route-table-name rt-az500-lab21 \
--output table
Tạo VM App và Bật IP Forwarding trên OS NVA
- 3.1Tạo VM
vm-az500-apptrongsnet-app, Ubuntu 22.04, Standard_B1s, Public IP Standard - 3.2SSH vào
vm-az500-nva(NVA) → bật IP forwarding trên OS để forward packet
RG="rg-az500-udr-lab21"
# Tạo VM app trong snet-app
az network public-ip create \
--resource-group $RG --name pip-vm-app \
--sku Standard --allocation-method Static
az network nic create \
--resource-group $RG --name nic-vm-app \
--vnet-name vnet-az500-lab21 --subnet snet-app \
--public-ip-address pip-vm-app
az vm create \
--resource-group $RG --name vm-az500-app \
--nics nic-vm-app \
--image Ubuntu2204 --size Standard_B1s \
--admin-username azureadmin --generate-ssh-keys
# --- SSH vào NVA để bật IP forwarding trên Linux OS ---
NVA_PIP=$(az network public-ip show \
--resource-group $RG --name pip-nva --query ipAddress -o tsv)
echo "NVA Public IP: $NVA_PIP"
# Chạy lệnh này sau khi SSH vào NVA:
# ssh azureadmin@$NVA_PIP
# sudo sysctl -w net.ipv4.ip_forward=1
# echo "net.ipv4.ip_forward=1" | sudo tee -a /etc/sysctl.conf
# sudo sysctl -p
# Hoặc dùng run-command:
az vm run-command invoke \
--resource-group $RG \
--name vm-az500-nva \
--command-id RunShellScript \
--scripts "sysctl -w net.ipv4.ip_forward=1; echo 'net.ipv4.ip_forward=1' >> /etc/sysctl.conf"
Kiểm Tra Next Hop bằng Network Watcher
- 4.1Portal → Network Watcher → Next hop
- 4.2VM:
vm-az500-app, NIC: chọn NIC, Source IP:10.21.1.4, Destination IP:8.8.8.8 - 4.3Kết quả mong đợi: Next hop type = VirtualAppliance, Next hop IP =
10.21.2.4 - 4.4Test thêm: Destination =
10.21.1.5(cùng VNet) → Next hop: VnetLocal
RG="rg-az500-udr-lab21"
# Test 1: next hop cho traffic đến Internet (expect: VirtualAppliance → 10.21.2.4)
az network watcher show-next-hop \
--resource-group $RG \
--vm vm-az500-app \
--source-ip 10.21.1.4 \
--dest-ip 8.8.8.8
# Test 2: next hop cho traffic nội bộ VNet (expect: VnetLocal)
az network watcher show-next-hop \
--resource-group $RG \
--vm vm-az500-app \
--source-ip 10.21.1.4 \
--dest-ip 10.21.2.4
# Test 1 (Internet traffic):
{
"nextHopIpAddress": "10.21.2.4",
"nextHopType": "VirtualAppliance",
"routeTableId": "/subscriptions/.../rt-az500-lab21"
}
# Test 2 (VNet local traffic):
{
"nextHopIpAddress": "",
"nextHopType": "VnetLocal",
"routeTableId": "System Route"
}
📊 Kết Quả Đầu Ra
rt-az500-lab21 có route 0.0.0.0/0 → VirtualAppliance 10.21.2.4
Subnet snet-app có route table liên kết, override system route
Network Watcher xác nhận traffic đến 8.8.8.8 đi qua 10.21.2.4
NIC NVA: ip-forwarding = true; OS: net.ipv4.ip_forward = 1
🧹 Dọn Dẹp Tài Nguyên
az group delete --name rg-az500-udr-lab21 --yes --no-wait
❓ Câu Hỏi Ôn Tập
1. UDR (User Defined Route) ghi đè loại route nào? Có thể ghi đè route BGP từ VPN Gateway không?
Gợi ý: UDR ghi đè system routes và BGP routes. Có thể tắt BGP propagation trên route table để UDR ưu tiên.
2. Tại sao phải bật IP forwarding ở cả 2 nơi: Azure NIC và OS của NVA?
Gợi ý: Azure NIC: cho phép NIC nhận packet không phải địa chỉ của nó. OS: Linux mặc định drop packet không phải của mình, cần bật ip_forward để forward.
3. Next hop type "VirtualAppliance" khác gì với "Internet", "VnetLocal", "None"?
Gợi ý: VirtualAppliance = forward đến IP cụ thể (NVA); Internet = ra public internet; VnetLocal = trong VNet; None = drop traffic (black hole).
4. Trong sản xuất thực tế, Azure Firewall thay thế vai trò NVA ở lab này như thế nào? Ưu điểm là gì?
Gợi ý: Azure Firewall là managed PaaS, không cần quản lý VM, tích hợp Firewall Policy, threat intelligence, TLS inspection. UDR vẫn dùng nhưng next hop = Azure Firewall private IP.