🎯 Mục Tiêu Lab
Tạo 2 VNet với address space không chồng lấp tại cùng region (Southeast Asia)
Thiết lập VNet Peering hai chiều (bidirectional) giữa 2 VNet
Cấu hình Allow forwarded traffic và Allow gateway transit
Triển khai VM trong mỗi VNet và kiểm tra ping/SSH cross-VNet
Xem effective routes trên NIC để hiểu routing table tự động thêm từ peering
Thực hành tùy chọn: cross-region peering giữa Southeast Asia và East Asia
📋 Chuẩn Bị
- Hoàn thành Lab 05 (VNet concepts)
- Azure CLI đã đăng nhập, subscription active
- Quota 2 VM Standard_B1s tại southeastasia
- VNet-A (10.1.0.0/16) và VNet-B (10.2.0.0/16)
- 2 Peering links (A→B và B→A), 2 VM
- Chi phí: ~$1-2 nếu xóa ngay sau lab
🏗️ Kịch Bản & Tài Nguyên
Công ty có 2 team dev và ops riêng biệt, mỗi team có VNet riêng. Sau khi merge project, cần kết nối 2 VNet để VM trong VNet-A giao tiếp được với VM trong VNet-B mà không phải đi qua internet — VNet Peering là giải pháp tối ưu nhất (low latency, không tốn bandwidth cost trong cùng region).
🧪 Các Bước Thực Hiện
Tạo 2 Resource Group và 2 Virtual Network
- 1.1Tạo RG
rg-lab06-vnet-atại Southeast Asia - 1.2Tạo VNet
vnet-a-lab06— Address space: 10.1.0.0/16, subnet-a: 10.1.1.0/24, RG: rg-lab06-vnet-a - 1.3Tạo RG
rg-lab06-vnet-btại Southeast Asia - 1.4Tạo VNet
vnet-b-lab06— Address space: 10.2.0.0/16, subnet-b: 10.2.1.0/24, RG: rg-lab06-vnet-b
# Tạo Resource Groups
az group create --name rg-lab06-vnet-a --location southeastasia
az group create --name rg-lab06-vnet-b --location southeastasia
# Tạo VNet-A (Team Dev)
az network vnet create \
--resource-group rg-lab06-vnet-a \
--name vnet-a-lab06 \
--address-prefix 10.1.0.0/16 \
--subnet-name subnet-a \
--subnet-prefix 10.1.1.0/24 \
--location southeastasia
# Tạo VNet-B (Team Ops)
az network vnet create \
--resource-group rg-lab06-vnet-b \
--name vnet-b-lab06 \
--address-prefix 10.2.0.0/16 \
--subnet-name subnet-b \
--subnet-prefix 10.2.1.0/24 \
--location southeastasia
# Xác nhận 2 VNet
az network vnet list --output table
Triển Khai VM trong mỗi VNet
Tạo VM test trong mỗi VNet để kiểm tra kết nối sau khi peering. vm-a01 có Public IP (để SSH vào), vm-b01 không có Public IP (chỉ truy cập qua peering).
- 2.1Tạo vm-a01: Ubuntu 22.04, B1s, VNet = vnet-a-lab06, Subnet = subnet-a, Public IP: Standard SKU
- 2.2NSG của vm-a01: Allow SSH (22) inbound từ IP của bạn
- 2.3Tạo vm-b01: Ubuntu 22.04, B1s, VNet = vnet-b-lab06, Subnet = subnet-b, không có Public IP
- 2.4Ghi lại private IP của vm-b01 (sẽ dùng để ping từ vm-a01)
# Public IP Standard cho vm-a01
az network public-ip create \
--resource-group rg-lab06-vnet-a \
--name pip-vm-a01 \
--sku Standard \
--allocation-method Static
# Tạo vm-a01 (có Public IP, trong VNet-A)
az vm create \
--resource-group rg-lab06-vnet-a \
--name vm-a01 \
--image Ubuntu2204 \
--size Standard_B1s \
--vnet-name vnet-a-lab06 \
--subnet subnet-a \
--public-ip-address pip-vm-a01 \
--admin-username azureuser \
--generate-ssh-keys
# Tạo vm-b01 (không có Public IP, trong VNet-B)
az vm create \
--resource-group rg-lab06-vnet-b \
--name vm-b01 \
--image Ubuntu2204 \
--size Standard_B1s \
--vnet-name vnet-b-lab06 \
--subnet subnet-b \
--public-ip-address "" \
--admin-username azureuser \
--generate-ssh-keys
# Lấy private IP của vm-b01
az vm show -g rg-lab06-vnet-b -n vm-b01 \
-d --query privateIps -o tsv
Thiết Lập VNet Peering — Hai Chiều
Peering phải tạo từ cả 2 phía: một link từ VNet-A sang VNet-B và một link ngược lại. Khi tạo qua Portal có thể tạo cả 2 cùng lúc; CLI cần 2 lệnh riêng.
- 3.1Portal → vnet-a-lab06 → Peerings → + Add
- 3.2This peering link name:
peer-a-to-b - 3.3Remote VNet: chọn vnet-b-lab06 (subscription hiện tại)
- 3.4Remote peering link name:
peer-b-to-a - 3.5Enable: Allow traffic to remote virtual network, Allow forwarded traffic from remote virtual network → Add
- 3.6Chờ status chuyển sang Connected ở cả 2 VNet
# Lấy Resource ID của VNet-B (cần cho cross-RG peering)
VNET_B_ID=$(az network vnet show \
--resource-group rg-lab06-vnet-b \
--name vnet-b-lab06 \
--query id -o tsv)
# Tạo peering: VNet-A → VNet-B
az network vnet peering create \
--resource-group rg-lab06-vnet-a \
--name peer-a-to-b \
--vnet-name vnet-a-lab06 \
--remote-vnet $VNET_B_ID \
--allow-vnet-access \
--allow-forwarded-traffic
# Lấy Resource ID của VNet-A
VNET_A_ID=$(az network vnet show \
--resource-group rg-lab06-vnet-a \
--name vnet-a-lab06 \
--query id -o tsv)
# Tạo peering ngược: VNet-B → VNet-A
az network vnet peering create \
--resource-group rg-lab06-vnet-b \
--name peer-b-to-a \
--vnet-name vnet-b-lab06 \
--remote-vnet $VNET_A_ID \
--allow-vnet-access \
--allow-forwarded-traffic
# Kiểm tra trạng thái peering
az network vnet peering list \
--resource-group rg-lab06-vnet-a \
--vnet-name vnet-a-lab06 \
--output table
Name PeeringState ProvisioningState ResourceGroup
------------ -------------- ------------------- -----------------
peer-a-to-b Connected Succeeded rg-lab06-vnet-a
Kiểm Tra Kết Nối & Xem Effective Routes
- 4.1Vào NIC của vm-a01 → Effective routes → kiểm tra có route 10.2.0.0/16 với Next hop: VNet peering
- 4.2Network Watcher → Connection Troubleshoot → Source: vm-a01, Dest: private IP của vm-b01, Port 22 → Check
- 4.3SSH vào vm-a01 qua Public IP → từ đó ping private IP của vm-b01
- 4.4Kết quả mong đợi: ping thành công sau khi peering, thất bại trước khi peering
# Lấy Public IP của vm-a01
PIP_A=$(az network public-ip show \
-g rg-lab06-vnet-a -n pip-vm-a01 \
--query ipAddress -o tsv)
echo "Public IP vm-a01: $PIP_A"
# Lấy Private IP của vm-b01
PRIV_B=$(az vm show \
-g rg-lab06-vnet-b -n vm-b01 \
-d --query privateIps -o tsv)
echo "Private IP vm-b01: $PRIV_B"
# Xem effective routes trên NIC của vm-a01
NIC_A=$(az vm show -g rg-lab06-vnet-a -n vm-a01 \
--query 'networkProfile.networkInterfaces[0].id' -o tsv | \
awk -F'/' '{print $NF}')
az network nic show-effective-route-table \
--resource-group rg-lab06-vnet-a \
--name $NIC_A \
--output table
# Test connectivity từ vm-a01 tới vm-b01 port 22
az network watcher test-connectivity \
--resource-group rg-lab06-vnet-a \
--source-resource vm-a01 \
--dest-address $PRIV_B \
--dest-port 22
Source State AddressPrefix NextHopType NextHopIpAddress
-------- ------- --------------- ---------------- ----------------
Default Active 10.1.0.0/16 VnetLocal
VNet Active 10.2.0.0/16 VNetPeering
Default Active 0.0.0.0/0 Internet
# SSH vào vm-a01 (thay PUBLIC_IP_VM_A01)
ssh azureuser@PUBLIC_IP_VM_A01
# Từ vm-a01, ping private IP của vm-b01 (thay 10.2.1.4 nếu khác)
ping -c 4 10.2.1.4
# Kết quả mong đợi (sau peering):
# PING 10.2.1.4 (10.2.1.4) 56(84) bytes of data.
# 64 bytes from 10.2.1.4: icmp_seq=1 ttl=64 time=1.23 ms
# 64 bytes from 10.2.1.4: icmp_seq=2 ttl=64 time=0.98 ms
Tùy Chọn: Cross-Region Peering (Southeast Asia ↔ East Asia)
# Tạo VNet-C tại East Asia (region khác)
az group create --name rg-lab06-vnet-c --location eastasia
az network vnet create \
--resource-group rg-lab06-vnet-c \
--name vnet-c-lab06 \
--address-prefix 10.3.0.0/16 \
--subnet-name subnet-c \
--subnet-prefix 10.3.1.0/24 \
--location eastasia
# Lấy ID của VNet-C
VNET_C_ID=$(az network vnet show \
-g rg-lab06-vnet-c -n vnet-c-lab06 \
--query id -o tsv)
# Peer VNet-A (SEA) → VNet-C (EA) — cross-region
az network vnet peering create \
--resource-group rg-lab06-vnet-a \
--name peer-a-to-c \
--vnet-name vnet-a-lab06 \
--remote-vnet $VNET_C_ID \
--allow-vnet-access
# Peer VNet-C (EA) → VNet-A (SEA)
VNET_A_ID=$(az network vnet show \
-g rg-lab06-vnet-a -n vnet-a-lab06 \
--query id -o tsv)
az network vnet peering create \
--resource-group rg-lab06-vnet-c \
--name peer-c-to-a \
--vnet-name vnet-c-lab06 \
--remote-vnet $VNET_A_ID \
--allow-vnet-access
📊 Kết Quả Đầu Ra Lab 06
Cả 2 peering links (peer-a-to-b và peer-b-to-a) đều ở trạng thái Connected
vm-a01 ping được 10.2.1.4 (vm-b01) với latency <5ms (same region)
NIC của vm-a01 có route 10.2.0.0/16 → VNetPeering tự động
VNet-A ↔ B và A ↔ C đã peer, nhưng B không kết nối được C (non-transitive)
🧹 Dọn Dẹp Tài Nguyên
# Xóa tất cả resource groups của lab này
az group delete --name rg-lab06-vnet-a --yes --no-wait
az group delete --name rg-lab06-vnet-b --yes --no-wait
# Nếu đã tạo VNet-C (cross-region):
az group delete --name rg-lab06-vnet-c --yes --no-wait
❓ Câu Hỏi Ôn Tập
1. VNet Peering có phải tạo hai chiều không? Điều gì xảy ra nếu chỉ tạo một chiều?
Gợi ý: Phải tạo 2 links. Nếu chỉ tạo A→B, traffic từ A sang B đi được nhưng B không biết đường về A — không thể giao tiếp 2 chiều.
2. VNet Peering có thể dùng được khi 2 VNet có address space chồng lấp không? Ví dụ VNet-A: 10.0.0.0/16 và VNet-B: 10.0.0.0/24?
Gợi ý: Không thể. Azure từ chối tạo peering khi address space overlapping. Cần plan IP trước.
3. Giải thích "non-transitive routing" trong VNet Peering. Giải pháp nào giúp routing transitive?
Gợi ý: A peer B, B peer C → A không đến C. Giải pháp: Azure Virtual WAN, Hub-Spoke với NVA, hoặc User Defined Routes (UDR) qua NVA.
4. Sự khác nhau giữa "Allow forwarded traffic" và "Allow gateway transit" trong peering settings?
Gợi ý: Forwarded traffic = cho phép traffic từ bên ngoài VNet được forward qua. Gateway transit = cho phép dùng VPN Gateway của VNet kia (dùng trong Hub-Spoke để VNet Spoke không cần Gateway riêng).
5. So sánh VNet Peering với VPN Gateway VNet-to-VNet về latency, cost, và use case?
Gợi ý: Peering — low latency, low cost (same region), nhanh thiết lập, nhưng không mã hóa traffic. VPN GW — encrypted, hỗ trợ on-prem, nhưng latency cao hơn và chi phí Gateway SKU cao.