あの設定、毎回何となく選んでいませんか?
Proxmoxで新しいVMを作成するとき、ネットワークの設定画面でこんな項目が出てきます。
Bridge: vmbr0
特に変える理由も思い浮かばないので、そのままNextを押す。
ほとんどの人がそうしています。筆者もそうしていました。
でも、この「そのまま」が積み重なると、気づかないうちに危険な構成が出来上がっています。
vmbr0って何をしているのか
vmbr0はProxmoxがインストール時に自動で作成するLinux Bridgeです。
物理的なスイッチに例えると分かりやすいです。スイッチにケーブルを挿すと同じネットワークに繋がるように、vmbr0に接続したVMは全て同じネットワークに繋がります。
vmbr0(スイッチのイメージ)
├── VM-A(Webサーバー)
├── VM-B(データベース)
├── VM-C(開発環境)
└── Proxmoxホスト自身の管理画面(8006番ポート)
ここで少し考えてみてください。
全部同じスイッチに繋がっているということは、全部が同じネットワークにいるということです。
「同じネットワーク」だと何が起きるか
普段使いでは何も問題ありません。VMからVMへのアクセスも、ホストの管理画面へのアクセスも、普通に動きます。
問題が起きるのは、この中の1台をインターネットに公開したときです。
例えばVM-A(Webサーバー)を外部に公開したとします。そのWebアプリに脆弱性があり、何者かにそのVMの中に入られてしまったとします。
入られた後、攻撃者は同じネットワーク上にいる他のホストを探し始めます。例えばLinuxではip nコマンドで簡単に表示できます。
VM-Aの中から見えるもの:
├── VM-B(データベース)→ 見える
├── VM-C(開発環境) → 見える
└── Proxmox管理画面 → 見える ← ここが特にまずい
Webサーバーを1台公開しただけのつもりが、Proxmox自体の管理画面まで同じネットワークに晒されているわけです。
Proxmoxの管理画面を乗っ取られると、その上で動いている全てのVMを操作できます。つまり影響範囲は「そのWebサーバー1台」では済まなくなります。
それこそランサムウェアで攻撃されたら、全VM人質対象となることでしょう。このような場合、被害範囲の局所化は非常に重要になります。
上記例ではProxmoxホスト上のVMだけ記載していますが、実際にはvmbr0と同じネットワークに居る全ての他の機器も丸見えとなります。
「じゃあVLANで分ければいい?」
「VLANで分ければいいのでは」という話になりがちですが、スイッチの設定とかトランクポートとか、急に難しい話になります。「そんな難しいのは嫌だ、もっと簡単に分けられないの?」という人、安心してください。あります。
「じゃあ脆弱性試験しておけばいい?」
商用Webサイトでは当然必要です。ただ、開発環境で毎回そこまで実施するのは現実的ではありません。
Proxmoxに最初から入っている解決策
実はProxmox 8.x以降には、この問題を解決する機能が標準搭載されています。**SDN(Software Defined Network)**です。
SDNのVXLAN Zoneを使うと、vmbr0の隣に独立したL2セグメント(VNet)を追加できます。
シングルノード運用の場合はSimple Zoneでも、別のLinux Bridgeでも構いません。
vnetpub(公開VM専用)
└── VM-A(Webサーバー・外部公開)
vnetdev(開発・内部用)
├── VM-B(データベース)
└── VM-C(開発環境)
vmbr0(管理用)
└── Proxmoxホスト管理画面
これでVM-Aが侵害されても、適切にVNet間通信を遮断しておけば、vnetpubの外へ横展開しにくくなります。データベースも、開発環境も、Proxmoxの管理画面も、別のネットワークにいるので探索できません。
重要なポイント
- 追加のスイッチや機器は不要。Proxmoxホスト1台で完結する
- 一度VNetを作っておけば、VM作成時にBridgeの代わりにVNetを選ぶだけ。設定の手間はほぼ変わらない
- VM内からネットワーク設定を変更しても隔離は崩れない。ホスト側のカーネルレベルで維持される
- クラスター構成でも、VXLAN ZoneはノードをまたいでVNetを延伸できる
- Bridge間またはVNet間の通信は、Proxmox Firewallで遮断ルールを設定しておく必要がある
既にvmbr0にVMを並べてしまっている場合は?
大丈夫です。VNetは既存のvmbr0構成の横に追加していく形で作れます。既存VMを止めずに、新しく作るVMから順番にVNetに移していけばOKです。今からでも遅くはありません。
既存VMも、Bridge設定をVNetに変更したうえで一度停止→起動すれば移行できます。
まとめ
| 項目 | vmbr0フラット | SDN(VXLAN Zone) |
|---|---|---|
| VM間の通信 | デフォルトで可能 | VNet間はホストFWで遮断 |
| 管理プレーンの分離 | されていない | vmbr0を管理専用に分離可能 |
| 1台侵害されたときの影響範囲 | 全VM + 管理画面 | 該当VNetのみ |
| 追加ネットワーク機器 | 不要 | 不要 |
| VM作成時の操作 | Bridgeをvmbr0のまま作成 | 事前に作成したVNetを選ぶ |
vmbr0のままでも動きます。でも「動く」と「安全に動かせる」は別の話です。
次にVMを作るとき、Bridge欄をもう一度見てみてください。
補足:考え方はシンプルでも、実際の設計は慎重に
ここまでの説明では簡単に見えますが、実際に安全な分離環境を作るには、VNetの設計、VXLAN GWの設計、IPアドレス設計、Firewallルール、管理プレーンへの到達制御、VPN経路、戻り経路などを慎重に確認する必要があります。
特に複数プロジェクト・複数メンバー・クラスタ構成では、「本当に意図した範囲だけ通信できるか」の検証も含めて、かなり神経を使う作業になります。
参考:この構成を自動化するツール
VNet・ファイアウォールルール・プロジェクト専用VPNをまとめて自動構築するツールとして MSL Setup を公開しています。
- プロジェクト数分のVNet・ファイアウォールルールを自動生成
- プロジェクトごとのPritunl VPNサーバーを自動プロビジョニング
- スイッチなどの追加ネットワーク機器は不要
- 約20分でマルチテナント対応のProxmox環境を構築可能
👉 zelogx.com
👉 GitHub(無料版)
👉 Proxmox マルチテナント構成の詳細手順
👉 まず試してみたい方はこちら