Module 12 Hybrid Cloud 5 labs

Hybrid Cloud Design: VPN, ExpressRoute, Direct Connect, Interconnect

Thiết kế kết nối on-premises với public cloud bằng site-to-site VPN, dedicated leased line (ExpressRoute / Direct Connect / Cloud Interconnect), cùng chiến lược routing, DNS forwarding, identity federation và security boundary cho môi trường hybrid.

Công cụ thực hành az CLI, gcloud CLI, AWS CLI, strongSwan, VyOS, Wireshark
Nền tảng Azure / GCP / AWS (Free Tier) · Linux / WSL2 · VirtualBox
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. Tại sao Hybrid Cloud?

Hybrid cloud không phải là trạng thái quá độ — đây là kiến trúc dài hạn cho nhiều tổ chức. Lý do chính: data sovereignty (dữ liệu nhạy cảm phải ở on-prem theo pháp lý), legacy systems (mainframe, ERP không thể lift-and-shift), latency (sản xuất công nghiệp cần xử lý edge thấp hơn 5ms), và cost optimization (workload dự đoán chạy on-prem; burst workload lên cloud). Theo Multi-Cloud Strategy for Cloud Architects (Mulder), tổ chức thành công không coi hybrid là "tạm thời" mà thiết kế nó như một first-class architecture pattern.

1.2. Site-to-site VPN: IPsec/IKEv2

VPN dựa trên internet — chi phí thấp, dễ triển khai, nhưng không có SLA bandwidth. IPsec cung cấp confidentiality (AES-256), integrity (SHA-256/384), authentication (PSK hoặc certificate). IKEv2 là phiên bản giao thức trao đổi key hiện đại hơn, hỗ trợ MOBIKE (IP thay đổi không mất tunnel), renegotiate nhanh hơn IKEv1.

Hai pha IPsec

  • Phase 1 (IKE SA): Xác thực và thương lượng encryption cho kênh control — tạo ISAKMP SA. Tham số: encryption (AES-256), hash (SHA-256), DH group (14+), auth (PSK/cert).
  • Phase 2 (IPsec SA): Thương lượng encryption cho data tunnel (ESP). Tham số: encryption (AES-256-GCM), PFS (Perfect Forward Secrecy), lifetime.
  • Dead Peer Detection (DPD): Phát hiện peer mất kết nối để failover sang tunnel dự phòng.

1.3. Dedicated Connectivity: ExpressRoute / Direct Connect / Cloud Interconnect

Dịch vụCloudBăng thôngSLAGhi chú
ExpressRouteAzure50 Mbps – 100 Gbps99.95%Qua partner hoặc ExpressRoute Direct
Direct ConnectAWS1 / 10 / 100 Gbps99.9%+Hosted (qua partner) hoặc Dedicated
Dedicated InterconnectGCP10 / 100 Gbps x N99.99% (4 circuits)VLAN attachment per VPC
Partner InterconnectGCP50 Mbps – 50 Gbps99.9%Qua ISP/partner colocation

Dedicated connection không đi qua internet công cộng — traffic chạy trên mạch vật lý hoặc MPLS riêng đến PoP (Point of Presence) của cloud provider. Độ trễ ổn định, bandwidth có thể đặt trước, không phát sinh egress cost thông thường (hoặc rất thấp).

1.4. BGP Routing trong Hybrid

BGP (Border Gateway Protocol) là giao thức routing tiêu chuẩn cho hybrid connectivity. On-prem router (ASN riêng, ví dụ 65001) thiết lập eBGP session với cloud VPN Gateway/ExpressRoute. Cloud quảng bá prefix VNet/VPC; on-prem quảng bá prefix LAN. Cần chú ý: route filtering (chỉ accept prefix cụ thể, không accept default route từ cloud), AS path prepending (ảnh hưởng path selection khi có nhiều link), và MED (Multi-Exit Discriminator) để ưu tiên primary/secondary circuit.

1.5. Hybrid DNS

Mục tiêu: workload cloud resolve được tên miền nội bộ on-prem và ngược lại. Giải pháp: conditional forwarding — DNS resolver cloud chuyển query cho domain corp.local sang on-prem DNS server (qua private connection), và on-prem DNS forward query cho privatelink.blob.core.windows.net sang Azure Private DNS. Trên Azure: Azure Private DNS Resolver (Inbound/Outbound endpoint); trên AWS: Route 53 Resolver; trên GCP: Cloud DNS private forwarding zones.

1.6. Security Boundary & Identity trong Hybrid

Hybrid mở rộng attack surface — mạng on-prem và cloud về cơ bản trở thành một flat network nếu không có kiểm soát. Nguyên tắc: Zero Trust (không tin tưởng dựa trên vị trí mạng), microsegmentation (Network Policy trong K8s, NSG/Security Group cho subnet), firewall ở cả hai phía (NVA on-prem + cloud-native firewall), và identity federation — on-prem AD sync lên Entra ID (Azure AD Connect) hoặc AWS IAM Identity Center SCIM provisioning, để user có SSO across hybrid. Private Endpoints/PrivateLink đảm bảo PaaS service không expose internet.

2. Thực hành (Labs)

LAB-056

Thiết kế Hybrid Connectivity — So sánh & Decision Matrix

CLI · VS Code · Diagrams

🎯 Mục tiêu: Xây dựng decision matrix chọn giải pháp hybrid connectivity cho 3 tình huống doanh nghiệp; vẽ sơ đồ kiến trúc bằng Mermaid.

🧰 Công cụ / nền tảng: VS Code + Mermaid extension, Git.

📦 Chuẩn bị: VS Code cài extension "Markdown Preview Mermaid Support".

▶️ Các bước:

# 1. Tạo workspace
mkdir hybrid-lab && cd hybrid-lab
git init
code decision-matrix.md

Nội dung decision-matrix.md (Decision Matrix):

## Hybrid Connectivity Decision Matrix

| Tiêu chí            | Site-to-Site VPN | ExpressRoute/DX | Partner Interconnect |
|---------------------|-----------------|-----------------|----------------------|
| Chi phí setup       | Thấp (~$30/mo)  | Cao (setup fee) | Trung bình           |
| Bandwidth tối đa    | ~1.25 Gbps      | 100 Gbps        | 50 Gbps              |
| SLA                 | Không có        | 99.95%          | 99.9%                |
| Latency ổn định     | Không           | Có              | Có                   |
| Thời gian triển khai| Giờ             | Tuần–tháng      | Ngày–tuần            |
| Data sovereignty    | Không liên quan | Tốt             | Tốt                  |

## Tình huống → Giải pháp
1. Startup, 50 user, backup lên Azure, $50/tháng → VPN Gateway Basic
2. Ngân hàng, core banking 10TB/ngày, latency SLA 10ms → ExpressRoute 1Gbps
3. Công ty logistics, 500Mbps ổn định, có partner tại HN datacenter → Partner Interconnect

Sơ đồ kiến trúc hybrid (Mermaid):

```mermaid
flowchart LR
  subgraph OnPrem ["On-Premises DC"]
    direction TB
    FW[Firewall / Router\nASN 65001]
    AD[Active Directory\nDNS Server]
    DB[(Core Database)]
    FW --- AD
    FW --- DB
  end

  subgraph Connectivity ["Hybrid Connectivity"]
    VPN[Site-to-Site VPN\nIKEv2 / IPsec]
    ER[ExpressRoute /\nDedicated Circuit]
  end

  subgraph Azure ["Azure VNet 10.1.0.0/16"]
    direction TB
    GW[VPN Gateway /\nExpressRoute GW]
    AppSubnet[App Subnet\n10.1.1.0/24]
    DataSubnet[Data Subnet\n10.1.2.0/24]
    ADDS[Azure AD DS /\nEntra Connect]
    GW --> AppSubnet
    GW --> DataSubnet
    ADDS -.->|LDAP sync| AD
  end

  FW -->|Internet tunnel| VPN
  FW -->|Private circuit| ER
  VPN --> GW
  ER --> GW
```
git add . && git commit -m "lab-056: hybrid connectivity decision matrix and architecture diagram"

✅ Kết quả mong đợi: Mermaid render sơ đồ với 3 zone (OnPrem, Connectivity, Azure); decision matrix đầy đủ 6 tiêu chí; 3 tình huống có lý giải rõ ràng.

🧹 Cleanup: commit, giữ repo cho các lab sau.

LAB-057

Site-to-site VPN mô phỏng: Azure VPN Gateway + strongSwan on-prem

az CLI · strongSwan · Linux / WSL2

🎯 Mục tiêu: Tạo Azure VNet + VPN Gateway; cấu hình strongSwan trên Linux/WSL2 đóng vai on-prem router; thiết lập IPsec/IKEv2 tunnel và ping qua tunnel.

🧰 Công cụ / nền tảng: az CLI, Linux (WSL2 Ubuntu 22.04 hoặc VM), strongSwan 5.x, Azure subscription.

📦 Chuẩn bị: az login hoàn thành; WSL2 Ubuntu cài sẵn; lấy public IP của máy bạn: curl -s ifconfig.me.

▶️ Phần A — Tạo hạ tầng Azure (az CLI):

RG="htlab-hybrid-rg"
LOCATION="southeastasia"
VNET="htlab-cloud-vnet"
MY_PUBLIC_IP=""  # thay thế

# 1. Tạo Resource Group
az group create --name $RG --location $LOCATION

# 2. Tạo VNet và GatewaySubnet (bắt buộc tên GatewaySubnet)
az network vnet create \
  --resource-group $RG \
  --name $VNET \
  --address-prefix 10.1.0.0/16 \
  --subnet-name AppSubnet \
  --subnet-prefix 10.1.1.0/24

az network vnet subnet create \
  --resource-group $RG \
  --vnet-name $VNET \
  --name GatewaySubnet \
  --address-prefix 10.1.255.0/27

# 3. Tạo Public IP cho VPN Gateway
az network public-ip create \
  --resource-group $RG \
  --name htlab-vpn-pip \
  --allocation-method Static \
  --sku Standard \
  --zone 1

# 4. Tạo VPN Gateway (Route-based, IKEv2) — mất 30-45 phút!
az network vnet-gateway create \
  --resource-group $RG \
  --name htlab-vpn-gw \
  --location $LOCATION \
  --public-ip-address htlab-vpn-pip \
  --vnet $VNET \
  --gateway-type Vpn \
  --vpn-type RouteBased \
  --sku VpnGw1 \
  --generation Generation1 \
  --no-wait

echo "Waiting for VPN Gateway (30-45 min)..."
az network vnet-gateway wait \
  --resource-group $RG \
  --name htlab-vpn-gw \
  --created

# Lấy Azure VPN Gateway Public IP
AZ_VPN_IP=$(az network public-ip show \
  --resource-group $RG \
  --name htlab-vpn-pip \
  --query ipAddress -o tsv)
echo "Azure VPN GW IP: ${AZ_VPN_IP}"

# 5. Tạo Local Network Gateway (đại diện cho on-prem)
az network local-gateway create \
  --resource-group $RG \
  --name htlab-onprem-lgw \
  --gateway-ip-address $MY_PUBLIC_IP \
  --local-address-prefixes 192.168.100.0/24

# 6. Tạo VPN Connection
PSK="HtLabVPN@2026SecureKey!"

az network vpn-connection create \
  --resource-group $RG \
  --name htlab-vpn-conn \
  --vnet-gateway1 htlab-vpn-gw \
  --local-gateway2 htlab-onprem-lgw \
  --connection-type IPsec \
  --shared-key "$PSK" \
  --enable-bgp false

▶️ Phần B — Cấu hình strongSwan (WSL2 / Linux):

# Cài strongSwan (WSL2 Ubuntu)
sudo apt-get update && sudo apt-get install -y strongswan strongswan-pki

# /etc/ipsec.conf
sudo tee /etc/ipsec.conf <<EOF
config setup
    charondebug="ike 2, knl 2, cfg 2"

conn htlab-to-azure
    authby=secret
    left=%defaultroute
    leftid=${MY_PUBLIC_IP}
    leftsubnet=192.168.100.0/24
    right=${AZ_VPN_IP}
    rightsubnet=10.1.0.0/16
    ike=aes256-sha256-modp1024!
    esp=aes256-sha256!
    keyexchange=ikev2
    ikelifetime=28800s
    lifetime=3600s
    dpdaction=restart
    dpddelay=30s
    auto=start
EOF

# /etc/ipsec.secrets — PSK
sudo tee /etc/ipsec.secrets <<EOF
${MY_PUBLIC_IP} ${AZ_VPN_IP} : PSK "HtLabVPN@2026SecureKey!"
EOF
sudo chmod 600 /etc/ipsec.secrets

# Khởi động strongSwan
sudo systemctl restart strongswan-starter
sudo ipsec up htlab-to-azure

# Kiểm tra trạng thái tunnel
sudo ipsec status
sudo ipsec statusall | grep -A5 htlab-to-azure

▶️ Phần C — Kiểm tra kết nối:

# Kiểm tra VPN Connection status từ Azure phía
az network vpn-connection show \
  --resource-group $RG \
  --name htlab-vpn-conn \
  --query connectionStatus -o tsv
# Kết quả mong đợi: Connected

# Tạo VM test trong Azure VNet để ping
az vm create \
  --resource-group $RG \
  --name htlab-test-vm \
  --vnet-name $VNET \
  --subnet AppSubnet \
  --image Ubuntu2204 \
  --admin-username azureuser \
  --generate-ssh-keys \
  --public-ip-address "" \
  --no-wait

# Lấy private IP của VM
VM_IP=$(az vm show -d -g $RG -n htlab-test-vm --query privateIps -o tsv)
echo "VM private IP: ${VM_IP}"

# Ping từ WSL2 qua VPN tunnel (nếu tunnel Connected)
ping -c 4 ${VM_IP}

🖥️ Đối chiếu GUI (Azure Portal):

Virtual network gateways → htlab-vpn-gw → Connections: thấy htlab-vpn-conn status Connected; tab Metrics: tunnel bandwidth, packets.

✅ Kết quả mong đợi: az network vpn-connection show … --query connectionStatus trả về Connected; sudo ipsec status thấy SA ESTABLISHED; ping qua tunnel tới VM Azure thành công (RTT ~10-20ms).

🧹 Cleanup:

# Dừng strongSwan
sudo ipsec down htlab-to-azure

# Giữ resource group cho LAB-058; xóa sau khi hoàn thành module:
# az group delete --name $RG --yes --no-wait
LAB-058

Hybrid DNS: Azure Private DNS Resolver + Conditional Forwarding

az CLI · dig / nslookup · Linux

🎯 Mục tiêu: Cấu hình Azure Private DNS Resolver với Inbound Endpoint (on-prem → cloud) và Outbound Endpoint với Forwarding Ruleset (cloud → on-prem domain).

🧰 Công cụ / nền tảng: az CLI, Linux (WSL2), dig/nslookup.

📦 Chuẩn bị: Resource group htlab-hybrid-rg và VNet từ LAB-057 tồn tại; VPN tunnel Connected.

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

RG="htlab-hybrid-rg"
VNET="htlab-cloud-vnet"
LOCATION="southeastasia"

# 1. Tạo subnet cho DNS Resolver (cần /28 trở lên, delegate)
az network vnet subnet create \
  --resource-group $RG \
  --vnet-name $VNET \
  --name DnsInboundSubnet \
  --address-prefix 10.1.2.0/28 \
  --delegations Microsoft.Network/dnsResolvers

az network vnet subnet create \
  --resource-group $RG \
  --vnet-name $VNET \
  --name DnsOutboundSubnet \
  --address-prefix 10.1.3.0/28 \
  --delegations Microsoft.Network/dnsResolvers

# 2. Tạo DNS Private Resolver
az dns-resolver create \
  --resource-group $RG \
  --name htlab-dns-resolver \
  --location $LOCATION \
  --id $(az network vnet show -g $RG -n $VNET --query id -o tsv)

# 3. Tạo Inbound Endpoint — on-prem query vào đây để resolve Azure private zones
az dns-resolver inbound-endpoint create \
  --resource-group $RG \
  --dns-resolver-name htlab-dns-resolver \
  --name htlab-inbound-ep \
  --location $LOCATION \
  --ip-configurations '[{"privateIpAllocationMethod":"Dynamic","id":"'"$(az network vnet subnet show -g $RG -n $VNET --subnet-name DnsInboundSubnet --query id -o tsv)"'"}]'

INBOUND_IP=$(az dns-resolver inbound-endpoint show \
  --resource-group $RG \
  --dns-resolver-name htlab-dns-resolver \
  --name htlab-inbound-ep \
  --query ipConfigurations[0].privateIpAddress -o tsv)
echo "Inbound Endpoint IP: ${INBOUND_IP}"

# 4. Tạo Azure Private DNS Zone cho internal app
az network private-dns zone create \
  --resource-group $RG \
  --name "internal.htlab.local"

az network private-dns link vnet create \
  --resource-group $RG \
  --zone-name "internal.htlab.local" \
  --name htlab-dns-link \
  --virtual-network $VNET \
  --registration-enabled false

az network private-dns record-set a add-record \
  --resource-group $RG \
  --zone-name "internal.htlab.local" \
  --record-set-name "api" \
  --ipv4-address 10.1.1.100

# 5. Tạo Outbound Endpoint — cloud query ra on-prem DNS
az dns-resolver outbound-endpoint create \
  --resource-group $RG \
  --dns-resolver-name htlab-dns-resolver \
  --name htlab-outbound-ep \
  --location $LOCATION \
  --id $(az network vnet subnet show -g $RG -n $VNET --subnet-name DnsOutboundSubnet --query id -o tsv)

# 6. Tạo Forwarding Ruleset: forward corp.local → on-prem DNS (192.168.100.2)
az dns-resolver forwarding-ruleset create \
  --resource-group $RG \
  --name htlab-fwd-ruleset \
  --location $LOCATION \
  --outbound-endpoints '[{"id":"'"$(az dns-resolver outbound-endpoint show -g $RG --dns-resolver-name htlab-dns-resolver -n htlab-outbound-ep --query id -o tsv)"'"}]'

az dns-resolver forwarding-rule create \
  --resource-group $RG \
  --ruleset-name htlab-fwd-ruleset \
  --name forward-corp-local \
  --domain-name "corp.local." \
  --target-dns-servers '[{"ipAddress":"192.168.100.2","port":53}]' \
  --forwarding-rule-state Enabled

# Link ruleset vào VNet
az dns-resolver vnet-link create \
  --resource-group $RG \
  --ruleset-name htlab-fwd-ruleset \
  --name htlab-vnet-link \
  --id $(az network vnet show -g $RG -n $VNET --query id -o tsv)

# 7. Test từ WSL2 (on-prem): truy vấn Azure private zone qua Inbound Endpoint
# (cần tunnel VPN Connected)
dig @${INBOUND_IP} api.internal.htlab.local
nslookup api.internal.htlab.local ${INBOUND_IP}

🖥️ Đối chiếu GUI (Azure Portal):

Private DNS Resolvers → htlab-dns-resolver: tab Inbound endpoints và Outbound endpoints. Private DNS zones → internal.htlab.local: record set A cho api.

✅ Kết quả mong đợi: dig @${INBOUND_IP} api.internal.htlab.local từ WSL2 trả về ANSWER SECTION: 10.1.1.100; Forwarding Ruleset có rule corp.local trạng thái Enabled.

🧹 Cleanup:

# Giữ lại cho LAB-059
# az dns-resolver delete -g $RG -n htlab-dns-resolver --yes
LAB-059

Kiểm tra Route Table, Firewall Rule & BGP Advertisement

az CLI · ip route · tcpdump

🎯 Mục tiêu: Tạo UDR (User Defined Route) để ép traffic qua NVA; kiểm tra effective routes; test firewall rule NSG; giả lập BGP advertisement.

🧰 Công cụ / nền tảng: az CLI, Linux (WSL2), ip route, tcpdump.

📦 Chuẩn bị: Resource group và VNet từ LAB-057 tồn tại.

▶️ Phần A — UDR và Effective Routes:

RG="htlab-hybrid-rg"
VNET="htlab-cloud-vnet"

# 1. Tạo Route Table
az network route-table create \
  --resource-group $RG \
  --name htlab-udr \
  --location southeastasia \
  --disable-bgp-route-propagation false

# 2. Thêm route: traffic đến 192.168.100.0/24 (on-prem) qua VPN Gateway
# (Thông thường BGP tự advertise, nhưng ta tạo static để test)
az network route-table route create \
  --resource-group $RG \
  --route-table-name htlab-udr \
  --name to-onprem \
  --address-prefix 192.168.100.0/24 \
  --next-hop-type VirtualNetworkGateway

# 3. Gán Route Table vào AppSubnet
az network vnet subnet update \
  --resource-group $RG \
  --vnet-name $VNET \
  --name AppSubnet \
  --route-table htlab-udr

# 4. Kiểm tra effective routes của VM (nếu VM đang chạy)
VM_NIC=$(az vm show -g $RG -n htlab-test-vm --query 'networkProfile.networkInterfaces[0].id' -o tsv 2>/dev/null)
if [ -n "$VM_NIC" ]; then
  az network nic show-effective-route-table \
    --ids $VM_NIC \
    --output table
fi

# 5. Tạo NSG và gán vào AppSubnet
az network nsg create \
  --resource-group $RG \
  --name htlab-app-nsg

# Allow SSH từ on-prem only
az network nsg rule create \
  --resource-group $RG \
  --nsg-name htlab-app-nsg \
  --name AllowSSHFromOnPrem \
  --priority 100 \
  --protocol Tcp \
  --destination-port-ranges 22 \
  --source-address-prefixes 192.168.100.0/24 \
  --access Allow \
  --direction Inbound

# Deny all other inbound
az network nsg rule create \
  --resource-group $RG \
  --nsg-name htlab-app-nsg \
  --name DenyAllInbound \
  --priority 4000 \
  --protocol "*" \
  --destination-port-ranges "*" \
  --source-address-prefixes "*" \
  --access Deny \
  --direction Inbound

az network vnet subnet update \
  --resource-group $RG \
  --vnet-name $VNET \
  --name AppSubnet \
  --network-security-group htlab-app-nsg

# 6. Kiểm tra NSG effective rules
az network nsg show \
  --resource-group $RG \
  --name htlab-app-nsg \
  --query "securityRules[].{Name:name,Priority:priority,Access:access,Direction:direction,Port:destinationPortRange}" \
  --output table

▶️ Phần B — Kiểm tra routing on-prem (WSL2):

# Xem bảng route Linux (on-prem simulation)
ip route show
ip route get 10.1.1.100   # route đến Azure VNet subnet

# Trace route qua VPN tunnel (nếu tunnel Connected)
traceroute -n 10.1.1.100

# Kiểm tra IPsec SA (traffic counters tăng khi ping)
sudo ipsec statusall | grep -E "bytes_i|bytes_o|ESTABLISHED"

# Capture traffic trên VPN interface (optional)
# sudo tcpdump -i any -n host 10.1.1.100 -c 20

🖥️ Đối chiếu GUI (Azure Portal):

Virtual networks → htlab-cloud-vnet → Subnets → AppSubnet: thấy Route table htlab-udr và NSG htlab-app-nsg. Network Watcher → Next hop: test next hop cho IP 192.168.100.1 từ VM.

✅ Kết quả mong đợi: az network nic show-effective-route-table thấy route 192.168.100.0/24 next hop VirtualNetworkGateway; NSG rule table thấy AllowSSHFromOnPrem priority 100 và DenyAllInbound priority 4000; ip route get 10.1.1.100 chỉ ra interface VPN.

🧹 Cleanup:

# Giữ lại cho LAB-060; xóa sau module:
# az group delete --name $RG --yes --no-wait
LAB-060

Viết Runbook: Network Outage trong môi trường Hybrid

CLI · VS Code · Git

🎯 Mục tiêu: Viết runbook vận hành chuẩn cho sự cố network outage hybrid: VPN tunnel down, DNS failure, và route blackhole — với lệnh chẩn đoán CLI thực tế.

🧰 Công cụ / nền tảng: VS Code, Git, az CLI, gcloud CLI, AWS CLI (tùy chọn).

📦 Chuẩn bị: Repo từ LAB-056; kiến thức từ LAB-057/058/059.

▶️ Các bước:

cd hybrid-lab
code runbook-network-outage.md

Cấu trúc runbook (nội dung mẫu):

# Runbook: Hybrid Network Outage
## 1. Tổng quan
- Service: Hybrid Connectivity (VPN + DNS)
- Owner: Network Team / DevOps On-call
- Severity: P1 (VPN down = ứng dụng không giao tiếp on-prem ↔ cloud)
- Escalation: +84-xxx-xxx → [email protected]

## 2. Triệu chứng phổ biến
| Triệu chứng | Khả năng nguyên nhân |
|-------------|----------------------|
| App cloud không reach DB on-prem | VPN tunnel down / route missing |
| DNS query timeout trong cloud | Private Resolver unreachable / forwarding rule lỗi |
| Latency tăng đột biến | BGP route flap / secondary path kém |

## 3. Sự cố 1: VPN Tunnel Down

### Bước chẩn đoán (từ cloud — az CLI)
az network vpn-connection show \
  --resource-group htlab-hybrid-rg \
  --name htlab-vpn-conn \
  --query "{Status:connectionStatus,Bandwidth:ingressBytesTransferred}" \
  --output table

### Bước chẩn đoán (từ on-prem — Linux)
sudo ipsec statusall
sudo journalctl -u strongswan-starter --since "10 min ago" | grep -E "ERROR|WARN|IKE"

### Fix: restart tunnel
sudo ipsec down htlab-to-azure && sudo ipsec up htlab-to-azure
# Nếu vẫn fail: kiểm tra PSK khớp hai đầu, kiểm tra port UDP 500/4500 không bị block

## 4. Sự cố 2: DNS Resolution Failure

### Chẩn đoán
# Từ on-prem — test query vào Inbound Endpoint
dig @ api.internal.htlab.local +short
nslookup api.internal.htlab.local 

# Từ cloud VM — test forwarding sang on-prem
dig @168.63.129.16 server01.corp.local +short   # Azure default DNS → resolver

### Fix
az dns-resolver inbound-endpoint show \
  --resource-group htlab-hybrid-rg \
  --dns-resolver-name htlab-dns-resolver \
  --name htlab-inbound-ep
# Kiểm tra provisioningState = Succeeded
# Nếu Forwarding Rule disable: set lại Enabled

## 5. Sự cố 3: Route Blackhole

### Chẩn đoán
# Trên VM Azure — xem effective routes
az network nic show-effective-route-table --ids  --output table | grep 192.168

# Trên on-prem
ip route get 10.1.1.100
traceroute -n 10.1.1.100

### Fix
# Nếu route missing, kiểm tra BGP propagation bị disable:
az network route-table show -g htlab-hybrid-rg -n htlab-udr \
  --query disableBgpRoutePropagation
# Nếu true (disabled), bật lại:
az network route-table update -g htlab-hybrid-rg -n htlab-udr \
  --disable-bgp-route-propagation false

## 6. Post-mortem Template
- Timeline: [HH:MM] Phát hiện → [HH:MM] Chẩn đoán → [HH:MM] Fix → [HH:MM] Verify
- Root cause:
- Impact: X user × Y phút
- Action items (ai làm, deadline):
- Preventive: thêm monitoring alert cho tunnel status
git add runbook-network-outage.md
git commit -m "lab-060: hybrid network outage runbook with CLI diagnostics"
git push origin main   # push lên GitHub làm tài liệu đội

🖥️ Đối chiếu GUI (Azure Portal):

Network Watcher → Connection troubleshoot: test kết nối từ VM cloud đến IP on-prem; Azure Monitor → Alerts: tạo alert rule dựa trên metric TunnelIngressBytes = 0 trong 5 phút.

✅ Kết quả mong đợi: Runbook đủ 6 mục; mỗi sự cố có ≥2 lệnh chẩn đoán cụ thể với output mẫu; post-mortem template sẵn dùng; git log --oneline thấy commit.

🧹 Cleanup:

# Xóa toàn bộ resource group Azure (tránh chi phí VPN Gateway ~$140/tháng)
az group delete --name htlab-hybrid-rg --yes --no-wait
# strongSwan on WSL2: sudo systemctl stop strongswan-starter

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

Bối cảnh: Công ty bảo hiểm chuyển đổi sang hybrid cloud

Một công ty bảo hiểm lớn (2000 nhân viên, 3 datacenter HN/HCM/ĐN) muốn triển khai CRM mới trên Azure trong khi core policy system vẫn ở on-prem do yêu cầu Thông tư 09 (dữ liệu khách hàng phải lưu trong nước). Yêu cầu: CRM cloud đọc được dữ liệu policy from on-prem DB, SSO một lần cho toàn bộ ứng dụng.

Kiến trúc giải pháp

  • Connectivity: ExpressRoute 500Mbps qua FPT Telecom (partner) từ datacenter HN → Azure Southeast Asia PoP (Singapore) — đảm bảo latency <20ms, SLA 99.9%. Backup bằng site-to-site VPN IKEv2 tự động failover khi ExpressRoute down.
  • DNS: Azure Private DNS Resolver Inbound Endpoint — on-prem DNS forward *.azure.internal vào đây. Cloud DNS forward corp.insurance.vn ra on-prem DNS qua Forwarding Ruleset. Toàn bộ PaaS (Azure SQL, Service Bus) dùng Private Endpoint.
  • Identity: Azure AD Connect sync từ on-prem AD DS — user có SSO qua SAML/OIDC cho CRM cloud. Conditional Access Policy: yêu cầu Compliant Device + MFA cho login từ ngoài văn phòng.
  • Security Boundary: Azure Firewall Premium ở hub VNet; NSG rule chỉ cho phép CRM subnet gọi vào API layer on-prem (port 8443, source IP explicit). On-prem Palo Alto firewall tạo security zone riêng cho DMZ hybrid.
  • Kết quả: CRM go-live đúng hạn; zero data sovereignty violation; MTTR kết nối giảm từ 4h xuống 25 phút nhờ runbook và alert tự động; ExpressRoute failover sang VPN backup trong <3 phút.

📚 Nguồn tham khảo

Module 11: GCP Core Module 13: Multi-cloud Governance
Zalo