Lý Thuyết Cốt Lõi
1. Tổng Quan Azure Network Watcher
Network Watcher là dịch vụ giám sát, chẩn đoán và phân tích mạng của Azure. Network Watcher tự động được enable khi bạn tạo VNet trong subscription — tồn tại dưới dạng resource trong resource group NetworkWatcherRG.
- • Topology: visualize cấu trúc VNet
- • Connection Monitor: theo dõi kết nối liên tục
- • Network Performance Monitor
- • IP Flow Verify: kiểm tra NSG allow/deny
- • NSG Diagnostics: effective rules
- • Next Hop: xem routing quyết định
- • VPN Troubleshoot: chẩn đoán VPN gateway
- • NSG Flow Logs: ghi toàn bộ traffic qua NSG
- • Packet Capture: bắt gói tin từ VM
- • Traffic Analytics: phân tích flow logs bằng KQL
2. IP Flow Verify & NSG Diagnostics
Đây là hai công cụ quan trọng nhất để troubleshoot vấn đề kết nối mạng liên quan đến NSG (Network Security Group) — câu hỏi thường gặp nhất trong thực tế vận hành Azure.
IP Flow Verify kiểm tra xem một packet cụ thể (với source IP, destination IP, port, protocol) có được NSG cho phép hay bị từ chối — và nếu bị từ chối thì do NSG rule nào.
- • VM (NIC) cần kiểm tra
- • Direction: Inbound / Outbound
- • Protocol: TCP / UDP
- • Local IP + Local Port (IP của VM)
- • Remote IP + Remote Port (IP nguồn/đích)
- • Allow / Deny
- • Tên NSG rule quyết định kết quả
NSG Diagnostics cho phép kiểm tra effective security rules của một VM — tổng hợp tất cả NSG rules từ Subnet NSG và NIC NSG, theo đúng thứ tự ưu tiên (priority).
- • IP Flow Verify: kiểm tra 1 packet cụ thể → Allow/Deny
- • NSG Diagnostics: liệt kê toàn bộ effective rules theo thứ tự priority, giúp thấy toàn cảnh security posture
- • Dùng NSG Diagnostics để audit — không chỉ troubleshoot
VM, VM Scale Set instance, Application Gateway, hoặc bất kỳ resource có NIC
3. Connection Monitor & Network Topology
Connection Monitor theo dõi kết nối từ một endpoint (source) đến endpoint khác (destination) theo chu kỳ định kỳ. Phát hiện kết nối đứt, latency tăng, packet loss — và lưu kết quả vào Log Analytics Workspace.
- • Azure VM (cần NW Agent)
- • Azure VMSS
- • On-premises machine (Arc-enabled)
- • Azure Bastion
- • Azure VM / VMSS
- • FQDN / URL (HTTP/HTTPS)
- • IP Address (bất kỳ)
- • On-premises endpoint
- • Checks failed (%)
- • Round-trip time (ms)
- • Test group success/fail
- • Hop-by-hop path info
Topology visualize toàn bộ cấu trúc mạng Azure trong một VNet hoặc Resource Group — VNet, Subnets, VMs, NICs, NSGs, Public IPs, Load Balancers, Peerings. Hữu ích để:
- • Hiểu nhanh cấu trúc mạng khi mới tiếp quản dự án
- • Verify thiết kế mạng đã đúng với diagram không
- • Phát hiện resource "mồ côi" (NIC không gắn VM, Public IP không dùng)
- • Export diagram sang SVG/PNG để documentation
- • Click vào từng resource trong diagram để xem config
- • Không cần cài agent — hoạt động ngay từ Portal
4. Next Hop, Packet Capture & NSG Flow Logs
Trả lời câu hỏi "Traffic từ VM đến IP X sẽ đi qua đâu?". Kết quả gồm: Next hop type (Internet / VirtualAppliance / VnetLocal / None) và Next hop IP.
Dùng để debug routing khi UDR (user-defined route) hoặc BGP route override system route bất ngờ.
Bắt gói tin từ NIC của VM trực tiếp trên cloud — không cần RDP vào và cài Wireshark. File capture lưu vào Storage Account hoặc local VM disk dạng .cap / .pcap.
Filter theo protocol, port, IP trước khi capture để giảm file size. Cần Network Watcher Agent.
Ghi lại mọi IP traffic qua NSG — allow và deny — bao gồm source/destination IP, port, protocol, bytes. Lưu vào Storage Account dạng JSON theo giờ.
Kết hợp Traffic Analytics (trên Log Analytics) để query KQL, visualize top talkers, detect anomalies.
Bài Tập Thực Hành (Lab)
Tạo môi trường lab — VNet, Subnet, NSG, VM và Storage Account
# Tạo Resource Group
az group create \
--name rg-az104-m31 \
--location southeastasia \
--tags Course=AZ-104 Module=31 Environment=Lab
# Tạo VNet + Subnet
az network vnet create \
--resource-group rg-az104-m31 \
--name vnet-lab31 \
--address-prefix 10.31.0.0/16 \
--subnet-name subnet-web \
--subnet-prefix 10.31.1.0/24 \
--location southeastasia
# Tạo NSG với rule chặn SSH từ internet (để test IP Flow Verify)
az network nsg create \
--resource-group rg-az104-m31 \
--name nsg-lab31-web \
--location southeastasia
# Cho phép HTTP (80) từ internet
az network nsg rule create \
--resource-group rg-az104-m31 \
--nsg-name nsg-lab31-web \
--name "Allow-HTTP-Inbound" \
--priority 100 \
--direction Inbound \
--access Allow \
--protocol Tcp \
--destination-port-range 80
# Chặn SSH (22) từ internet — để test IP Flow Verify
az network nsg rule create \
--resource-group rg-az104-m31 \
--nsg-name nsg-lab31-web \
--name "Deny-SSH-Inbound" \
--priority 200 \
--direction Inbound \
--access Deny \
--protocol Tcp \
--destination-port-range 22
# Gắn NSG vào Subnet
az network vnet subnet update \
--resource-group rg-az104-m31 \
--vnet-name vnet-lab31 \
--name subnet-web \
--network-security-group nsg-lab31-web
# Tạo VM trong subnet
az vm create \
--resource-group rg-az104-m31 \
--name vm-nw-lab31 \
--image Ubuntu2204 \
--size Standard_B1s \
--vnet-name vnet-lab31 \
--subnet subnet-web \
--admin-username azureuser \
--generate-ssh-keys \
--location southeastasia \
--tags Course=AZ-104 Module=31
# Tạo Storage Account cho NSG Flow Logs và Packet Capture
STORAGE_NAME="stnwlab31$(date +%s | tail -c 6)"
az storage account create \
--name "$STORAGE_NAME" \
--resource-group rg-az104-m31 \
--location southeastasia \
--sku Standard_LRS \
--kind StorageV2 \
--https-only true
echo "Storage Account: $STORAGE_NAME"
echo "VM tạo xong. Môi trường lab sẵn sàng."
IP Flow Verify — Kiểm tra NSG allow/deny cho traffic cụ thể
VM_ID=$(az vm show \
--resource-group rg-az104-m31 \
--name vm-nw-lab31 \
--query id -o tsv)
VM_PRIVATE_IP=$(az vm show \
--resource-group rg-az104-m31 \
--name vm-nw-lab31 \
--show-details \
--query privateIps -o tsv)
echo "VM Private IP: $VM_PRIVATE_IP"
# Test 1: HTTP (port 80) từ internet vào VM — kỳ vọng ALLOW
echo "=== Test 1: HTTP Inbound (port 80) — kỳ vọng Allow ==="
az network watcher test-ip-flow \
--resource-group rg-az104-m31 \
--vm vm-nw-lab31 \
--direction Inbound \
--protocol TCP \
--local "$VM_PRIVATE_IP:80" \
--remote "203.0.113.1:12345" \
--out table
# Test 2: SSH (port 22) từ internet vào VM — kỳ vọng DENY
echo "=== Test 2: SSH Inbound (port 22) — kỳ vọng Deny ==="
az network watcher test-ip-flow \
--resource-group rg-az104-m31 \
--vm vm-nw-lab31 \
--direction Inbound \
--protocol TCP \
--local "$VM_PRIVATE_IP:22" \
--remote "203.0.113.1:54321" \
--out table
# Test 3: HTTPS (port 443) outbound từ VM ra internet — kỳ vọng ALLOW (no outbound deny)
echo "=== Test 3: HTTPS Outbound (port 443) — kỳ vọng Allow ==="
az network watcher test-ip-flow \
--resource-group rg-az104-m31 \
--vm vm-nw-lab31 \
--direction Outbound \
--protocol TCP \
--local "$VM_PRIVATE_IP:50000" \
--remote "8.8.8.8:443" \
--out table
Allow (rule Allow-HTTP-Inbound priority 100). Test 2 → Deny (rule Deny-SSH-Inbound priority 200). Test 3 → Allow (AllowInternetOutBound default rule). Output CLI sẽ hiện tên rule quyết định kết quả.
NSG Diagnostics, Next Hop và bật NSG Flow Logs
VM_PRIVATE_IP=$(az vm show \
--resource-group rg-az104-m31 \
--name vm-nw-lab31 \
--show-details --query privateIps -o tsv)
NIC_ID=$(az vm show \
--resource-group rg-az104-m31 \
--name vm-nw-lab31 \
--query "networkProfile.networkInterfaces[0].id" -o tsv)
# NSG Diagnostics — xem effective rules trên NIC của VM
echo "=== NSG Effective Security Rules ==="
az network watcher run-configuration-diagnostic \
--resource "$NIC_ID" \
--direction Inbound \
--protocol TCP \
--source "203.0.113.1" \
--destination "$VM_PRIVATE_IP" \
--destination-port 80 \
--out table
# Next Hop — traffic từ VM đến Google DNS (8.8.8.8)
echo "=== Next Hop: VM → 8.8.8.8 ==="
az network watcher show-next-hop \
--resource-group rg-az104-m31 \
--vm vm-nw-lab31 \
--source-ip "$VM_PRIVATE_IP" \
--dest-ip 8.8.8.8 \
--out table
# Bật NSG Flow Logs v2 — ghi toàn bộ traffic qua NSG
STORAGE_NAME=$(az storage account list \
--resource-group rg-az104-m31 \
--query "[0].name" -o tsv)
STORAGE_ID=$(az storage account show \
--name "$STORAGE_NAME" \
--resource-group rg-az104-m31 \
--query id -o tsv)
NSG_ID=$(az network nsg show \
--resource-group rg-az104-m31 \
--name nsg-lab31-web \
--query id -o tsv)
az network watcher flow-log create \
--location southeastasia \
--resource-group rg-az104-m31 \
--name flowlog-nsg-lab31 \
--nsg "$NSG_ID" \
--storage-account "$STORAGE_ID" \
--enabled true \
--format JSON \
--log-version 2 \
--retention 7
echo "NSG Flow Logs bật thành công. Logs sẽ xuất hiện trong Storage Account sau 10 phút."
echo "Path: insights-logs-networksecuritygroupflowevent/..."
Tạo Connection Monitor và xem Network Topology
VM_ID=$(az vm show \
--resource-group rg-az104-m31 \
--name vm-nw-lab31 \
--query id -o tsv)
# Cài Network Watcher Agent trên VM (cần cho Connection Monitor và Packet Capture)
az vm extension set \
--resource-group rg-az104-m31 \
--vm-name vm-nw-lab31 \
--name NetworkWatcherAgentLinux \
--publisher Microsoft.Azure.NetworkWatcher \
--version 1.4
echo "Network Watcher Agent cài xong."
# Tạo Connection Monitor — kiểm tra VM đến Google DNS (8.8.8.8:53)
# và đến Microsoft (microsoft.com:443) mỗi 30 giây
az network watcher connection-monitor create \
--connection-monitor-name "cm-vm-to-internet-lab31" \
--network-watcher-name "NetworkWatcher_southeastasia" \
--resource-group "NetworkWatcherRG" \
--location southeastasia \
--endpoints '[
{
"name": "source-vm-nw-lab31",
"type": "AzureVM",
"resourceId": "'"$VM_ID"'"
},
{
"name": "dest-google-dns",
"type": "ExternalAddress",
"address": "8.8.8.8"
},
{
"name": "dest-microsoft-com",
"type": "ExternalAddress",
"address": "microsoft.com"
}
]' \
--test-configurations '[
{
"name": "tc-udp-dns",
"testFrequencySec": 30,
"protocol": "UDP",
"udpConfiguration": {"port": 53}
},
{
"name": "tc-tcp-https",
"testFrequencySec": 30,
"protocol": "TCP",
"tcpConfiguration": {"port": 443}
}
]' \
--test-groups '[
{
"name": "tg-internet-connectivity",
"enabled": true,
"sources": ["source-vm-nw-lab31"],
"destinations": ["dest-google-dns", "dest-microsoft-com"],
"testConfigurations": ["tc-udp-dns", "tc-tcp-https"]
}
]'
# Xem Topology của VNet lab31
az network watcher show-topology \
--resource-group rg-az104-m31 \
--location southeastasia \
--output json | python3 -c "
import sys, json
data = json.load(sys.stdin)
print('=== Network Topology Resources ===')
for r in data.get('resources', []):
print(f\" Type: {r.get('type',''):<40} Name: {r.get('name','')}\")
"
echo "Connection Monitor tạo xong. Kết quả sẽ xuất hiện sau 2-3 phút."
Cleanup — Dọn dẹp toàn bộ tài nguyên Lab 31
# Xóa Connection Monitor (nằm trong NetworkWatcherRG, phải xóa riêng)
az network watcher connection-monitor delete \
--connection-monitor-name "cm-vm-to-internet-lab31" \
--network-watcher-name "NetworkWatcher_southeastasia" \
--resource-group "NetworkWatcherRG"
# Tắt NSG Flow Logs trước khi xóa NSG
az network watcher flow-log delete \
--location southeastasia \
--name flowlog-nsg-lab31
# Xóa Resource Group — kéo theo VM, VNet, NSG, Storage Account
az group delete --name rg-az104-m31 --yes --no-wait
echo "Cleanup hoàn tất."
echo "Lưu ý: NetworkWatcherRG và NetworkWatcher_southeastasia KHÔNG bị xóa."
echo "Chúng là shared resources, xóa nếu không còn VNet nào trong region."
Kết Quả Đầu Ra
Kiểm tra traffic inbound/outbound bị NSG allow hay deny, xác định tên rule quyết định kết quả
Xem toàn bộ effective security rules trên VM theo đúng thứ tự priority từ Subnet NSG và NIC NSG
Tạo monitor theo dõi liên tục VM đến endpoint nội bộ hoặc internet, đo latency và packet loss
Visualize cấu trúc VNet, subnet, VM, NSG, Load Balancer — phát hiện resource mồ côi và verify thiết kế
Ghi toàn bộ traffic qua NSG vào Storage Account, cấu hình retention, kích hoạt Traffic Analytics
Xác định routing path của traffic, bắt gói tin từ VM lên Storage Account để phân tích Wireshark
Ứng Dụng Thực Tế
Tình huống 1: Công ty phần mềm — Debug kết nối microservice bí ẩn
Service A không kết nối được Service B trong cùng VNet. Dev team đã kiểm tra code nhưng không tìm ra nguyên nhân — suspicion là NSG chặn.
IP Flow Verify từ Service A VM (source) đến Service B VM (dest) port 8080. Kết quả: Deny — NSG rule "DenyAllInbound" priority 4096 đang chặn vì NSG của Subnet B thiếu rule allow port 8080 từ Subnet A CIDR.
NSG Diagnostics xác nhận chính xác rule thiếu. Thêm NSG rule Allow TCP 8080 từ 10.0.1.0/24 (Subnet A) vào NSG của Subnet B. Test lại IP Flow Verify → Allow. Connection Monitor xác nhận kết nối stable.
Debug từ 3 ngày xuống 15 phút. Dev team tự troubleshoot được mà không cần Wireshark hay tcpdump bên trong VM. NSG Flow Logs giúp audit toàn bộ traffic để phát hiện vấn đề tương tự trong tương lai.
Tình huống 2: Ngân hàng — NSG Flow Logs làm forensic evidence
Phát hiện nghi vấn data exfiltration từ một VM production — cần bằng chứng toàn bộ kết nối ra internet trong 7 ngày qua.
NSG Flow Logs v2 (đã bật trước từ policy) có đầy đủ record. Traffic Analytics trên Log Analytics cho phép KQL query: lọc outbound traffic từ VM nghi ngờ, tổng hợp bytes transferred theo destination IP, tìm IP lạ không thuộc whitelist.
KQL query: AzureNetworkAnalytics_CL | where SrcIP_s == "10.0.1.5" | where FlowDirection_s == "O" | summarize Bytes=sum(OutboundBytes_d) by DestIP_s | order by Bytes desc. Packet Capture bắt traffic realtime để phân tích payload bằng Wireshark.
Forensic evidence đầy đủ 7 ngày — phát hiện 3GB data gửi đến IP tại nước ngoài lúc 03:00 sáng. Bằng chứng đủ mạnh cho điều tra nội bộ và báo cáo cơ quan chức năng. Đáp ứng yêu cầu lưu log 1 năm của NHNN.
Tình huống 3: Tập đoàn đa quốc gia — Giám sát VPN Site-to-Site HCM–Singapore
VPN kết nối văn phòng HCM (on-premises) với Azure Singapore thỉnh thoảng chập chờn — cần giám sát 24/7 và phát hiện ngay khi đứt.
Connection Monitor từ Azure VM (Singapore) đến on-premises server (HCM) qua VPN, test ICMP + TCP 445 mỗi 30 giây. VPN Troubleshoot khi latency > 100ms hoặc packet loss > 5%. Network Topology view hiện cấu trúc VPN gateway.
Connection Monitor gửi data sang Log Analytics. Alert rule kích hoạt khi ChecksFailedPercent > 10% trong 5 phút → SMS + email NOC team. Next Hop xác nhận traffic đi qua VirtualNetworkGateway đúng cách, không bị UDR redirect nhầm.
Phát hiện VPN flapping trong 1 phút thay vì nhận report từ user sau 30 phút. Root cause: BGP route bị thay đổi do ISP Việt Nam update routing table. MTTD: 1 phút → MTTR: 15 phút nhờ Next Hop tool chỉ đúng vấn đề.