Proxmoxで管理用とVM用のVLANを分離する


# はじめに
Proxmox VEをはじめとする仮想化基盤では、管理ネットワークとVMネットワークを同一セグメントに配置すると、セキュリティリスクやトラフィック干渉といった問題が発生しやすくなります。

本記事では、複数の物理ネットワークポートを束ねたBond構成とLinuxブリッジ＋VLANを組み合わせて、管理ネットワークとVMネットワークを分離する方法を解説します。

- セキュリティの向上：管理用インターフェースを外部から遮断し、不正アクセスを防止
- トラフィックの分離：VMの通信がWeb UIやモニタリングに影響しないように分離
- 通信の冗長性を確保：物理ポートやLANケーブルの障害時でも接続を維持

# 構成
## 構成の概要
今回用いたマシンはMinisforum MS-01です。
以下のように物理ネットワークポートを4つ備えています。
- 10Gbps SPF+ x2ポート
- 2.5Gbps RJ45 ×2ポート

本構成では、2.5GbEポートをProxmox管理用に固定し、10GbEポートにはTrunk設定を適用して、VMが任意のVLANタグを指定できるようにします。
```scss
[enp88s0]──┐
            ├─bond0 (2.5GbE)
[enp91s0]──┘

[bond0]──vmbr0 (Proxmox管理用)

[enp3s0f0np0]──┐
                ├─bond1 (10GbE)
[enp3s0f1np1]──┘

[bond1]──vmbr1  
   `─ VLAN-awareブリッジとし、各VMで個別にVLANタグを指定可能（例: VLAN 240など）
```

VLANを分けておくことで、ネットワーク機器で帯域制御や通信可否を制御したり、UTMで必要なVLANのみにセキュリティ対策を行うといった管理が容易になります。

## ネットワークスイッチの設定（Dell N4032の例）
以下の設定を行います。
- 管理用とVM用の通信を分離するため、それぞれの用途に対応したVLANを作成する。
- 複数のポートを束ねてリンクアグリゲーションを設定する。

1. 管理用VLAN（240）とVM用VLAN（245）を作成します。
```
vlan 240
  name VLAN240
exit

vlan 245
  name VLAN245
exit
```

2. リンクアグリゲーションの設定を行い、そこに各ポートを紐づけています。
複数のVLANを通過できるよう、ポートをTrunkモードに設定します。
2.5GbEポートではVLANタグなしの通信はVLAN:240に割り当てます（PVID）。

```
# Minisforum MS-01の2.5GbEポートとのLACP（IEEE 802.3ad に準拠したリンクアグリゲーション）
# 「port-channel X」はグループ番号のようなもので重複しない任意の数字で問題ありません。
# 確認方法は「show interfaces port-channel」
interface port-channel 8
  switchport mode trunk
  switchport trunk allowed vlan all
  switchport trunk native vlan 240

interface Tengigabitethernet1/0/17
  channel-group 8 mode active

interface Tengigabitethernet2/0/17
  channel-group 8 mode active

# Minisforum MS-01の10GbEポートとのLACP設定
interface port-channel 9
  switchport mode trunk
  switchport trunk allowed vlan all
  
interface Tengigabitethernet1/0/18
  channel-group 9 mode active

interface Tengigabitethernet2/0/18
  channel-group 9 mode active

```

## Proxmox側のインターフェース設定
ネットワーク設定の誤りでWeb UIやSSHへの接続が失われる可能性があるため、`at`コマンドでの自動復旧手順を活用して安全に設定を変更します。
https://zenn.dev/tsukimi_site/articles/homelab_tips_at_command

### 設定手順
1. 既存設定をバックアップする。
```bash:ネットワーク設定ファイルをバックアップ
cp /etc/network/interfaces /etc/network/interfaces.bak
```

2. 5分後に自動で設定を戻すジョブを登録します。
```bash:復旧用コマンドを予約
at now + 5 minutes
> （対話モードになる）
> cp /etc/network/interfaces.bak /etc/network/interfaces
> systemctl restart networking
> (Ctrl + dで完了)
```

3. 2つの2.5GbEポートをbond0化にまとめ、vmbr0（Proxmoxが利用する）と紐づけます。
```bash:ネットワーク設定をすべて書き換え
cat << 'EOS' | tee /etc/network/interfaces
auto lo
iface lo inet loopback

iface enp88s0 inet manual
iface enp91s0 inet manual

# 2.5GbEポートのLACP bond
auto bond0
  iface bond0 inet manual
    bond-slaves enp88s0 enp91s0
    bond-miimon 100
    bond-mode 802.3ad
    bond-xmit-hash-policy layer3+4
    bond-lacp-rate 1

auto vmbr0
iface vmbr0 inet static
    address 10.2.200.30/24
    gateway 10.2.200.1
    bridge-ports bond0
    bridge-stp off
    bridge-fd 0

# 10GbE用のポートは後で設定するので一旦放置
iface enp3s0f0np0 inet manual

iface enp3s0f1np1 inet manual

iface wlp92s0 inet manual

source /etc/network/interfaces.d/*

EOS
```

4. ネットワーク設定を反映させます。
```bash
# ネットワーク管理サービスを再起動
systemctl restart networking
```

5. Proxmoxの管理画面へアクセスできるか確認します。

6. 自動復旧ジョブは不要なのでキャンセルします。
```bash:自動復旧ジョブをキャンセル
# ジョブ一覧を確認
atq

# 自動復旧ジョブをキャンセル
atrm <ジョブID>
```

7. 2つの10GbEポートをbond0化にまとめ、vmbr1（VM用）と紐づけます。
`bridge-vlan-aware yes` 以降の行が2.5GbEポートの設定との相違で、VLANタグ付き通信を可能にするものです。

```bash:10GbE関連の設定を追記
cat << 'EOS' | tee -a /etc/network/interfaces
# 10GbEポートのLACP bond
auto bond1
iface bond1 inet manual
    bond-slaves enp3s0f0np0 enp3s0f1np1
    bond-miimon 100
    bond-mode 802.3ad
    bond-xmit-hash-policy layer3+4
    bond-lacp-rate 1

# VLAN-aware ブリッジ（1-239,241-255 を tagged、240を untagged(PVID)）
# bridge-vids は vmbr ブリッジ全体として許可するVLANの範囲を定義
# post-up内の「bridge vlan add」は特定のVLANに対してuntagged通信を割り当てる設定（PVID）
# 両者を併用することで、細かなVLAN制御が可能になります
auto vmbr1
iface vmbr1 inet manual
    bridge-ports bond1
    bridge-stp off
    bridge-fd 0
    bridge-vlan-aware yes
    bridge-vids 1-239,241-255       # ブリッジが許可するVLAN範囲
    post-up   /usr/sbin/bridge vlan add vid 240 dev bond1 pvid untagged # VLAN 240はuntagとして扱う
    pre-down  /usr/sbin/bridge vlan del vid 240 dev bond1

EOS
```

8. ネットワーク設定を反映させます。
```bash
# ネットワーク管理サービスを再起動
systemctl restart networking
```

### 設定後の状態
Proxmoxの管理画面で、データセンター → 対象ノード → システム → ネットワークと遷移すると、CLIで実施した各bondに紐づくネットワークインターフェースや、Linuxブリッジ(vmbr0/vmbr1)に各bond（bond0/bond1）が紐づいていることを閲覧できます。

![Proxmoxのネットワーク設定](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4077625/340ee2c8-35ca-4caa-8163-1b1ca2a6adb9.png)

この画面でも設定変更は可能ですが、前述のようにCLIでは `at` コマンドを用いた自動復旧を利用できます。


# VM作成時のネットワーク設定
ProxmoxのVM作成時の「ネットワーク」タブでは、VMのネットワークを適切なVLANに所属させることで、セキュリティや帯域制御の柔軟性が向上します。

以下のように設定しましょう。
| 項目         | 設定値          | 補足                                    |
| ------------ | --------------- | --------------------------------------- |
| **Bridge**   | `vmbr1`         | 先ほど作成した10GbEのVLAN-awareブリッジ |
| **VLAN tag** | `任意のVLAN ID` | そのVMに利用させるVLAN ID               |


![VMのネットワーク設定](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4077625/e5dd72f0-5731-409a-af94-25db3d008de7.png)


# 動作確認
設定が正しく反映されているか、bondインターフェースやVLANの動作状況をコマンドで確認していきます。

## 管理用ネットワーク：2.5GbEポート
Bondingの基本設定を確認
```bash
grep -E 'Bonding Mode|Transmit Hash Policy' /proc/net/bonding/bond0
```

```
Bonding Mode: IEEE 802.3ad Dynamic link aggregation
Transmit Hash Policy: layer3+4 (1)
```
- `Bonding Mode: IEEE 802.3ad` はLACP（Link Aggregation Control Protocol）による動的リンクアグリゲーションが有効になっていることを意味します。これにより物理NIC2本を束ねて一つの論理NICとして扱われるので帯域幅の向上と冗長化が実現されます。

- `Transmit Hash Policy: layer3+4` は送信先のIPアドレスとポート番号に基づいてどの物理リンクを使うか決定するモードです。

:::note
Tips：`bond-xmit-hash-policy` の選び方
利用シーンに応じて以下のように使い分けが可能です。

- L2+L3（またはL3）：ファイルサーバー間の大きなデータ転送（少数の接続）
- L3+L4：Webサーバや多数のクライアントからの接続がある場合
:::

---
bondインターフェースに紐づく物理インターフェースの数やリンク状態
```bash
grep -E 'MII Status|Number of ports|port state' /proc/net/bonding/bond0
```

```
MII Status: up
        Number of ports: 2
MII Status: up
    port state: 63
    port state: 61
MII Status: up
    port state: 63
    port state: 61
```
- `MII Status: up` はリンク状態が正常なことを示します。downになっている場合はLANケーブルの抜けやネットワークスイッチ側の設定不備が考えられます。

- `Number of ports: 2` はbond0に2本のネットワークインターフェースが紐づいていることを意味します。

- `port state` はそのポートがLACPリンクアグリゲーションの中でどのような状態かを示すビットフラグです。
    `port state: 63` は「LACP有効」「同期済み」「集約可能」「通信可能」など全ての条件を満たしており、正常に自身（Actor）がLACPを維持していると判断できます。

    `port state: 61`はビット `2（Active）` が立っていないためPartnerの状態と解釈できます。つまり、自分側ではなくスイッチ側が正常にLACPを維持しているので、正常な状態と判断して問題ありません。

---
紐づいているネットワークインターフェースの名称・速度・デュプレックス
```bash
grep -E 'Slave Interface|Speed|Duplex' /proc/net/bonding/bond0
```

```
Slave Interface: enp88s0
Speed: 1000 Mbps
Duplex: full
Slave Interface: enp91s0
Speed: 1000 Mbps
Duplex: full
```

bondに含まれる物理インターフェース毎のリンク速度と通信方式（全二重か半二重か）が示されています。

`Speed: 1000 Mbps` は1Gbpsの速度でリンク確立していることを示し、`Duplex: full` は「全二重通信」（同時送受信可能）であることを意味します。ここが `half` や `Unknown` の場合はスイッチ設定やケーブルの再確認が必要です。1000 MbpsになっているのはMinisforum MS-01側は2.5GbEですが、Dell N4032が10GbEもしくは1GbEにしか対応していないためです。

## 疎通確認：VLAN設定が正しく行われているか
同一VLAN内で通信ができるかどうかや、ルーティング・ファイアウォールで意図した通信制御になっているか確認しましょう。

## 冗長性の確認：LANケーブルを抜いても切断されないか
ProxmoxやVMへSSHしておき、各bondで対になっている一方のネットワークインターフェースのLANケーブルを抜いても接続が維持されることを確認します。

### 確認結果のまとめ
ここまでの出力結果から、2.5GbEポートのbond0はLACPによるリンクアグリゲーションが正常に機能していることが確認できました。


## VM用ネットワーク：10GbEポート
同様に10GbEポートのbond1についても確認を行うと、全体が期待通りに動作しているかを総合的に判断できます。


# まとめ
本記事では、Proxmox VEにおける管理ネットワークとVMネットワークをVLANで分離する構成を解説し安全性と柔軟性を両立させる手法を紹介しました。特に以下の3点が重要なポイントです。

- 複数の物理NICをLACPで冗長化し信頼性を確保
- VLAN-awareなLinuxブリッジを使ってVMごとのネットワーク分離を実現
- 設定ミス時も自動復旧できるよう at コマンドを併用し、安全な構成変更が可能

ProxmoxはGUIでのネットワーク設定も可能ですが、本記事のようにCLIでの設定に慣れることで、より柔軟かつ高度な構成が組めるようになります。今後はファイアウォールルールや外部DHCP・DNS連携、VLAN間ルーティングなどと組み合わせて、より本格的な仮想化環境を目指していくのも良いでしょう。