MODULE 31 Monitor & Maintain · 10–15% ~3 giờ Module cuối — AZ-104

Cấu hình Network Watcher

Azure Network Watcher cung cấp bộ công cụ chẩn đoán và giám sát mạng toàn diện: IP flow verify để kiểm tra NSG rules, Connection Monitor theo dõi kết nối end-to-end, Network Topology visualize cấu trúc mạng, và Packet Capture phân tích lưu lượng.

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.

Monitoring
  • Topology: visualize cấu trúc VNet
  • Connection Monitor: theo dõi kết nối liên tục
  • Network Performance Monitor
Diagnostics
  • 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
Logging
  • 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
Network Watcher Agent cần cho một số tính năng: Packet Capture và Connection Monitor yêu cầu cài Network Watcher Agent extension trên VM. IP Flow Verify và NSG Diagnostics KHÔNG cần agent — chúng hoạt động ở tầng platform, không cần vào trong VM.

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 — Hỏi "Packet này có được phép không?"

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.

Input cần cung cấp:
  • • 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)
Output trả về:
  • • Allow / Deny
  • • Tên NSG rule quyết định kết quả
NSG Diagnostics — Hiển thị effective rules

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).

Khác gì IP Flow Verify?
  • • 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
Scope hỗ trợ:

VM, VM Scale Set instance, Application Gateway, hoặc bất kỳ resource có NIC

3. Connection Monitor & Network Topology

Connection Monitor — Giám sát kết nối liên tục

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.

Source hỗ trợ
  • • Azure VM (cần NW Agent)
  • • Azure VMSS
  • • On-premises machine (Arc-enabled)
  • • Azure Bastion
Destination hỗ trợ
  • • Azure VM / VMSS
  • • FQDN / URL (HTTP/HTTPS)
  • • IP Address (bất kỳ)
  • • On-premises endpoint
Metrics đo được
  • • Checks failed (%)
  • • Round-trip time (ms)
  • • Test group success/fail
  • • Hop-by-hop path info
Network Topology — Bản đồ cấu trúc mạng

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

Next Hop

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ờ.

Packet Capture

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.

NSG Flow Logs

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)

Lab 31-A: IP Flow Verify Lab 31-B: NSG Diagnostics Lab 31-C: Connection Monitor Lab 31-D: NSG Flow Logs
1

Tạo môi trường lab — VNet, Subnet, NSG, VM và Storage Account

Azure CLI— Cloud Shell hoặc terminal đã login az
# 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."
Verify Portal: Portal → Network Watcher → xác nhận Network Watcher đã tồn tại trong region southeastasia (tự tạo khi có VNet). Portal → VM vm-nw-lab31 → Networking → xác nhận NSG nsg-lab31-web được áp với 2 rules.
2

IP Flow Verify — Kiểm tra NSG allow/deny cho traffic cụ thể

Azure CLI— Chạy được trên PowerShell, CMD, Bash hoặc Azure Cloud Shell
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
Kết quả mong đợi: Test 1 → 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ả.
3

NSG Diagnostics, Next Hop và bật NSG Flow Logs

Azure CLI— Chạy được trên PowerShell, CMD, Bash hoặc Azure Cloud Shell
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/..."
Verify Portal: Portal → Network Watcher → NSG flow logs → xác nhận flowlog-nsg-lab31 enabled. Portal → Storage Account → Containers → xác nhận container "insights-logs-networksecuritygroupflowevent" có files sau 10 phút.
4

Tạo Connection Monitor và xem Network Topology

Bash— Cloud Shell hoặc Linux/macOS terminal
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."
Verify Portal: Network Watcher → Connection monitor → xác nhận "cm-vm-to-internet-lab31" running. Click vào monitor → xem dashboard với latency (ms) và packet loss (%). Network Watcher → Topology → chọn vnet-lab31 → xem diagram hiển thị VNet, Subnet, VM, NSG.
5

Cleanup — Dọn dẹp toàn bộ tài nguyên Lab 31

Azure CLI— Chạy được trên PowerShell, CMD, Bash hoặc Azure Cloud Shell
# 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."
Lưu ý: Network Watcher (trong NetworkWatcherRG) là shared resource theo region — KHÔNG xóa nếu bạn còn VNet khác trong southeastasia. Chỉ xóa nếu chắc chắn không còn cần Network Watcher cho region đó.

Kết Quả Đầu Ra

Dùng IP Flow Verify thành thạo

Kiểm tra traffic inbound/outbound bị NSG allow hay deny, xác định tên rule quyết định kết quả

Chạy NSG Diagnostics

Xem toàn bộ effective security rules trên VM theo đúng thứ tự priority từ Subnet NSG và NIC NSG

Thiết lập Connection Monitor

Tạo monitor theo dõi liên tục VM đến endpoint nội bộ hoặc internet, đo latency và packet loss

Đọc Network Topology

Visualize cấu trúc VNet, subnet, VM, NSG, Load Balancer — phát hiện resource mồ côi và verify thiết kế

Bật NSG Flow Logs v2

Ghi toàn bộ traffic qua NSG vào Storage Account, cấu hình retention, kích hoạt Traffic Analytics

Next Hop và Packet Capture

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.

Giải pháp

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.

Triển khai

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.

Lợi ích

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.

Giải pháp

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.

Triển khai

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.

Lợi ích

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.

Giải pháp

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.

Triển khai

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.

Lợi ích

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 đề.

Zalo