え！！ProxmoxのWebUIだけでEVPN-VXLAN構築を？出来らあっ！(実践編)

## 概要

先日リリースされたProxmox VE 8.1にて長らく実験的な機能と位置付けられてきたSDNが正式サポートされました。
これを機に自宅サーバーとスイッチの間でBGPを張ってEVPN-VXLANを導入しましたので設定手順を紹介します。

- [Proxmox Virtual Environment 8.1 with Software-Defined Network and Secure Boot](https://www.proxmox.com/en/about/press-releases/proxmox-virtual-environment-8-1)

本来であれば理論編から実践編へと移るのが筋とは思いつつ、筆者もEVPN-VXLANについては勉強中の身ですのでひとまず実践編として公開することをご容赦ください。

## モチベ

EVPN-VXLANはVPNという単語が示す通り、主にデータセンターネットワークなどで複数拠点のサーバーが同じL2ネットワークに参加するための技術です。よって単一拠点かつごく小規模なネットワークである個人宅に導入することによるメリットは非常に薄いのですが、強いて言えば次の利点が挙げられると思います。

- MLAGなどのL2技術を使わない冗長化
    - 特定のスイッチのトラフィックの迂回操作が可能
- 生ハム原木理論
    - 「まあ家に帰ればEVPN-VXLANあるしな」

正直個人宅であれば生ハム原木が全てだと思います。

## 環境

![topology.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/156410/c1c271bc-497d-2154-13bd-e627787935c6.png)

今回想定する環境はProxmox VE 8.1をインストールしたサーバー3台とBGPを解釈できるL3スイッチ2台です。サーバー2台とスイッチ1台あれば同様の構築はできますが、導入意義が僅かにでも出てくるのはこのくらいの規模感からかと思います。
実際には管理用のL2ネットワークも存在していますが省略します。

## 事前準備

まずは公式ドキュメントなどに沿ってProxmoxノード3台でクラスタを組みます。8.1を新規インストールしていればDatacenterの下にSDNの操作パネルが出現しているはずです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/156410/60bab137-aca7-4fee-233b-f0dc58a82d58.png)

これまでのProxmoxでVMのネットワークを分けようとする時、一般的にはProxmoxの管轄外のネットワーク機器側での設定変更が必要だったかと思います。これからはそういったネットワークの新規作成はこのSDNパネルである程度完結できるようになります。

- [Installation - Proxmox Virtual Environment](https://www.proxmox.com/en/proxmox-virtual-environment/get-started)
- [Cluster Manager](https://pve.proxmox.com/wiki/Cluster_Manager)
- [Software-Defined Network](https://pve.proxmox.com/wiki/Software-Defined_Network)

### FRRouting

EVPNの構築にはFRRoutingを利用していますが、デフォルトでは必要なパッケージがインストールされていないため全てのノードで追加しておいてください。

> The Proxmox VE SDN stack uses the FRRouting project for advanced setups. This is currently opt-in.

- [Software-Defined Network - FRRouting](https://pve.proxmox.com/wiki/Software-Defined_Network#pvesdn_install_frrouting)

```shell
apt update 
apt install frr-pythontools
```

## Networkの設定

まずはProxmoxノードのネットワーク設定を済ませます。
環境で示した通り各ノードにはNICが2つ搭載されていると想定します。後ほど各ノードは対向の各スイッチとBGPピアを張るのでスイッチと疎通できる状態にします。

L3スイッチについてはBGPさえ解釈できればなんでも良いですが、著者はMikrotikのCRS309を使っているのでMikrotikの都合に合わせた設計を紹介します。
(MikrotikにBGP Unnumbered? ないんだなそれが)

まずsw1とsw2に接続しているNICをそれぞれnic1、nic2とします。ここにアドレスを設定しても良いのですが、実際にはL2の通信をしたい場面(ストレージ用や管理用とか)もあるかと思うのでBGP用にVLANインターフェースを用意します。今回はそれぞれ701と702とします。
VLANインターフェースのアドレスはそれぞれ192.168.16.ノード番号/28、192.168.17.ノード番号/28とします。
次に各Proxmoxノードを示すアドレスを/32で設定します。loにつけるのが一般的かと思いますがloのアドレスはWebUIで編集できないのでNICを持たないLinux Bridgeをlo替わりにします。vmbr99とでもしておきましょう。アドレスも10.16.0.ノード番号/32とかで。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/156410/0cbaf07e-4ff7-5d54-e3ca-864e0e0e3997.png)

スイッチ側のアドレスアサインはvlan701、702に対応するものを設定しつつ、loはなくてもいいです。
最終的なアドレスアサインは下記の通りです。

- hv1
    - nic1.701
        - 192.168.16.1/28
    - nic2.702
        - 192.168.17.1/28
    - vmbr99
        - 10.16.0.1/32
- hv2
    - nic1.701
        - 192.168.16.2/28
    - nic2.702
        - 192.168.17.2/28
    - vmbr99
        - 10.16.0.2/32
- hv3
    - nic1.701
        - 192.168.16.3/28
    - nic2.702
        - 192.168.17.3/28
    - vmbr99
        - 10.16.0.3/32
- sw1
    - bridge.701
        - 192.168.16.14/28
- sw2
    - bridge.702
        - 192.168.17.14/28

ここまで済んだら各ノードから192.168.16.14と192.168.17.14にpingが通るか確認します。問題なければ次に進みましょう

## Firewallの設定

今のうちに忘れずにBGP用の通信を許可しておきましょう。筆者はこれで1晩溶かしました。
Datacenter -> FirewallでAliasに192.168.16.0/28、192.168.17.0/28、10.16.0.0/24あたりを設定し、IPSetで纏め、これらからの通信を全てACCEPTしておきます。

## BGPの設定(スイッチ側)

お持ちのスイッチに合わせてよしなに設定してください。

今回の構成ではスイッチはEVPNのPEルーターとしては動作しないのでProxmoxノードが互いのvmbr99のアドレスの経路を交換できるよう一番シンプルなBGP設定を入れれば大丈夫です。スイッチが広報する経路もありません。そもそもBGP NEXT_HOPをスイッチで書き換えなければL3のルーティングができる必要もありません。

サンプルとしてMikrotikのRouterOS向けのconfig例を一部抜粋します。CiscoとかJuniperとか持ってないんだわ……

```text:sw1
/interface vlan
add interface=bridge name=bridge.vlan701 vlan-id=701
/routing bgp template
add as=64999 disabled=no multihop=no name=downlink router-id=10.16.0.101 routing-table=main
/interface bridge vlan
add bridge=bridge tagged=bridge,ether1 vlan-ids=701
/ip address
add address=192.168.16.14/28 interface=bridge.vlan701 network=192.168.16.0
/routing bgp connection
add as=64999 disabled=no local.role=ebgp multihop=no name=downlink1 remote.address=192.168.16.1 router-id=10.16.0.101 routing-table=main templates=downlink
add as=64999 disabled=no local.role=ebgp multihop=no name=downlink2 remote.address=192.168.16.2 router-id=10.16.0.101 routing-table=main templates=downlink
add as=64999 disabled=no local.role=ebgp multihop=no name=downlink3 remote.address=192.168.16.3 router-id=10.16.0.101 routing-table=main templates=downlink
```

```text:sw2
/interface vlan
add interface=bridge name=bridge.vlan702 vlan-id=702
/routing bgp template
add as=64998 disabled=no multihop=no name=downlink router-id=10.16.0.102 routing-table=main
/interface bridge vlan
add bridge=bridge tagged=bridge,ether1 vlan-ids=702
/ip address
add address=192.168.17.14/28 interface=bridge.vlan702 network=192.168.17.0
/routing bgp connection
add as=64998 disabled=no local.role=ebgp multihop=no name=downlink1 remote.address=192.168.17.1 router-id=10.16.0.101 routing-table=main templates=downlink
add as=64998 disabled=no local.role=ebgp multihop=no name=downlink2 remote.address=192.168.17.2 router-id=10.16.0.101 routing-table=main templates=downlink
add as=64998 disabled=no local.role=ebgp multihop=no name=downlink3 remote.address=192.168.17.3 router-id=10.16.0.101 routing-table=main templates=downlink
```

## SDNの設定

### BGP Controller

いよいよSDNの設定に入ります。
今回の構成ではアンダーレイにeBGPを用いるためBGP Controllerを設定していきます。
Datacenter -> SDN -> Optionsを開き、BGP Controllerをノードの分だけ設定します。

- ASNは6500ノード番号
- Peersは192.168.16.14,192.168.17.14
- EBGPにチェック
- Loopback Interfaceはvmbr99
- bgp-multipath-as-path-relaxにチェック

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/156410/db4a1178-2dd8-1350-43be-afd53b9194fd.png)


### EVPN Controller

EVPN-VXLANのVTEPとして動作するノードを指定します。今回はProxmoxノード3台でフルメッシュにします。

- IDは適当な名前
- ASNは65000
- Peersは10.16.0.1,10.16.0.2,10.16.0.3

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/156410/38ecd61e-42af-f364-e818-d051381135b3.png)


ここで一度ApplyをしてBGPのピアを無事張れているか確認しておきましょう。正しく設定できていれば今の時点で各ノードからお互いのvmbr99のアドレス宛にpingが通るはずです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/156410/f2e45680-be53-924e-93b7-8544038b1b81.png)


### EVPN Zone

EVPN-VXLANの設定をします。

- IDは適当な名前
- Controllerは先ほど作成したEVPN Controllerを指定
- VRF-VXLAN Tagはお好みで、ここで設定したVXLAN IDはVNetsでは使えません
- Exit Nodesはhv1としておきます
- Primary Exit Nodeもhv1としておきます
- MTUはvmbr99のMTUから50か54を引いた値

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/156410/2c426061-5194-cbb4-7ecd-6c1eda775f6e.png)


MTUにどちらを採用するかですが、VXLANで更にタグVLANを使うかもしれない場合は54を引くべきです。とはいえVXLANにVLANを流したい場面はあまり無いはずなので50を引いておくのが一般的かと思います。

### VNets

Zoneを作成したことでネットワークを好きなように作る準備ができました。
今回はこの後の確認で使うために2つのVNetsを作成しましょう。
vnetは8文字までという制限があるのでそこを念頭に名付けするとよいです。

- vnet1000
    - ZoneはEVPN Zone名
    - Tagは11000
    - Subnets
        - 10.0.1.0/24
            - Gatewayは10.0.1.1
            - SNATにチェック
- vnet2000
    - ZoneはEVPN Zone名
    - Tagは12000
    - Subnets
        - 10.0.2.0/24
            - Gatewayは10.0.2.1
            - SNATにチェック

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/156410/31e09478-4fd8-bbc9-be35-75dd3abb0e32.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/156410/18f427bf-ee59-542d-9c3a-8166273e6b45.png)

ここまで済ませたらApplyしましょう。

## 動作確認

お疲れ様です。ここまで正しく設定できていれば既にあなたのProxmoxクラスタではEVPN-VXLANを利用したL2ネットワークが2つ作成され、vmで利用可能になっています。
早速適当なvmを2つ作成し、相互通信ができることを確認してみましょう。

通常の手順に従いLXC Containerを作ります。するとNetwork設定のBridgeに先ほど作成したvnet1000とvnet2000が出現していることが確認できると思います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/156410/4c87ab83-4092-7536-fc15-901f53153d59.png)

今回は2つのvmを作成します

- vnet1000-test
    - Bridge: vnet1000
    - IPv4/CIDR: 10.0.1.10/24
    - Gateway (IPv4): 10.0.1.1
- vnet2000-test
    - Bridge: vnet2000
    - IPv4/CIDR: 10.0.2.10/24
    - Gateway (IPv4): 10.0.2.1

起動してvnet1000-testから10.0.2.10にpingを打ってみてください。異なるサブネットに所属するvmですがProxmoxで作成したVnet間はSubnets設定に従って各ノードに自動でルーティング設定が入るため問題なく疎通します。当然別々のノードに存在していても問題ありません。
更にSNATも有効にしているためSubnets設定にないアドレス宛の通信はPrimary Exit Nodeで自動的にSNATされProxmoxノードのdefault routeに従い転送されます。外部のネットワークに対するpingも問題なく通るはずです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/156410/17186c95-9b7d-ab65-7364-338cffe868ff.png)

iperf3も10G環境程度であればワイヤーレートが出ます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/156410/c74cdd41-a5b1-393d-6db3-ff33317b6cee.png)

## 総括

Proxmox VEのSDN機能を利用することで非常に手軽にEVPN-VXLANを導入できるのが確認できたかと思います。SDN機能自体EVPN-VXLANに限らず様々な構成が設定でき、vmのアドレスアサインを自動化できたりもするみたいなので色々遊びがいがありそうです。

今回の構築ではアンダーレイは一般的なBGPで構築しているためBGPオペレーションがそのまま適用できます。一方でその上に構築したEVPNはProxmoxノード間でフルメッシュにしているため数百台規模になると不都合が出てくる気がします。その場合はSpineスイッチをPEルーターとしてEVPNを作ったりする必要が出てきたりする(おそらくfrr.confを直接編集しないといけない)でしょうが、少なくとも個人宅には置けないしそもそも買えないのでその辺りの検証は他の方にお任せします……
(MikrotikにECMP? ないんだなそれが)

### 謝辞

https://x.com/harusoin51/status/1733917402839331151?s=20

この記事を書くにあたりXの反応は大変励みになりました。ありがとうございます。

それではまた理論編でお会いしましょう。来年中に出せるといいな……