nmcli で Open vSwitch ブリッジを作成する

nmcli + Open vSwitch で、左図のようなデフォルトの状態から、右図の目標構成にあるようなブリッジを作成する。

![ovs.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261727/937c5f7d-602c-e2a5-1abe-929aaa7674ca.png)

## 前提条件
OS は Rocky linux 9.2 で検証する。

初期状態の NIC は、次のように 静的 IP アドレスが割り当てられていることを想定している。
```
$ nmcli con show
NAME        UUID                                  TYPE      DEVICE  
enp86s0     f9a60ac6-9ce6-4fc1-8763-f56d5a668995  ethernet  enp86s0 

$ ip a
2: enp86s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether 48:21:0b:57:b2:52 brd ff:ff:ff:ff:ff:ff
    inet 172.16.0.11/24 brd 172.16.0.255 scope global noprefixroute enp86s0
       valid_lft forever preferred_lft forever
```

## Open vSwitch のインストール
Open vSwitch をインストールする：
```
$ sudo dnf list centos-release-openstack-*
Last metadata expiration check: 0:00:53 ago on Thu 28 Dec 2023 08:13:22 AM CET.
Available Packages
centos-release-openstack-antelope.noarch             1-3.el9              extras
centos-release-openstack-bobcat.noarch               1-1.el9              extras
centos-release-openstack-caracal.noarch              1-1.el9              extras
centos-release-openstack-yoga.noarch                 1-3.el9              extras
centos-release-openstack-zed.noarch                  1-3.el9              extras

$ sudo dnf install -y centos-release-openstack-caracal
$ sudo dnf install -y openvswitch
```

NetworkManager plugin をインストールする。
これにより Open vSwitch を`nmcli` から制御できるようになる。

```
$ sudo dnf install -y NetworkManager-ovs
$ sudo systemctl restart NetworkManager
```

Open vSwitch を有効化する：
```
$ sudo systemctl enable openvswitch
```

Open vSwitch デーモンを起動する：
```
$ sudo systemctl start ovs-vswitchd
```

Open vSwitch クライアントが動くことを確認する：
```
$ sudo ovs-vsctl show
c2328d89-6287-45cd-9caf-d65b7a3f3a5d
    ovs_version: "3.2.2"
```

## Open vSwitch のセットアップ

### ブリッジの作成
ブリッジ `ovsbr0` を作成する：
    
```
$ sudo nmcli con add type ovs-bridge con-name ovsbr0 conn.interface ovsbr0
```

### Interface 側の準備
ブリッジに port を作成し、IP interface を接続する：
```
$ sudo nmcli con add type ovs-port con-name port0 conn.interface port0 master ovsbr0
$ sudo nmcli con add type ovs-interface con-name br0 slave-type ovs-port conn.interface br0 master port0 \
  ipv4.method manual \
  ipv4.address 172.16.0.11/24 \
  ipv4.gateway 172.16.0.1 \
  ipv4.dns 172.16.0.1
```

### NIC 側の準備
ブリッジに port を作成し、NIC を接続する：
```
$ sudo nmcli con add type ovs-port con-name port-enp86s0 conn.interface port-enp86s0 master ovsbr0
$ sudo nmcli con mod enp86s0 conn.interface enp86s0 master port-enp86s0
$ sudo nmcli con up enp86s0
```

## 確認

最終的な `ovs-vsctl show` の実行結果は次のようになる：
```
$ sudo ovs-vsctl show
c2328d89-6287-45cd-9caf-d65b7a3f3a5d
    Bridge ovsbr0
        Port port-enp86s
            Interface enp86s0
                type: system
        Port port0
            Interface br0
                type: internal
    ovs_version: "3.2.2"
```

`nmcli con show` の実行結果は次のようになる：
```
$ nmcli con show
NAME         UUID                                  TYPE           DEVICE
...
br0          f7c92f54-b7f4-4cb6-b6ff-65b0e4e7d79c  ovs-interface  br0
port0        6b61101a-96fd-46b5-9799-0e2bf9f050bb  ovs-port       port0
ovsbr0       d10a23f2-8bfc-41c7-b1e8-dc7ed993b1ca  ovs-bridge     ovsbr0
port-enp86s  3a2f4ca0-1706-4149-844d-b48e22b6c14e  ovs-port       port-enp86s
enp86s0      5a6d8b87-f9cd-446d-a241-e61fa7368ee5  ethernet       enp86s0
```

`ip a` の実行結果は次のようになる：
```
$ ip a
...
2: enp86s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq master ovs-system state UP group default qlen 1000
    link/ether 48:21:0b:5d:7b:e7 brd ff:ff:ff:ff:ff:ff
...
4: ovs-system: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
    link/ether 2e:33:88:47:b6:10 brd ff:ff:ff:ff:ff:ff
5: br0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UNKNOWN group default qlen 1000
    link/ether 0a:bb:84:d8:31:39 brd ff:ff:ff:ff:ff:ff
    inet 172.16.0.11/24 brd 172.16.0.255 scope global noprefixroute br0
       valid_lft forever preferred_lft forever
    inet6 fe80::9186:a31:beca:b92f/64 scope link noprefixroute 
       valid_lft forever preferred_lft forever
```

## 参考資料

https://serverfault.com/questions/996180/what-is-the-proper-way-to-setup-open-vswitch-with-networkmanager-in-centos-8

https://www.ovirt.org/develop/release-management/features/network/openvswitch/native-openvswitch.html