背景:同じサブネットでも「見えてはいけない」ケース
小規模なホスティングインフラを運用していると想像してください。顧客が10社、それぞれ1台のVM、全員が192.168.1.0/24のIPレンジ内にいます。理論上、VLANが1つあれば十分です。しかし、隠れた問題があります。顧客AがARPスプーフィングを使って顧客Bのトラフィックをキャプチャしたり、同じサブネット内の隣接VMを直接攻撃できてしまうのです。
一般的な解決策は顧客ごとにVLANを作ることですが、10社や100社になると、10〜100個のVLAN、10〜100個の異なるサブネット、それに伴う大量のルーティングルールが必要になります。IPアドレスは断片化し、管理は悪夢と化します。
Private VLAN(PVLAN)はまさにこの課題を解決します。VLANを追加したり、どのマシンのIP設定も変更することなく、同じサブネット内のVM間のトラフィックを分離できるのです。
Private VLANの仕組み
PVLANは「Primary + Secondary VLAN」モデルを採用しています。Primary VLANは親VLANで、その中にSecondary VLANが定義され、ポートは3種類に分けられます。
- Promiscuousポート:全てのポートと通信可能。通常、ルーター、ファイアウォール、ロードバランサーに使用。
- Isolatedポート:Promiscuousポートとのみ通信可能。同じサブネット内の他のVMは見えない。
- Communityポート:同じCommunity内のポートおよびPromiscuousポートとは通信可能。ただし、Isolatedや他のCommunityは見えない。
実例:Primary VLAN 200の内部構成:
- Secondary VLAN 201 — Isolated(各顧客のWebサーバー。互いに見えない)
- Secondary VLAN 202 — Community(開発チームA。互いにping可能。チームBは見えない)
- Secondary VLAN 203 — Community(開発チームB。チームAとは完全に隔離)
- PromiscuousポートはPrimary VLAN 200を使用(ゲートウェイ/ファイアウォール)
前提条件
VMware vSphereでPVLANを使用するには、いくつかの条件を満たす必要があります。
- vSphere Distributed Switch(VDS) — Standard SwitchはPVLANをサポートしていない
- vSphere Enterprise Plus以上のライセンス(VDSはエンタープライズ機能)
- Network Administrator権限でのvCenter Serverへのアクセス
- トラフィックがホスト外に出る場合、下位の物理スイッチもPVLANに対応している必要がある
Standard Switchしかない場合やvCenterなしでESXi単体を使用している場合、PVLANは利用できません。これは後述するProxmoxとの大きな違いの一つです。
セットアップ:Distributed Virtual SwitchでPVLANを作成する
ステップ1:vCenterでPVLAN設定を開く
vCenterにログインし、Networking → Distributed Switchを選択 → Configure → Private VLANと進みます。空の設定テーブルが表示されます。Addをクリックして最初のPrimary VLANを追加します。
ステップ2:Primary VLANとSecondary VLANを定義する
通常のVLAN(1〜199)との競合を避けるため、Primary VLANにはVLAN 200を使うようにしています。Primary VLAN 200を追加すると、vCenterが自動的にPromiscuousエントリ200↔200を作成します。続いてSecondary VLANを追加します。
Primary VLAN: 200
Secondary VLAN 201 → Type: Isolated
Secondary VLAN 202 → Type: Community
Secondary VLAN 203 → Type: Community
Communityは複数のグループを作成できます。VLAN 202内のVMは互いに見えますが、VLAN 203のVMは見えません。
ステップ3:PVLANマッピングでPort Groupを作成する
PVLANマッピングを定義したら、対応するPort Groupを作成します。VDS → Distributed Port Groups → New Distributed Port Groupと進みます。
# ゲートウェイ/ファイアウォール用 Port Group
Name: PVLAN-200-Promiscuous
VLAN Type: Private VLAN
Private VLAN Mode: Promiscuous (Primary VLAN 200)
# Isolated VM用 Port Group
Name: PVLAN-201-Isolated
VLAN Type: Private VLAN
Private VLAN Mode: Isolated (Secondary VLAN 201)
# チームA用 Port Group
Name: PVLAN-202-Community-A
VLAN Type: Private VLAN
Private VLAN Mode: Community (Secondary VLAN 202)
# チームB用 Port Group
Name: PVLAN-203-Community-B
VLAN Type: Private VLAN
Private VLAN Mode: Community (Secondary VLAN 203)
詳細設定:VMの割り当てとIP確認
VMを正しいPort Groupに割り当てる
各VMのEdit settings → Network Adapter → 対応するPort Groupを選択します。
- VM-Gateway → PVLAN-200-Promiscuous
- VM-WebServer-KhachA → PVLAN-201-Isolated
- VM-WebServer-KhachB → PVLAN-201-Isolated(同じIsolated内だが互いに見えない)
- VM-Dev-TeamA-01 → PVLAN-202-Community-A
- VM-Dev-TeamA-02 → PVLAN-202-Community-A
- VM-Dev-TeamB-01 → PVLAN-203-Community-B
IP設定 — 変更不要
PVLANの優れた点は、IPが同じレンジを共有できることです。PVLANはレイヤー2でIsolationを処理するため、レイヤー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
# 両方ともゲートウェイにpingできるが、互いにはpingできない
物理スイッチの設定(トラフィックがホスト外に出る場合)
ESXiホストのuplinkがCiscoの物理スイッチを経由する場合:
! PVLANを定義する
vlan 200
private-vlan primary
vlan 201
private-vlan isolated
vlan 202
private-vlan community
vlan 203
private-vlan community
! SecondaryをPrimaryにマッピング
vlan 200
private-vlan association 201,202,203
! ESXi uplinkに接続するポート
interface GigabitEthernet0/1
switchport mode trunk
switchport trunk allowed vlan 200-203
全てのVMが同一ESXiホスト上にある場合(ラボ/テスト環境)、このステップは省略できます。トラフィックが物理スイッチに出ないためです。
検証とモニタリング
pingでIsolationをテストする
設定完了後、以下のシナリオに従って各VMから確認します。
# VM-WebServer-KhachA から(Isolated, IP: 192.168.1.10)
ping 192.168.1.1 # PromiscuousゲートウェイへのPing → 成功するはず
ping 192.168.1.11 # 同じIsolated内のKhachBへのPing → 失敗するはず
ping 192.168.1.20 # Community VMへのPing → 失敗するはず
# VM-Dev-TeamA-01 から(Community 202, IP: 192.168.1.20)
ping 192.168.1.1 # ゲートウェイへのPing → 成功するはず
ping 192.168.1.21 # 同じCommunity 202内のTeamA-02へのPing → 成功するはず
ping 192.168.1.30 # TeamBのCommunity 203へのPing → 失敗するはず
ping 192.168.1.10 # IsolatedのKhachAへのPing → 失敗するはず
PowerCLIで設定を確認する
# VDSのPVLAN設定を確認
$vds = Get-VDSwitch -Name "DSwitch-Production"
$vds.ExtensionData.Config.PrivatVlanConfig |
Format-Table PrimaryVlanId, SecondaryVlanId, PrivateVlanType
# PVLANを使用しているPort Groupを一覧表示
Get-VDPortgroup | Where-Object { $_.VlanConfiguration -match "Private" } |
Select-Object Name, VlanConfiguration
NetFlow/IPFIXでモニタリングする
VDS上でIPFIXを有効にして、トラフィックパターンの追跡と異常検知を行います。
# VDSでIPFIXを有効にする
$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)
実践比較:VMware vs Proxmox のPVLAN
個人のラボ環境でVMwareからProxmoxに移行した際、両プラットフォームのネットワーク分離の扱い方に興味深い違いがいくつかあることに気づきました。
ProxmoxはLinux bridgeを使用しており、VLAN-aware bridgeとebtablesルールを組み合わせることで同様の結果を得ることはできますが、統合GUIはありません。Proxmoxで「本物の」PVLANを実現するには、スクリプトを自作するかOpen vSwitchを使う必要があり、vCenter上での数クリックと比べてかなり複雑です。
VMware PVLANで特に評価しているのは一貫性です。VDSレベルで一度設定するだけで、クラスター内の全ホストに即座に適用されます。Proxmoxの場合は、各ノードで個別に設定するか、自動化スクリプトを書いて同期を保つ必要があります。
ただし、Enterprise Plusライセンスは大きなハードルです。特に個人ラボや小規模スタートアップにとっては。高いSLAが不要な環境では、Proxmox + OVSの方がコスト面で合理的な選択肢と言えるでしょう。
よくあるエラーとトラブルシューティング
- 設定後にVMがゲートウェイにpingできない:VM-GatewayがIsolatedではなくPromiscuous Port Groupに配置されているか確認してください。
- Community VM同士が見えない:両方が同じSecondary VLAN IDを使用していることを確認してください。例えば、一方が202でもう一方が203ではなく、両方とも202である必要があります。
- 物理スイッチがトラフィックをフォワードしない:uplinkがaccessポートではなくtrunkの場合、スイッチ側でPVLANの設定が必要です。
- vCenterでPrivate VLANメニューが表示されない:Standard SwitchおよびStandardライセンスではこの機能は利用できません。
- クラスターに新しいホストを追加した後、PVLAN設定が消える:PVLANマッピングはVDSに保存されるため自動的に適用されますが、新しいホストのuplinkは改めて確認が必要です。

