Bối cảnh: Khi cùng subnet nhưng không được “nhìn thấy” nhau
Hình dung bạn đang vận hành một hạ tầng hosting nhỏ — 10 khách hàng, mỗi người một VM, tất cả đều nằm trong dải IP 192.168.1.0/24. Về mặt lý thuyết, một VLAN là đủ. Nhưng có một vấn đề ngầm: khách hàng A có thể dùng ARP spoofing để đọc traffic của khách hàng B, hoặc tấn công trực tiếp vào VM hàng xóm cùng subnet.
Giải pháp thông thường là tạo VLAN riêng cho từng khách — nhưng với 10 hay 100 khách, bạn sẽ cần 10–100 VLAN, 10–100 subnet khác nhau, và đống routing rules đi kèm. Địa chỉ IP bị phân mảnh, quản lý trở thành cơn ác mộng.
Private VLAN (PVLAN) giải quyết chính xác bài toán này: cô lập traffic giữa các VM ngay trong cùng một subnet, mà không cần tạo thêm VLAN hay thay đổi cấu hình IP của bất kỳ máy nào.
Private VLAN hoạt động như thế nào?
PVLAN dùng mô hình “Primary + Secondary VLAN”. Primary VLAN là VLAN cha, bên trong đó chia thành các Secondary VLAN với 3 loại port:
- Promiscuous port: Giao tiếp được với tất cả — thường dùng cho router, firewall, load balancer.
- Isolated port: Chỉ nói chuyện được với Promiscuous port, không thấy các VM khác dù cùng subnet.
- Community port: Giao tiếp được với nhau trong cùng community và với Promiscuous — nhưng không thấy Isolated hay Community khác.
Ví dụ thực tế: Primary VLAN 200, bên trong có:
- Secondary VLAN 201 — Isolated (web server của từng khách hàng, không thấy nhau)
- Secondary VLAN 202 — Community (team dev A ping nhau được, không thấy team B)
- Secondary VLAN 203 — Community (team dev B, tách biệt hoàn toàn với team A)
- Promiscuous port dùng Primary VLAN 200 (gateway/firewall)
Yêu cầu trước khi bắt đầu
PVLAN trên VMware vSphere có một số điều kiện cần đáp ứng:
- vSphere Distributed Switch (VDS) — Standard Switch không hỗ trợ PVLAN
- License vSphere Enterprise Plus trở lên (VDS là tính năng enterprise)
- Truy cập vCenter Server với quyền Network Administrator
- Physical switch phía dưới cũng cần hỗ trợ PVLAN nếu traffic cần đi ra ngoài host
Nếu bạn chỉ có Standard Switch hoặc đang dùng ESXi standalone không có vCenter, PVLAN sẽ không khả dụng — đây là điểm khác biệt đáng kể so với Proxmox mà mình sẽ đề cập ở phần sau.
Cài đặt: Tạo PVLAN trên Distributed Virtual Switch
Bước 1: Mở cấu hình PVLAN trong vCenter
Đăng nhập vCenter, vào Networking → chọn Distributed Switch → Configure → Private VLAN. Bạn sẽ thấy bảng cấu hình trống. Click Add để thêm Primary VLAN đầu tiên.
Bước 2: Khai báo Primary VLAN và Secondary VLAN
Mình thường dùng VLAN 200 làm Primary để tránh xung đột với VLAN thông thường (1–199). Khi thêm Primary VLAN 200, vCenter tự động tạo entry Promiscuous 200↔200. Tiếp theo, thêm Secondary VLAN:
Primary VLAN: 200
Secondary VLAN 201 → Type: Isolated
Secondary VLAN 202 → Type: Community
Secondary VLAN 203 → Type: Community
Với Community, bạn có thể tạo nhiều nhóm — VM trong VLAN 202 thấy nhau nhưng không thấy VM trong VLAN 203.
Bước 3: Tạo Port Group với PVLAN mapping
Sau khi khai báo PVLAN mapping, tạo Port Group tương ứng. Vào VDS → Distributed Port Groups → New Distributed Port Group:
# Port Group cho Gateway/Firewall
Name: PVLAN-200-Promiscuous
VLAN Type: Private VLAN
Private VLAN Mode: Promiscuous (Primary VLAN 200)
# Port Group cho VM isolated
Name: PVLAN-201-Isolated
VLAN Type: Private VLAN
Private VLAN Mode: Isolated (Secondary VLAN 201)
# Port Group cho team A
Name: PVLAN-202-Community-A
VLAN Type: Private VLAN
Private VLAN Mode: Community (Secondary VLAN 202)
# Port Group cho team B
Name: PVLAN-203-Community-B
VLAN Type: Private VLAN
Private VLAN Mode: Community (Secondary VLAN 203)
Cấu hình chi tiết: Gán VM và kiểm tra IP
Gán VM vào Port Group đúng loại
Edit settings của từng VM → Network Adapter → chọn Port Group tương ứng:
- VM-Gateway → PVLAN-200-Promiscuous
- VM-WebServer-KhachA → PVLAN-201-Isolated
- VM-WebServer-KhachB → PVLAN-201-Isolated (cùng Isolated nhưng không thấy nhau)
- VM-Dev-TeamA-01 → PVLAN-202-Community-A
- VM-Dev-TeamA-02 → PVLAN-202-Community-A
- VM-Dev-TeamB-01 → PVLAN-203-Community-B
Cấu hình IP — không cần thay đổi gì
Đây là điểm hay của PVLAN: IP vẫn dùng chung một dải. PVLAN xử lý isolation ở layer 2, không ảnh hưởng đến layer 3:
# VM-WebServer-KhachA
IP: 192.168.1.10/24
Gateway: 192.168.1.1
# VM-WebServer-KhachB
IP: 192.168.1.11/24
Gateway: 192.168.1.1
# Cả hai đều ping được gateway nhưng KHÔNG ping được nhau
Cấu hình physical switch (nếu traffic đi ra ngoài host)
Nếu uplink ESXi host đi qua physical switch Cisco:
! Khai báo PVLAN
vlan 200
private-vlan primary
vlan 201
private-vlan isolated
vlan 202
private-vlan community
vlan 203
private-vlan community
! Map secondary vào primary
vlan 200
private-vlan association 201,202,203
! Port kết nối đến ESXi uplink
interface GigabitEthernet0/1
switchport mode trunk
switchport trunk allowed vlan 200-203
Nếu tất cả VM đều nằm trên cùng một ESXi host (lab/test), bước này có thể bỏ qua — traffic không cần đi ra physical switch.
Kiểm tra & Monitoring
Test isolation bằng ping
Sau khi cấu hình xong, kiểm tra từ các VM theo kịch bản sau:
# Từ VM-WebServer-KhachA (Isolated, IP: 192.168.1.10)
ping 192.168.1.1 # Gateway Promiscuous → PHẢI thành công
ping 192.168.1.11 # KhachB cùng Isolated → PHẢI thất bại
ping 192.168.1.20 # Community VM → PHẢI thất bại
# Từ VM-Dev-TeamA-01 (Community 202, IP: 192.168.1.20)
ping 192.168.1.1 # Gateway → PHẢI thành công
ping 192.168.1.21 # TeamA-02 cùng Community 202 → PHẢI thành công
ping 192.168.1.30 # TeamB Community 203 → PHẢI thất bại
ping 192.168.1.10 # KhachA Isolated → PHẢI thất bại
Audit cấu hình bằng PowerCLI
# Xem PVLAN config của VDS
$vds = Get-VDSwitch -Name "DSwitch-Production"
$vds.ExtensionData.Config.PrivatVlanConfig |
Format-Table PrimaryVlanId, SecondaryVlanId, PrivateVlanType
# Liệt kê Port Group đang dùng PVLAN
Get-VDPortgroup | Where-Object { $_.VlanConfiguration -match "Private" } |
Select-Object Name, VlanConfiguration
Monitor với NetFlow/IPFIX
Bật IPFIX trên VDS để track traffic patterns và phát hiện anomaly:
# Enable IPFIX cho VDS
$vds = Get-VDSwitch -Name "DSwitch-Production"
$spec = New-Object VMware.Vim.DVSConfigSpec
$spec.IpfixConfig = New-Object VMware.Vim.VMwareIpfixConfig
$spec.IpfixConfig.CollectorIpAddress = "192.168.1.200" # NetFlow collector
$spec.IpfixConfig.CollectorPort = 2055
$spec.IpfixConfig.ActiveFlowTimeout = 60
$spec.ConfigVersion = $vds.ExtensionData.Config.ConfigVersion
$vds.ExtensionData.ReconfigureDvs($spec)
So sánh thực tế: PVLAN trên VMware vs Proxmox
Khi migrate từ VMware sang Proxmox cho lab cá nhân, mình nhận thấy nhiều điểm khác biệt thú vị về cách hai nền tảng xử lý network isolation.
Proxmox dùng Linux bridge và có thể đạt kết quả tương tự bằng cách kết hợp VLAN-aware bridge với ebtables rules, nhưng không có GUI tích hợp sẵn. Muốn có PVLAN “thật” trên Proxmox phải tự viết script hoặc dùng Open vSwitch — phức tạp hơn đáng kể so với vài click trên vCenter.
Điều mình đánh giá cao ở VMware PVLAN là tính nhất quán: cấu hình một lần ở VDS level, áp dụng ngay cho toàn bộ host trong cluster. Với Proxmox, phải cấu hình từng node hoặc viết automation script mới đảm bảo đồng bộ.
Tuy nhiên, Enterprise Plus license là rào cản lớn — đặc biệt với lab cá nhân hay startup nhỏ. Với môi trường không cần SLA cao, Proxmox + OVS là lựa chọn hợp lý hơn về chi phí.
Các lỗi thường gặp
- VM không ping được gateway sau khi cấu hình: Kiểm tra VM-Gateway có nằm trên Promiscuous port group chưa, không phải Isolated.
- Community VM không thấy nhau: Đảm bảo cả hai cùng Secondary VLAN ID — ví dụ đều là 202, không phải một 202 một 203.
- Physical switch không forward traffic: Cần cấu hình PVLAN trên switch nếu uplink là trunk, không phải access port.
- Không thấy menu Private VLAN trong vCenter: Kiểm tra lại — Standard Switch và Standard license không có tính năng này.
- PVLAN config mất sau khi add host mới vào cluster: PVLAN mapping lưu ở VDS nên tự apply, nhưng cần kiểm tra lại uplink của host mới.

