Lý Thuyết Cốt Lõi
1. Lập Kế Hoạch & Tạo Virtual Network
Azure Virtual Network (VNet) là thành phần mạng cơ bản, cung cấp môi trường mạng riêng biệt, bảo mật cho các Azure resources. Trước khi tạo VNet, cần lập kế hoạch kỹ về địa chỉ IP và phân chia subnet.
- • Giới hạn trong 1 region (không trải qua nhiều region)
- • Có thể kết nối nhiều VNet qua VNet Peering hoặc VPN Gateway
- • Mỗi subscription hỗ trợ tối đa 1.000 VNet
- • Address space không được trùng lặp giữa các VNet khi peering
- • Hỗ trợ IPv4 và IPv6 (dual-stack)
- • Dùng dải RFC 1918:
10.0.0.0/8,172.16.0.0/12,192.168.0.0/16 - • Tránh trùng với dải IP on-premises nếu dùng hybrid connectivity
- • Dự trữ không gian địa chỉ cho tăng trưởng trong tương lai
- • Kích thước tối thiểu /29, tối đa /2 cho address space
vnet-<project>-<env>-<region>, ví dụ vnet-erp-prod-sea. Mỗi VNet nên có ít nhất 1 subnet riêng cho từng tier (web, app, db) để áp NSG độc lập.
2. Tạo và Quản Lý Subnets
Subnet là phân đoạn nhỏ hơn của VNet, cho phép phân chia workload và áp dụng policy bảo mật (NSG, Route Table) khác nhau cho từng nhóm tài nguyên.
| Loại Subnet | Mục đích | Lưu ý |
|---|---|---|
| GatewaySubnet | VPN Gateway / ExpressRoute Gateway | Tên bắt buộc, không gán NSG |
| AzureBastionSubnet | Azure Bastion host | Tên bắt buộc, tối thiểu /26 |
| AzureFirewallSubnet | Azure Firewall | Tên bắt buộc, tối thiểu /26 |
| Subnet tùy chỉnh | VM, AKS, App Service, v.v. | Azure giữ lại 5 IP đầu tiên |
3. IP Addressing — Public IP & Private IP
- • Static: IP cố định, không thay đổi khi deallocate VM. Dùng cho DNS, firewall rules.
- • Dynamic: IP thay đổi mỗi khi resource start. Rẻ hơn, dùng cho dev/test.
- • SKU Basic: legacy, không có Availability Zone support
- • SKU Standard: bắt buộc cho Load Balancer Standard, hỗ trợ Zone-redundant
- • Có thể gán DNS label:
<label>.southeastasia.cloudapp.azure.com
- • Lấy từ address space của subnet, dùng cho giao tiếp nội bộ VNet
- • Dynamic: Azure cấp phát tự động qua DHCP (mặc định)
- • Static: Chỉ định IP cố định trong subnet — dùng cho domain controllers, DNS servers
- • Gán cho: Network Interface, Internal Load Balancer, Application Gateway
- • Không thể dùng IP đã reserved (.0, .1, .2, .3, .255)
Public IP là resource độc lập — tạo trước, sau đó gán vào: VM Network Interface, Load Balancer Frontend, Application Gateway, VPN Gateway, Bastion Host. Có thể tách khỏi resource và gán lại.
Public IP Prefix: đặt trước một dải Public IP liền kề (/28–/31). Hữu ích khi cần whitelist IP cố định cho nhiều resource, giảm quản lý firewall rules.
4. DNS và Service Tags trong VNet
Mặc định, Azure cung cấp DNS giải quyết tên VM trong VNet bằng hostname. DNS server: 168.63.129.16. Không hỗ trợ custom domain hay reverse lookup.
Cấu hình trong VNet Settings → DNS Servers. Dùng khi: cần resolve on-premises domain, muốn dùng Azure Private DNS zones, hoặc cần conditional forwarder.
Nhóm IP prefix của Azure services (VD: AzureCloud, Storage.SoutheastAsia). Dùng trong NSG rules thay vì IP range cụ thể — Azure tự cập nhật khi IP service thay đổi.
Gán subnet cho một Azure service cụ thể (VD: Microsoft.Web/serverFarms cho App Service, Microsoft.ContainerInstance/containerGroups). Service quản lý subnet theo nhu cầu riêng.
Bài Tập Thực Hành (Lab)
Tạo Resource Group và Virtual Network với 3 Subnets
# Tạo Resource Group
az group create \
--name rg-az104-m09 \
--location southeastasia \
--tags Course=AZ-104 Module=09
# Tạo VNet với address space 10.9.0.0/16
az network vnet create \
--resource-group rg-az104-m09 \
--name vnet-az104-m09 \
--address-prefix 10.9.0.0/16 \
--location southeastasia
# Tạo subnet web-tier
az network vnet subnet create \
--resource-group rg-az104-m09 \
--vnet-name vnet-az104-m09 \
--name snet-web \
--address-prefix 10.9.1.0/24
# Tạo subnet app-tier
az network vnet subnet create \
--resource-group rg-az104-m09 \
--vnet-name vnet-az104-m09 \
--name snet-app \
--address-prefix 10.9.2.0/24
# Tạo subnet db-tier
az network vnet subnet create \
--resource-group rg-az104-m09 \
--vnet-name vnet-az104-m09 \
--name snet-db \
--address-prefix 10.9.3.0/24
# Kiểm tra VNet và subnets
az network vnet show \
--resource-group rg-az104-m09 \
--name vnet-az104-m09 \
--query "{addressSpace:addressSpace.addressPrefixes, subnets:subnets[].{name:name,prefix:addressPrefix}}" \
-o table
Tạo Public IP Static (SKU Standard) và gán DNS label
# Tạo Public IP Standard Static
az network public-ip create \
--resource-group rg-az104-m09 \
--name pip-webvm-m09 \
--sku Standard \
--allocation-method Static \
--zone 1 2 3 \
--dns-name "az104m09web$(date +%s | tail -c 6)" \
--location southeastasia
# Xem IP được gán và FQDN
az network public-ip show \
--resource-group rg-az104-m09 \
--name pip-webvm-m09 \
--query "{ip:ipAddress, fqdn:dnsSettings.fqdn, sku:sku.name, allocation:publicIPAllocationMethod}" \
-o table
Tạo VM với NIC gán Public IP và Private IP tĩnh
# Tạo NSG cơ bản cho web tier
az network nsg create \
--resource-group rg-az104-m09 \
--name nsg-web-m09
az network nsg rule create \
--resource-group rg-az104-m09 \
--nsg-name nsg-web-m09 \
--name AllowHTTP \
--priority 100 \
--protocol Tcp \
--destination-port-range 80 \
--access Allow \
--direction Inbound
az network nsg rule create \
--resource-group rg-az104-m09 \
--nsg-name nsg-web-m09 \
--name AllowSSH \
--priority 110 \
--protocol Tcp \
--destination-port-range 22 \
--access Allow \
--direction Inbound
# Tạo NIC với private IP tĩnh 10.9.1.10 và gán Public IP
az network nic create \
--resource-group rg-az104-m09 \
--name nic-webvm-m09 \
--vnet-name vnet-az104-m09 \
--subnet snet-web \
--private-ip-address 10.9.1.10 \
--public-ip-address pip-webvm-m09 \
--network-security-group nsg-web-m09
# Tạo VM gắn NIC đã cấu hình
az vm create \
--resource-group rg-az104-m09 \
--name vm-web-m09 \
--nics nic-webvm-m09 \
--image Ubuntu2204 \
--size Standard_B1s \
--admin-username azureadmin \
--generate-ssh-keys \
--no-wait
echo "VM đang tạo... Kiểm tra sau 3-5 phút."
# Kiểm tra NIC sau khi VM tạo xong
az network nic show \
--resource-group rg-az104-m09 \
--name nic-webvm-m09 \
--query "ipConfigurations[0].{privateIP:privateIPAddress,privateAllocation:privateIPAllocationMethod,publicIP:publicIPAddress.id}" \
-o table
Xác minh kết nối mạng và kiểm tra IP configuration
# Lấy Public IP của VM
PUBLIC_IP=$(az network public-ip show \
--resource-group rg-az104-m09 \
--name pip-webvm-m09 \
--query ipAddress -o tsv)
echo "Public IP: $PUBLIC_IP"
# Kiểm tra VM đang chạy
az vm show \
--resource-group rg-az104-m09 \
--name vm-web-m09 \
--show-details \
--query "{name:name,powerState:powerState,publicIps:publicIps,privateIps:privateIps}" \
-o table
# SSH vào VM để xác minh IP nội bộ
ssh azureadmin@$PUBLIC_IP "ip addr show eth0 | grep inet"
# Kiểm tra effective IP routes
az network nic show-effective-route-table \
--resource-group rg-az104-m09 \
--name nic-webvm-m09 \
-o table
ip addr trong VM phải trả về 10.9.1.10/24.
Cleanup — Dọn dẹp tài nguyên tránh phát sinh chi phí
# Xóa toàn bộ Resource Group (kéo theo VM, NIC, Public IP, VNet, NSG)
az group delete --name rg-az104-m09 --yes --no-wait
echo "Đang xóa rg-az104-m09... Quá trình mất 3-5 phút."
Kết Quả Đầu Ra
Lập kế hoạch address space RFC 1918, tránh trùng IP với on-premises, tạo VNet thành công trên Azure
Tạo subnet web/app/db riêng biệt, hiểu 5 IP reserved, biết các subnet đặc biệt (GatewaySubnet, AzureBastionSubnet)
Tạo Public IP Standard với Zone-redundancy, gán DNS label, phân biệt Static vs Dynamic, Basic vs Standard
Gán Private IP cố định vào NIC của VM, xác minh qua ip addr trong OS và Azure Portal → IP Configurations
Phân biệt Azure-provided DNS vs Custom DNS, cách dùng Service Tags trong NSG rules thay IP range
Xem effective routes và effective NSG rules từ NIC để troubleshoot kết nối mạng trong VNet
Ứng Dụng Thực Tế
Tình huống 1: Công ty thương mại điện tử — Kiến trúc 3-tier
Cần triển khai hệ thống bán hàng online với frontend, backend API và database cách ly nhau.
VNet 10.10.0.0/16 chia 3 subnet: snet-web (10.10.1.0/24) Public IP Static cho Load Balancer; snet-app (10.10.2.0/24) private only; snet-db (10.10.3.0/24) private, Private IP static cho SQL Server.
NSG web-tier chỉ cho phép 80/443 từ Internet. App-tier chỉ nhận traffic từ snet-web. DB-tier chỉ nhận 1433 từ snet-app. DNS label shop.southeastasia.cloudapp.azure.com trỏ về Public IP của LB.
Database không expose Internet. Compromise ở web tier không thể trực tiếp tấn công DB. Private IP tĩnh cho DB server giúp connection string không thay đổi.
Tình huống 2: Tập đoàn sản xuất — Hybrid Connectivity
Nhà máy tại Hà Nội có hệ thống ERP on-premises, cần mở rộng lên Azure mà không thay đổi IP scheme.
On-premises dùng 192.168.0.0/16 → Azure VNet dùng 10.20.0.0/16 (không trùng). GatewaySubnet 10.20.255.0/27 cho VPN Gateway. Custom DNS trỏ về on-prem DNS server 192.168.1.10.
VPN Gateway Site-to-Site kết nối factory LAN với Azure VNet. VM Azure ERP extension dùng Private IP tĩnh 10.20.1.20. DNS conditional forwarder: corp.local → 192.168.1.10.
VM Azure resolve được hostname on-premises. Database connection string giữ nguyên khi di chuyển workload. Mở rộng dần dần không downtime hệ thống hiện tại.
Tình huống 3: Bệnh viện — Cách ly mạng dữ liệu bệnh nhân
Hệ thống HIS (Hospital Information System) yêu cầu dữ liệu bệnh nhân không bao giờ đi qua Internet.
VNet riêng cho HIS, subnet dữ liệu bệnh nhân không có Public IP nào. Chỉ AzureBastionSubnet có Public IP để admin truy cập. Service Endpoint cho Storage Account từ subnet DB.
Azure Bastion trong AzureBastionSubnet (/26) cho phép admin RDP/SSH vào VM qua HTTPS — không cần Public IP trên VM. NSG chặn hoàn toàn outbound Internet từ snet-db.
Dữ liệu PHI (Protected Health Information) không bao giờ traverse Internet. Tuân thủ Thông tư 32/2023/TT-BYT về bảo mật thông tin y tế. Audit log đầy đủ qua Bastion.