Module 03 Foundation 5 labs

Networking Fundamentals for Cloud

Nền tảng mạng cho Cloud/DevOps Engineer: IP/CIDR/subnetting, routing, DNS, HTTP/TLS, firewall, NAT, load balancing — từ lý thuyết đến troubleshooting thực tế trên Azure VNet và Linux CLI.

Công cụ thực hành CLI, VS Code, Git, Azure CLI, Azure Portal
Nền tảng Linux (WSL2/Ubuntu), Windows (PowerShell), Azure
Thời điểm phát hành 23/05/2026
Ngày biên soạn 23/05/2026
Người biên soạn Trần Văn Hòa — Microsoft Certified Trainer (MCT)

Mục tiêu học tập

1. Lý thuyết cốt lõi

1.1. IP Addressing & CIDR Subnetting

IPv4 dùng 32-bit địa chỉ, biểu diễn dạng x.x.x.x/prefix. CIDR (Classless Inter-Domain Routing) thay thế classful (A/B/C) cho phép chia linh hoạt. Công thức cơ bản: số host = 2(32-prefix) - 2. Ví dụ: 10.0.1.0/24 có 254 host usable; 10.0.0.0/16 có 65.534 host. Trong Azure VNet, Azure dự trữ 5 địa chỉ đầu và cuối mỗi subnet (không phải 2 như on-prem).

Bảng CIDR nhanh cho Cloud Engineer

PrefixSubnet MaskHost (on-prem)Host (Azure)Use case
/29255.255.255.24863Gateway subnet nhỏ
/28255.255.255.2401411Azure Firewall subnet
/27255.255.255.2243027VPN Gateway subnet
/24255.255.255.0254251Standard workload subnet
/16255.255.0.06553465531VNet address space

1.2. DNS — Domain Name System

DNS là "danh bạ điện thoại" của Internet, chuyển đổi hostname → IP. Quy trình resolution: Recursive Resolver → Root NS → TLD NS → Authoritative NS. Trong cloud: Azure có Azure DNS Private Zones cho internal name resolution giữa các VNet; mỗi VNet mặc định dùng Azure-provided DNS (168.63.129.16). Các record quan trọng: A (IPv4), AAAA (IPv6), CNAME (alias), MX (mail), TXT (SPF/DKIM), NS, SOA. TTL thấp (60s) khi chuẩn bị migration; TTL cao (3600s) khi ổn định để giảm lookup latency.

1.3. HTTP/TLS & Certificate Chain

TLS (Transport Layer Security) mã hóa traffic HTTP (HTTPS = HTTP over TLS). Handshake TLS 1.3: ClientHello → ServerHello + Certificate → Finished (1-RTT). Certificate chain: Root CA → Intermediate CA → Leaf cert. Các vấn đề thường gặp: cert hết hạn, CN/SAN mismatch, chain không đầy đủ, cipher suite yếu. Trong Azure: Application Gateway làm TLS termination ở layer 7; Azure Front Door cung cấp managed TLS với auto-renewal. DevOps Engineer phải biết debug cert bằng CLI trước khi leo thang.

1.4. Firewall, NSG & Port Connectivity

Trong Azure, NSG (Network Security Group) là stateful packet filter gắn vào subnet hoặc NIC; rule ưu tiên theo số (100 < 200 = cao hơn). Azure Firewall là managed NGFW cấp enterprise: lọc theo FQDN, threat intelligence, IDPS. Nguyên tắc thiết kế (từ Microsoft Azure Network Security): mỗi subnet có NSG riêng, rule theo principle of least privilege; chỉ mở port cần thiết từ nguồn cụ thể. nc (netcat) và Test-NetConnection là công cụ kiểm tra port trực tiếp từ CLI.

1.5. 3-Tier Network Architecture

Kiến trúc 3 lớp chuẩn cho web application: Web tier (public subnet, Load Balancer + WAF), App tier (private subnet, xử lý business logic), DB tier (private subnet, chỉ nhận kết nối từ App tier). Trong Azure: mỗi tier là một subnet riêng trong VNet; NSG kiểm soát east-west traffic giữa các subnet; chỉ Web tier có public IP hoặc đứng sau Application Gateway. Pattern này khớp với hub-and-spoke khi mở rộng: security services (Firewall, Bastion) tập trung ở hub; workload subnet ở spoke.

2. Thực hành (Labs)

LAB-011

Tính subnet cho VPC/VNet

CLI · Azure CLI · Azure Portal

🎯 Mục tiêu: Tính toán và phân bổ CIDR subnet cho VNet 3-tier, tạo VNet + subnets bằng Azure CLI, kiểm chứng địa chỉ usable.

🧰 Công cụ / nền tảng: Azure CLI (az), Bash hoặc PowerShell, tài khoản Azure (Free Tier đủ dùng).

📦 Chuẩn bị: Cài Azure CLI: docs.microsoft.com/cli/azure. Đăng nhập: az login.

▶️ Phần 1: Tính subnet trên CLI (không cần Azure):

# === Tính subnet thủ công bằng ipcalc (Linux) ===
# Cài ipcalc nếu chưa có
sudo apt install -y ipcalc

# Bài toán: VNet 10.10.0.0/16, chia thành 4 subnet:
#   - GatewaySubnet:    10.10.0.0/27   (VPN Gateway, cần ≥ /27)
#   - snet-web:         10.10.1.0/24   (Web tier — public-facing)
#   - snet-app:         10.10.2.0/24   (App tier — private)
#   - snet-db:          10.10.3.0/24   (DB tier — private, most restricted)

# Kiểm tra từng subnet
ipcalc 10.10.0.0/27
ipcalc 10.10.1.0/24
ipcalc 10.10.2.0/24
ipcalc 10.10.3.0/24

# Kiểm tra không overlap: các range phải tách biệt
# GatewaySubnet: 10.10.0.0  – 10.10.0.31
# snet-web:      10.10.1.0  – 10.10.1.255  -> OK, không overlap

▶️ Phần 2: Tạo VNet và subnets bằng Azure CLI (Bash):

# 1. Đăng nhập và chọn subscription
az login
az account show --query "{name:name, id:id}" -o table

# 2. Tạo Resource Group
az group create \
  --name rg-networking-lab \
  --location southeastasia

# 3. Tạo VNet với address space 10.10.0.0/16
az network vnet create \
  --resource-group rg-networking-lab \
  --name vnet-lab-prod \
  --address-prefixes 10.10.0.0/16 \
  --location southeastasia

# 4. Tạo 4 subnets
az network vnet subnet create \
  --resource-group rg-networking-lab \
  --vnet-name vnet-lab-prod \
  --name GatewaySubnet \
  --address-prefixes 10.10.0.0/27

az network vnet subnet create \
  --resource-group rg-networking-lab \
  --vnet-name vnet-lab-prod \
  --name snet-web \
  --address-prefixes 10.10.1.0/24

az network vnet subnet create \
  --resource-group rg-networking-lab \
  --vnet-name vnet-lab-prod \
  --name snet-app \
  --address-prefixes 10.10.2.0/24

az network vnet subnet create \
  --resource-group rg-networking-lab \
  --vnet-name vnet-lab-prod \
  --name snet-db \
  --address-prefixes 10.10.3.0/24

# 5. Xem kết quả
az network vnet subnet list \
  --resource-group rg-networking-lab \
  --vnet-name vnet-lab-prod \
  --output table

🖥️ Đối chiếu PowerShell:

# Tương đương trên PowerShell (Az module)
$rg = "rg-networking-lab"
$vnet = New-AzVirtualNetwork -Name "vnet-lab-prod" -ResourceGroupName $rg `
  -Location "southeastasia" -AddressPrefix "10.10.0.0/16"
Add-AzVirtualNetworkSubnetConfig -Name "snet-web" -VirtualNetwork $vnet `
  -AddressPrefix "10.10.1.0/24" | Set-AzVirtualNetwork
# Kiểm tra
Get-AzVirtualNetworkSubnetConfig -VirtualNetwork (Get-AzVirtualNetwork -Name "vnet-lab-prod" -ResourceGroupName $rg)

✅ Kết quả mong đợi:

  • ipcalc 10.10.1.0/24 in: Hosts/Net: 254, Network: 10.10.1.0, Broadcast: 10.10.1.255.
  • az network vnet subnet list --output table hiển thị 4 subnet, address range không overlap.
  • Azure Portal: VNet vnet-lab-prod hiển thị 4 subnets đúng CIDR.

🧹 Cleanup:

# Xóa toàn bộ resource group (xóa hết tài nguyên bên trong)
az group delete --name rg-networking-lab --yes --no-wait
LAB-012

Kiểm tra DNS bằng CLI

CLI · dig · nslookup · PowerShell

🎯 Mục tiêu: Tra cứu các loại DNS record, debug DNS resolution lỗi, so sánh output giữa dig (Linux), nslookupResolve-DnsName (Windows).

🧰 Công cụ / nền tảng: Ubuntu 22.04 / WSL2 (dig, nslookup), Windows PowerShell (Resolve-DnsName).

📦 Chuẩn bị: Cài dnsutils: sudo apt install -y dnsutils. Kết nối internet.

▶️ Các bước (CLI — Bash/Linux):

# === 1. Tra cứu A record cơ bản ===
dig hoatranlab.io.vn
# Đọc output: ANSWER SECTION chứa IP; QUERY TIME là latency DNS

# 2. Tra cứu record cụ thể
dig hoatranlab.io.vn A          # IPv4
dig hoatranlab.io.vn AAAA       # IPv6
dig hoatranlab.io.vn MX         # Mail server
dig hoatranlab.io.vn TXT        # SPF/DKIM/verification
dig hoatranlab.io.vn NS         # Nameservers

# 3. Chỉ định DNS server cụ thể (test bypass local resolver)
dig @8.8.8.8 hoatranlab.io.vn         # Google DNS
dig @1.1.1.1 hoatranlab.io.vn         # Cloudflare DNS
dig @168.63.129.16 hoatranlab.io.vn   # Azure DNS (chạy trong Azure VM)

# 4. Reverse DNS lookup (IP → hostname)
dig -x 8.8.8.8
dig -x 20.189.173.1    # Azure IP ví dụ

# 5. Trace toàn bộ resolution path từ Root
dig +trace hoatranlab.io.vn

# 6. Query nhanh (chỉ lấy answer, không meta)
dig +short hoatranlab.io.vn
dig +short hoatranlab.io.vn MX

# === 7. Debug DNS caching với TTL ===
# Chạy 2 lần liên tiếp, so sánh QUERY TIME
dig hoatranlab.io.vn | grep "Query time"
dig hoatranlab.io.vn | grep "Query time"   # lần 2 cache: < 1ms

# === 8. nslookup (cross-platform) ===
nslookup hoatranlab.io.vn
nslookup -type=MX hoatranlab.io.vn
nslookup hoatranlab.io.vn 8.8.8.8    # chỉ định DNS server

🖥️ Đối chiếu PowerShell (Windows):

# Resolve-DnsName — tương đương dig trên Windows PowerShell
Resolve-DnsName hoatranlab.io.vn
Resolve-DnsName hoatranlab.io.vn -Type MX
Resolve-DnsName hoatranlab.io.vn -Type TXT
Resolve-DnsName hoatranlab.io.vn -Server 8.8.8.8  # chỉ định DNS server

# So sánh DNS servers
$servers = @("8.8.8.8","1.1.1.1","168.63.129.16")
foreach ($s in $servers) {
  $r = Resolve-DnsName hoatranlab.io.vn -Server $s -ErrorAction SilentlyContinue
  Write-Host "$s => $($r.IPAddress)"
}

✅ Kết quả mong đợi:

  • dig +short hoatranlab.io.vn trả về IP address của site.
  • dig +trace hiển thị đường đi Root → TLD (.vn) → Authoritative NS → final answer.
  • Lần 2 query: Query time: 0 msec (local cache hit).
  • Resolve-DnsName trả về cùng IP như dig.

🧹 Cleanup: Không cần — chỉ read-only queries.

LAB-013

Debug HTTPS/TLS certificate

CLI · openssl · curl

🎯 Mục tiêu: Dùng openssl s_clientcurl để kiểm tra TLS certificate: expiry date, subject/SAN, cipher suite, certificate chain.

🧰 Công cụ / nền tảng: Ubuntu 22.04 / WSL2 (openssl, curl), PowerShell (Windows).

📦 Chuẩn bị: sudo apt install -y openssl curl (thường đã có sẵn).

▶️ Các bước (CLI — Bash):

# === 1. Kiểm tra certificate của website ===
echo | openssl s_client -connect hoatranlab.io.vn:443 -servername hoatranlab.io.vn 2>/dev/null \
  | openssl x509 -noout -text | grep -A2 "Subject\|Issuer\|Not Before\|Not After\|DNS:"

# Output quan trọng:
# Subject: CN = domain.com
# Issuer: CN = Let's Encrypt ...
# Not Before: ... (ngày bắt đầu)
# Not After:  ... (ngày hết hạn)
# DNS: (SAN entries)

# === 2. Chỉ lấy expiry date (dạng human-readable) ===
echo | openssl s_client -connect hoatranlab.io.vn:443 -servername hoatranlab.io.vn 2>/dev/null \
  | openssl x509 -noout -dates
# notBefore= ...
# notAfter=  ...

# === 3. Kiểm tra còn bao nhiêu ngày hết hạn ===
EXPIRY=$(echo | openssl s_client -connect hoatranlab.io.vn:443 -servername hoatranlab.io.vn 2>/dev/null \
  | openssl x509 -noout -enddate | cut -d= -f2)
EXPIRY_EPOCH=$(date -d "$EXPIRY" +%s)
NOW_EPOCH=$(date +%s)
DAYS_LEFT=$(( (EXPIRY_EPOCH - NOW_EPOCH) / 86400 ))
echo "Certificate expires in: $DAYS_LEFT days ($EXPIRY)"

# === 4. Xem certificate chain đầy đủ ===
echo | openssl s_client -connect hoatranlab.io.vn:443 -servername hoatranlab.io.vn -showcerts 2>/dev/null \
  | grep -E "subject|issuer|s:|i:"

# === 5. Kiểm tra cipher suite đang dùng ===
echo | openssl s_client -connect hoatranlab.io.vn:443 -servername hoatranlab.io.vn 2>/dev/null \
  | grep -E "Protocol|Cipher"
# Expect: Protocol TLSv1.3 hoặc TLSv1.2 (TLSv1.0/1.1 = deprecated!)

# === 6. curl verbose — thấy TLS handshake ===
curl -vI https://hoatranlab.io.vn 2>&1 | grep -E "SSL|TLS|expire|subject|issuer|<|>"

# === 7. Test site với cert lỗi (tự ký) ===
# Tạo self-signed cert để test
openssl req -x509 -newkey rsa:2048 -keyout /tmp/self.key -out /tmp/self.crt \
  -days 30 -nodes -subj "/CN=test.local" 2>/dev/null
openssl x509 -in /tmp/self.crt -noout -text | grep -E "Subject|Issuer|Not After"
# Self-signed: Issuer == Subject (không có CA chain)

🖥️ Đối chiếu PowerShell (Windows):

# Kiểm tra TLS cert bằng PowerShell (.NET)
$url    = "https://hoatranlab.io.vn"
$req    = [Net.HttpWebRequest]::Create($url)
$req.AllowAutoRedirect = $false
try { $req.GetResponse() | Out-Null } catch {}
$cert   = $req.ServicePoint.Certificate
$cert2  = [Security.Cryptography.X509Certificates.X509Certificate2]$cert

Write-Host "Subject  : $($cert2.Subject)"
Write-Host "Issuer   : $($cert2.Issuer)"
Write-Host "Not After: $($cert2.NotAfter)"
$daysLeft = ($cert2.NotAfter - (Get-Date)).Days
Write-Host "Days Left: $daysLeft"
if ($daysLeft -lt 30) { Write-Warning "Certificate expires soon!" }

✅ Kết quả mong đợi:

  • Output openssl s_client: Protocol: TLSv1.3, Issuer là Let's Encrypt hoặc trusted CA, ngày hết hạn rõ ràng.
  • Script tính ngày hết hạn in: Certificate expires in: X days.
  • Self-signed cert: Issuer == Subject — nhận diện đúng không có CA chain.
  • PowerShell: Days Left khớp với output Linux.

🧹 Cleanup: rm /tmp/self.key /tmp/self.crt

LAB-014

Kiểm tra port bằng netcat/Test-NetConnection

CLI · nc · Test-NetConnection · nmap

🎯 Mục tiêu: Kiểm tra port open/closed/filtered, debug NSG/firewall rule, phân biệt "port closed" (TCP RST) và "port filtered" (no response/timeout).

🧰 Công cụ / nền tảng: Ubuntu 22.04 (nc, nmap), Windows PowerShell (Test-NetConnection), telnet.

📦 Chuẩn bị: sudo apt install -y netcat-openbsd nmap. nginx đang chạy trên port 80.

▶️ Các bước (CLI — Bash/Linux):

# === 1. nc (netcat) — kiểm tra port TCP ===
nc -zv 127.0.0.1 80      # -z: zero I/O (scan only), -v: verbose
# Output: "Connection to 127.0.0.1 80 port [tcp/http] succeeded!"

nc -zv 127.0.0.1 8443    # port không mở
# Output: "Connection to 127.0.0.1 8443 port [tcp/*] failed: Connection refused"

# 2. Timeout test (giả lập firewall drop — không có RST)
nc -zv -w 3 google.com 25     # port 25 (SMTP) thường bị ISP block
# Nếu timeout: firewall DROP (không response)
# Nếu "refused": firewall REJECT hoặc service không chạy

# 3. Scan nhiều port cùng lúc (nc)
for port in 22 80 443 3306 5432 6379; do
  result=$(nc -zv -w 1 127.0.0.1 $port 2>&1)
  if echo "$result" | grep -q "succeeded"; then
    echo "Port $port: OPEN"
  else
    echo "Port $port: CLOSED/FILTERED"
  fi
done

# 4. nmap — scan nhanh (cần sudo để gửi raw packet)
nmap -sT -p 22,80,443,3306 127.0.0.1    # TCP connect scan
sudo nmap -sS -p 1-1000 127.0.0.1        # SYN scan (nhanh hơn)
# Output: PORT    STATE  SERVICE
#          22/tcp open   ssh
#          80/tcp open   http

# 5. nc làm mini server — test kết nối 2 chiều
# Terminal 1 (server lắng nghe):
nc -l 9999
# Terminal 2 (client kết nối):
nc 127.0.0.1 9999
# Gõ text → xuất hiện ở terminal kia

# 6. Kiểm tra latency TCP (round-trip)
time nc -zv -w 5 8.8.8.8 53    # DNS port

🖥️ Đối chiếu PowerShell (Windows):

# Test-NetConnection — tương đương nc trên Windows
Test-NetConnection -ComputerName "hoatranlab.io.vn" -Port 443
# Output: TcpTestSucceeded: True/False

# Scan nhiều port
$ports = @(22, 80, 443, 3306, 5432, 8080)
foreach ($port in $ports) {
  $result = Test-NetConnection -ComputerName "127.0.0.1" -Port $port -WarningAction SilentlyContinue
  $status = if ($result.TcpTestSucceeded) { "OPEN" } else { "CLOSED/FILTERED" }
  Write-Host "Port $port : $status"
}

# Kiểm tra route và latency
Test-NetConnection -ComputerName "8.8.8.8" -TraceRoute -Hops 5

✅ Kết quả mong đợi:

  • Port 80 (nginx đang chạy): succeeded / TcpTestSucceeded: True.
  • Port 3306 (MySQL chưa cài): Connection refused — biết được port closed (không phải firewall).
  • Port 25 trên ISP thường: timeout — biết được firewall DROP (không gửi RST).
  • nmap in bảng PORT/STATE/SERVICE rõ ràng.

🧹 Cleanup: Không cần nếu chỉ scan. Tắt nc listener nếu đã mở: Ctrl+C.

LAB-015

Thiết kế network 3-tier

CLI · Azure CLI · Mermaid · VS Code

🎯 Mục tiêu: Thiết kế và triển khai network 3-tier (Web/App/DB) trên Azure VNet với NSG đúng chuẩn, kiểm chứng traffic flow bằng diagram và NSG rule.

🧰 Công cụ / nền tảng: Azure CLI, VS Code + Mermaid extension, Bash/PowerShell.

📦 Chuẩn bị: Tài khoản Azure, Azure CLI đã đăng nhập. Resource group từ LAB-011 có thể tái dùng.

▶️ Phần 1: Thiết kế bằng Mermaid (diagram-as-code):

# Tạo file thiết kế trong VS Code
code network-3tier-design.md
```mermaid
flowchart TB
  internet([Internet]) --> agw[Application Gateway\nWAF + TLS Termination\nPublic IP]

  subgraph vnet["VNet: 10.10.0.0/16 (Azure)"]
    subgraph snet-web["snet-web 10.10.1.0/24\nNSG: allow 80,443 from Internet"]
      agw
      vm-web1[VM Web 1]
      vm-web2[VM Web 2]
    end

    subgraph snet-app["snet-app 10.10.2.0/24\nNSG: allow 8080 from snet-web only"]
      vm-app1[VM App 1]
      vm-app2[VM App 2]
    end

    subgraph snet-db["snet-db 10.10.3.0/24\nNSG: allow 5432 from snet-app only"]
      db[(PostgreSQL\nAzure DB)]
    end

    subgraph snet-mgmt["snet-mgmt 10.10.4.0/26\nNSG: allow 22 from Bastion only"]
      bastion[Azure Bastion]
    end
  end

  agw --> vm-web1
  agw --> vm-web2
  vm-web1 --> vm-app1
  vm-web2 --> vm-app2
  vm-app1 --> db
  vm-app2 --> db
```

▶️ Phần 2: Tạo NSG và rules bằng Azure CLI:

# Dùng resource group từ LAB-011 (tạo lại nếu cần)
RG="rg-networking-lab"
VNET="vnet-lab-prod"
az group create --name $RG --location southeastasia 2>/dev/null || true

# 1. Tạo NSG cho từng tier
az network nsg create --resource-group $RG --name nsg-web
az network nsg create --resource-group $RG --name nsg-app
az network nsg create --resource-group $RG --name nsg-db

# 2. NSG Web tier — cho phép HTTP/HTTPS từ Internet
az network nsg rule create \
  --resource-group $RG --nsg-name nsg-web \
  --name Allow-HTTP-HTTPS-Inbound \
  --priority 100 --direction Inbound \
  --source-address-prefixes Internet \
  --destination-port-ranges 80 443 \
  --protocol Tcp --access Allow

# 3. NSG App tier — chỉ cho phép từ snet-web (10.10.1.0/24)
az network nsg rule create \
  --resource-group $RG --nsg-name nsg-app \
  --name Allow-From-WebTier \
  --priority 100 --direction Inbound \
  --source-address-prefixes 10.10.1.0/24 \
  --destination-port-ranges 8080 \
  --protocol Tcp --access Allow

az network nsg rule create \
  --resource-group $RG --nsg-name nsg-app \
  --name Deny-All-Other-Inbound \
  --priority 4000 --direction Inbound \
  --source-address-prefixes "*" \
  --destination-port-ranges "*" \
  --protocol "*" --access Deny

# 4. NSG DB tier — chỉ cho phép từ snet-app (10.10.2.0/24)
az network nsg rule create \
  --resource-group $RG --nsg-name nsg-db \
  --name Allow-From-AppTier \
  --priority 100 --direction Inbound \
  --source-address-prefixes 10.10.2.0/24 \
  --destination-port-ranges 5432 \
  --protocol Tcp --access Allow

az network nsg rule create \
  --resource-group $RG --nsg-name nsg-db \
  --name Deny-All-Other-Inbound \
  --priority 4000 --direction Inbound \
  --source-address-prefixes "*" \
  --destination-port-ranges "*" \
  --protocol "*" --access Deny

# 5. Gắn NSG vào subnet (cần tạo subnet trước nếu chưa có)
az network vnet create --resource-group $RG --name $VNET \
  --address-prefixes 10.10.0.0/16 --location southeastasia 2>/dev/null || true

for tier in web app db; do
  az network vnet subnet create \
    --resource-group $RG --vnet-name $VNET \
    --name snet-${tier} \
    --address-prefixes 10.10.$([ $tier = web ] && echo 1 || [ $tier = app ] && echo 2 || echo 3).0/24 \
    --network-security-group nsg-${tier} 2>/dev/null || \
  az network vnet subnet update \
    --resource-group $RG --vnet-name $VNET \
    --name snet-${tier} \
    --network-security-group nsg-${tier}
done

# 6. Xem tổng quan NSG rules
echo "=== NSG WEB ===" && az network nsg show --resource-group $RG --name nsg-web \
  --query "securityRules[].{Name:name,Priority:priority,Direction:direction,Access:access,Port:destinationPortRange}" -o table
echo "=== NSG APP ===" && az network nsg show --resource-group $RG --name nsg-app \
  --query "securityRules[].{Name:name,Priority:priority,Direction:direction,Access:access,Port:destinationPortRange}" -o table
echo "=== NSG DB ===" && az network nsg show --resource-group $RG --name nsg-db \
  --query "securityRules[].{Name:name,Priority:priority,Direction:direction,Access:access,Port:destinationPortRange}" -o table

✅ Kết quả mong đợi:

  • Mermaid diagram render đúng sơ đồ 3-tier với luồng traffic rõ ràng.
  • NSG Web: rule 100 Allow port 80/443 from Internet.
  • NSG App: rule 100 Allow port 8080 chỉ từ 10.10.1.0/24; rule 4000 Deny all.
  • NSG DB: rule 100 Allow port 5432 chỉ từ 10.10.2.0/24; rule 4000 Deny all.
  • Azure Portal: 3 NSG gắn đúng subnet, traffic từ Internet không thể reach DB tier trực tiếp.

🧹 Cleanup:

az group delete --name rg-networking-lab --yes --no-wait
echo "Resource group deletion queued."

3. Tình huống doanh nghiệp thực tế

Bối cảnh

Một startup e-commerce migrate lên Azure gặp 3 vấn đề: (1) database bị scan từ Internet, (2) API backend không kết nối được đến DB sau deploy NSG mới, (3) HTTPS certificate hết hạn gây downtime.

Giải pháp áp dụng kỹ năng Module 03

  • Vấn đề 1 — DB exposed: Thiết kế 3-tier (LAB-015): DB subnet chỉ nhận từ App tier. NSG rule Deny-All-Inbound priority 4000 chặn mọi scan từ Internet. Azure Defender for SQL bổ sung detection layer.
  • Vấn đề 2 — API không reach DB: Debug bằng nc -zv db-server 5432 từ App VM → "Connection refused" → kiểm tra NSG: phát hiện source-prefix sai (10.10.1.0/24 thay vì 10.10.2.0/24). Fix rule trong 5 phút thay vì mở ticket 2 ngày.
  • Vấn đề 3 — Cert hết hạn: Script kiểm tra cert (LAB-013) tích hợp vào CI/CD pipeline; cảnh báo 30 ngày trước khi hết hạn. Azure Front Door với managed cert auto-renewal loại bỏ vấn đề dài hạn.
  • DNS cho migration (LAB-012): Trước khi cutover, hạ TTL xuống 60s. Sau khi xác nhận IP mới hoạt động (dùng dig @8.8.8.8 từ nhiều location), đổi A record. TTL thấp đảm bảo rollback nhanh nếu cần.

📚 Nguồn tham khảo

Module 02: Linux Administration Module 04: Git & Collaboration
Zalo