Metonymical Deflection

ゆるく日々のコト・たまにITインフラ

Linux nmcliコマンドによるBonding VLAN Bridge Interface設定

LinuxのnmcliコマンドによるBonding、VLAN、Bridge Interfaceの設定方法をまとめました。
KVMやLXCなどで仮想マシンやコンテナを構築する前段階として、ホストOS内で構成されるNWをきちんと理解し、自分のイメージした通りに構築できるようにすることが目的です。

1.構成

1-1.全体構成

f:id:metonymical:20181026155830p:plain

構成図上に(1)~(10)までの番号を割り振りました。
この項番ごとにnmcliコマンドを投入した後の確認方法までを解説していきたいと思います。

また、補足としてbrctlコマンドについての解説も行いたいと思います。
Linuxで「Bridge」や「Bridgeインターフェース」と言った場合、それは「仮想スイッチ」*1を意味します。

しかし、本当にスイッチであるなら

  • どのスイッチポートにどのインターフェースが接続されているのか?
  • 接続したスイッチポートの先にどのMACアドレスが存在しているのか?(arpによってどんなMACアドレスを学習したのか?)

といったことが確認できるハズです。
このため、この辺りの確認方法も併せて解説します。

1-2.全体の流れ ~概要~
  1. 物理+Bridge:(1)(2)
  2. 物理+Bonding:(3)(4)(5)
  3. Bonding+Bridge:(6)(7)
  4. Bonding+VLAN+Bridge:(8)(9)(10)
1-3.全体の流れ ~コマンドのみ~

以下のコマンドを投入していきます。
やりたいことが既に決まっている方は、構成図とコマンドの内容を見るだけでもよいと思います。

1.物理+Bridge
(1)
nmcli connection add type bridge autoconnect yes con-name br1 ifname br1
nmcli connection modify br1 bridge.stp no
nmcli connection modify br1 ipv4.method disabled ipv6.method ignore
nmcli connection up br1
nmcli con show
brctl show
(2)
nmcli connection add type bridge-slave ifname ens36 master br1
nmcli con show
brctl show

2.物理+Bonding
(3)
nmcli connection add type bond con-name bond0 ifname bond0 mode balance-xor
nmcli connection mod bond0 ipv4.method disabled ipv6.method ignore
nmcli con show
(4)
nmcli connection add type bond-slave autoconnect yes ifname ens37 master bond0
nmcli con show
(5)
nmcli connection add type bond-slave autoconnect yes ifname ens38 master bond0
nmcli con show

3.Bonding+Bridge
(6)
nmcli connection add type bridge autoconnect yes con-name br0 ifname br0
nmcli connection modify br0 bridge.stp no
nmcli connection modify br0 ipv4.method disabled ipv6.method ignore
nmcli connection up br0
nmcli con show
brctl show
(7)
nmcli connection modify bond0 connection.master br0 connection.slave-type bridge
nmcli con show
brctl show

4.Bonding+VLAN+Bridge
(8)
nmcli connection add type bridge autoconnect yes con-name br301 ifname br301
nmcli connection modify br301 bridge.stp no
nmcli connection modify br301 ipv4.method disabled ipv6.method ignore
nmcli connection up br301
nmcli con show
brctl show
(9)
nmcli connection add type vlan autoconnect yes con-name bond0.301 ifname bond0.301 dev bond0 id 301
nmcli con show
brctl show
(10)
nmcli connection modify bond0.301 connection.master br301 connection.slave-type bridge
nmcli connection up bond0.301
nmcli con show
brctl show

2.物理+Bridge

物理インターフェースとBridgeインターフェースを1対1でアサインします。
(1)Bridgeインターフェースbr1の作成
(2)ens36をbr1にアサイ

(1)Bridgeインターフェースbr1の作成

投入コマンド
nmcli connection add type bridge autoconnect yes con-name br1 ifname br1
nmcli connection modify br1 bridge.stp no
nmcli connection modify br1 ipv4.method disabled ipv6.method ignore
nmcli connection up br1
nmcli con show
brctl show

出力例
[root@c752 ~]# nmcli connection add type bridge autoconnect yes con-name br1 ifname br1
Connection 'br1' (431ecf74-7476-4009-b13c-d6bb9b286697) successfully added.
[root@c752 ~]# nmcli connection modify br1 bridge.stp no
[root@c752 ~]# nmcli connection modify br1 ipv4.method disabled ipv6.method ignore
[root@c752 ~]# nmcli connection up br1
Connection successfully activated (master waiting for slaves) (D-Bus active path: /org/freedesktop/NetworkManager/ActiveConnection/13)
[root@c752 ~]# nmcli con show
NAME    UUID                                  TYPE      DEVICE
br1     431ecf74-7476-4009-b13c-d6bb9b286697  bridge    br1
ens33   004afe6f-a987-4467-a6e7-8d5d04ec3a33  ethernet  ens33
virbr0  23ade1e4-3822-4bc9-83fd-3504ad9b5efe  bridge    virbr0
[root@c752 ~]# brctl show
bridge name     bridge id               STP enabled     interfaces
br1             8000.000000000000       no
virbr0          8000.525400701951       yes             virbr0-nic
[root@c752 ~]#

br1は作成されましたが、物理インターフェースがbr1にアサインされていない状態です。
この状態だと、仮想マシントラフィックを外部のスイッチへ流すことができません。

(2)ens36をbr1にアサイ

投入コマンド
nmcli connection add type bridge-slave ifname ens36 master br1
nmcli con show
brctl show

出力例
[root@c752 ~]# nmcli connection add type bridge-slave ifname ens36 master br1
Connection 'bridge-slave-ens36' (211c573e-7133-40c3-bba9-c3c19e751417) successfully added.
[root@c752 ~]# nmcli con show
NAME                UUID                                  TYPE      DEVICE
br1                 431ecf74-7476-4009-b13c-d6bb9b286697  bridge    br1
bridge-slave-ens36  211c573e-7133-40c3-bba9-c3c19e751417  ethernet  ens36
ens33               004afe6f-a987-4467-a6e7-8d5d04ec3a33  ethernet  ens33
virbr0              23ade1e4-3822-4bc9-83fd-3504ad9b5efe  bridge    virbr0
[root@c752 ~]# brctl show
bridge name     bridge id               STP enabled     interfaces
br1             8000.000c299755f7       no              ens36
virbr0          8000.525400701951       yes             virbr0-nic
[root@c752 ~]#

nmcli con showの出力にはbridge-slave-ens36が追加され、brctl showの出力にてbr1にens36がアサインされたことが確認できます。*2

3.物理+Bonding

Bondingインターフェースに2つの物理インターフェースをアサインします。
(3)Bondingインターフェースbond0の作成
(4)ens37をBond0にアサイ
(5)ens38をBond0にアサイ

(3)Bondingインターフェースbond0の作成

投入コマンド
nmcli connection add type bond con-name bond0 ifname bond0 mode balance-xor
nmcli connection mod bond0 ipv4.method disabled ipv6.method ignore
nmcli con show

出力例
[root@c752 ~]# nmcli connection add type bond con-name bond0 ifname bond0 mode balance-xor
Connection 'bond0' (25a6c049-251e-464a-87fc-6f25112c712e) successfully added.
[root@c752 ~]# nmcli connection mod bond0 ipv4.method disabled ipv6.method ignore
[root@c752 ~]# nmcli con show
NAME                UUID                                  TYPE      DEVICE
bond0               25a6c049-251e-464a-87fc-6f25112c712e  bond      bond0
br1                 431ecf74-7476-4009-b13c-d6bb9b286697  bridge    br1
bridge-slave-ens36  211c573e-7133-40c3-bba9-c3c19e751417  ethernet  ens36
ens33               004afe6f-a987-4467-a6e7-8d5d04ec3a33  ethernet  ens33
virbr0              23ade1e4-3822-4bc9-83fd-3504ad9b5efe  bridge    virbr0
[root@c752 ~]#

bond0は作成されましたが、物理インターフェースがbond0にアサインされていない状態です。
この状態だと、仮想マシントラフィックを外部のスイッチへ流すことができません。

(4)ens37をBond0にアサイ

投入コマンド
nmcli connection add type bond-slave autoconnect yes ifname ens37 master bond0
nmcli con show

出力例
[root@c752 ~]# nmcli connection add type bond-slave autoconnect yes ifname ens37 master bond0
nmcli con show
Connection 'bond-slave-ens37' (7ca51b00-89fe-4e30-98d0-6588a747b5f1) successfully added.
[root@c752 ~]# nmcli con show
NAME                UUID                                  TYPE      DEVICE
bond-slave-ens37    7ca51b00-89fe-4e30-98d0-6588a747b5f1  ethernet  ens37
bond0               25a6c049-251e-464a-87fc-6f25112c712e  bond      bond0
br1                 431ecf74-7476-4009-b13c-d6bb9b286697  bridge    br1
bridge-slave-ens36  211c573e-7133-40c3-bba9-c3c19e751417  ethernet  ens36
ens33               004afe6f-a987-4467-a6e7-8d5d04ec3a33  ethernet  ens33
virbr0              23ade1e4-3822-4bc9-83fd-3504ad9b5efe  bridge    virbr0
[root@c752 ~]#

nmcli con showの出力にてbond-slave-ens37がアサインされたことが確認できます。

(5)ens38をBond0にアサイ

投入コマンド
nmcli connection add type bond-slave autoconnect yes ifname ens38 master bond0
nmcli con show

出力例
[root@c752 ~]# nmcli connection add type bond-slave autoconnect yes ifname ens38 master bond0
nmcli con show
Connection 'bond-slave-ens38' (dc260d63-0dae-4d63-ba90-66fbb57a4735) successfully added.
[root@c752 ~]# nmcli con show
NAME                UUID                                  TYPE      DEVICE
bond-slave-ens37    7ca51b00-89fe-4e30-98d0-6588a747b5f1  ethernet  ens37
bond-slave-ens38    dc260d63-0dae-4d63-ba90-66fbb57a4735  ethernet  ens38
bond0               25a6c049-251e-464a-87fc-6f25112c712e  bond      bond0
br1                 431ecf74-7476-4009-b13c-d6bb9b286697  bridge    br1
bridge-slave-ens36  211c573e-7133-40c3-bba9-c3c19e751417  ethernet  ens36
ens33               004afe6f-a987-4467-a6e7-8d5d04ec3a33  ethernet  ens33
virbr0              23ade1e4-3822-4bc9-83fd-3504ad9b5efe  bridge    virbr0
[root@c752 ~]#

nmcli con showの出力にてbond-slave-ens38がアサインされたことが確認できます。

4.Bonding+Bridge

BondingインターフェースにBridgeインターフェースをアサインします。
(6)Bridgeインターフェースbr0の作成
(7)Bond0をbr0にアサイ

(6)Bridgeインターフェースbr0の作成

投入コマンド
nmcli connection add type bridge autoconnect yes con-name br0 ifname br0
nmcli connection modify br0 bridge.stp no
nmcli connection modify br0 ipv4.method disabled ipv6.method ignore
nmcli connection up br0
nmcli con show
brctl show

出力例
[root@c752 ~]# nmcli connection add type bridge autoconnect yes con-name br0 ifname br0
Connection 'br0' (7531e688-83cd-4b97-b596-3b3b55ea2cbf) successfully added.
[root@c752 ~]# nmcli connection modify br0 bridge.stp no
[root@c752 ~]# nmcli connection modify br0 ipv4.method disabled ipv6.method ignore
[root@c752 ~]# nmcli connection up br0
Connection successfully activated (master waiting for slaves) (D-Bus active path: /org/freedesktop/NetworkManager/ActiveConnection/19)
[root@c752 ~]# nmcli con show
NAME                UUID                                  TYPE      DEVICE
bond-slave-ens37    7ca51b00-89fe-4e30-98d0-6588a747b5f1  ethernet  ens37
bond-slave-ens38    dc260d63-0dae-4d63-ba90-66fbb57a4735  ethernet  ens38
bond0               25a6c049-251e-464a-87fc-6f25112c712e  bond      bond0
br0                 7531e688-83cd-4b97-b596-3b3b55ea2cbf  bridge    br0
br1                 431ecf74-7476-4009-b13c-d6bb9b286697  bridge    br1
bridge-slave-ens36  211c573e-7133-40c3-bba9-c3c19e751417  ethernet  ens36
ens33               004afe6f-a987-4467-a6e7-8d5d04ec3a33  ethernet  ens33
virbr0              23ade1e4-3822-4bc9-83fd-3504ad9b5efe  bridge    virbr0
[root@c752 ~]# brctl show
bridge name     bridge id               STP enabled     interfaces
br0             8000.000000000000       no
br1             8000.000c299755f7       no              ens36
virbr0          8000.525400701951       yes             virbr0-nic
[root@c752 ~]#

br0は作成されましたが、bond0がbr0にアサインされていない状態です。
この状態だと、仮想マシントラフィックを外部のスイッチへ流すことができません。

(7)Bond0をbr0にアサイ

投入コマンド
nmcli connection modify bond0 connection.master br0 connection.slave-type bridge
nmcli con show
brctl show

出力例
[root@c752 ~]# nmcli connection modify bond0 connection.master br0 connection.slave-type bridge
[root@c752 ~]# nmcli con show
NAME                UUID                                  TYPE      DEVICE
bond-slave-ens37    7ca51b00-89fe-4e30-98d0-6588a747b5f1  ethernet  ens37
bond-slave-ens38    dc260d63-0dae-4d63-ba90-66fbb57a4735  ethernet  ens38
bond0               25a6c049-251e-464a-87fc-6f25112c712e  bond      bond0
br0                 7531e688-83cd-4b97-b596-3b3b55ea2cbf  bridge    br0
br1                 431ecf74-7476-4009-b13c-d6bb9b286697  bridge    br1
bridge-slave-ens36  211c573e-7133-40c3-bba9-c3c19e751417  ethernet  ens36
ens33               004afe6f-a987-4467-a6e7-8d5d04ec3a33  ethernet  ens33
virbr0              23ade1e4-3822-4bc9-83fd-3504ad9b5efe  bridge    virbr0
[root@c752 ~]# brctl show
bridge name     bridge id               STP enabled     interfaces
br0             8000.000000000000       no
br1             8000.000c299755f7       no              ens36
virbr0          8000.525400701951       yes             virbr0-nic
[root@c752 ~]#

nmcli con showの出力に変化はありません。
また、環境により、brctl showの出力にbond0が表示されない場合があります。
このような場合は、ホストOSを一旦rebootしてください。*3

reboot後の出力

[root@c752 ~]# nmcli con show
brctl show
NAME                UUID                                  TYPE      DEVICE
bond-slave-ens37    7ca51b00-89fe-4e30-98d0-6588a747b5f1  ethernet  ens37
bond-slave-ens38    dc260d63-0dae-4d63-ba90-66fbb57a4735  ethernet  ens38
bond0               25a6c049-251e-464a-87fc-6f25112c712e  bond      bond0
br0                 7531e688-83cd-4b97-b596-3b3b55ea2cbf  bridge    br0
br1                 431ecf74-7476-4009-b13c-d6bb9b286697  bridge    br1
bridge-slave-ens36  211c573e-7133-40c3-bba9-c3c19e751417  ethernet  ens36
ens33               004afe6f-a987-4467-a6e7-8d5d04ec3a33  ethernet  ens33
virbr0              0208dbe6-9eb8-4370-bd8b-227165f695db  bridge    virbr0
[root@c752 ~]# brctl show
bridge name     bridge id               STP enabled     interfaces
br0             8000.000c29975501       no              bond0
br1             8000.000c299755f7       no              ens36
virbr0          8000.525400701951       yes             virbr0-nic
[root@c752 ~]#

brctl showの出力にbond0が表示されました。

5.Bonding+VLAN+Bridge

BondingインターフェースにVLAN+Bridgeインターフェースをアサインします。
Bondingは物理が冗長化されており、複数のBridgeをアサインさせることが可能です。
その場合は、VLAN+Bridgeをセットで追加していく構成となります。
(8)Bridgeインターフェースbr301の作成
(9)VLANインターフェースbond0.301の作成+bond0.301をbond0にアサイ
(10)bond0.301をbr301にアサイ

(8)Bridgeインターフェースbr301の作成

投入コマンド
nmcli connection add type bridge autoconnect yes con-name br301 ifname br301
nmcli connection modify br301 bridge.stp no
nmcli connection modify br301 ipv4.method disabled ipv6.method ignore
nmcli connection up br301
nmcli con show
brctl show

出力例
[root@c752 ~]# nmcli connection add type bridge autoconnect yes con-name br301 ifname br301
Connection 'br301' (040c6db1-4e47-4aaa-beec-014bc14f82a6) successfully added.
[root@c752 ~]# nmcli connection modify br301 bridge.stp no
[root@c752 ~]# nmcli connection modify br301 ipv4.method disabled ipv6.method ignore
[root@c752 ~]# nmcli connection up br301
Connection successfully activated (master waiting for slaves) (D-Bus active path: /org/freedesktop/NetworkManager/ActiveConnection/11)
[root@c752 ~]# nmcli con show
NAME                UUID                                  TYPE      DEVICE
bond-slave-ens37    7ca51b00-89fe-4e30-98d0-6588a747b5f1  ethernet  ens37
bond-slave-ens38    dc260d63-0dae-4d63-ba90-66fbb57a4735  ethernet  ens38
bond0               25a6c049-251e-464a-87fc-6f25112c712e  bond      bond0
br0                 7531e688-83cd-4b97-b596-3b3b55ea2cbf  bridge    br0
br1                 431ecf74-7476-4009-b13c-d6bb9b286697  bridge    br1
br301               040c6db1-4e47-4aaa-beec-014bc14f82a6  bridge    br301
bridge-slave-ens36  211c573e-7133-40c3-bba9-c3c19e751417  ethernet  ens36
ens33               004afe6f-a987-4467-a6e7-8d5d04ec3a33  ethernet  ens33
virbr0              0208dbe6-9eb8-4370-bd8b-227165f695db  bridge    virbr0
[root@c752 ~]# brctl show
bridge name     bridge id               STP enabled     interfaces
br0             8000.000c29975501       no              bond0
br1             8000.000c299755f7       no              ens36
br301           8000.000000000000       no
virbr0          8000.525400701951       yes             virbr0-nic
[root@c752 ~]#

br0やbr1と同様です。
br301は作成されましたが、アップリンクとなるbond0.301がアサインされていない状態です。
この状態だと、仮想マシントラフィックを外部のスイッチへ流すことができません。

(9)VLANインターフェースbond0.301の作成+bond0.301をbond0にアサイ

投入コマンド
nmcli connection add type vlan autoconnect yes con-name bond0.301 ifname bond0.301 dev bond0 id 301
nmcli con show
brctl show

出力例
[root@c752 ~]# nmcli connection add type vlan autoconnect yes con-name bond0.301 ifname bond0.301 dev bond0 id 301
Connection 'bond0.301' (749d10a2-4900-42b5-964a-2ea146a2e7a6) successfully added.
[root@c752 ~]# nmcli con show
NAME                UUID                                  TYPE      DEVICE
bond-slave-ens37    7ca51b00-89fe-4e30-98d0-6588a747b5f1  ethernet  ens37
bond-slave-ens38    dc260d63-0dae-4d63-ba90-66fbb57a4735  ethernet  ens38
bond0               25a6c049-251e-464a-87fc-6f25112c712e  bond      bond0
br0                 7531e688-83cd-4b97-b596-3b3b55ea2cbf  bridge    br0
br1                 431ecf74-7476-4009-b13c-d6bb9b286697  bridge    br1
br301               040c6db1-4e47-4aaa-beec-014bc14f82a6  bridge    br301
bridge-slave-ens36  211c573e-7133-40c3-bba9-c3c19e751417  ethernet  ens36
ens33               004afe6f-a987-4467-a6e7-8d5d04ec3a33  ethernet  ens33
virbr0              0208dbe6-9eb8-4370-bd8b-227165f695db  bridge    virbr0
bond0.301           749d10a2-4900-42b5-964a-2ea146a2e7a6  vlan      --
[root@c752 ~]# brctl show
bridge name     bridge id               STP enabled     interfaces
br0             8000.000c29975501       no              bond0
br1             8000.000c299755f7       no              ens36
br301           8000.000000000000       no
virbr0          8000.525400701951       yes             virbr0-nic
[root@c752 ~]#

nmcli con showの出力にてbond0.301が追加されたことが確認できます。
しかし、現段階ではbond0.301をUpさせていないため、DEVICEが「ーー」となっています。
また、「dev bond0」を指定することにより、bond0.301をbond0にアサインしています。
さらに、「id 301」を指定することにより、VLAN番号を指定しています。*4

(10)bond0.301をbr301にアサイ

投入コマンド
nmcli connection modify bond0.301 connection.master br301 connection.slave-type bridge
nmcli connection up bond0.301
nmcli con show
brctl show

出力例
[root@c752 ~]# nmcli connection modify bond0.301 connection.master br301 connection.slave-type bridge
[root@c752 ~]# nmcli connection up bond0.301
Connection successfully activated (D-Bus active path: /org/freedesktop/NetworkManager/ActiveConnection/13)
[root@c752 ~]# nmcli con show
NAME                UUID                                  TYPE      DEVICE
bond-slave-ens37    7ca51b00-89fe-4e30-98d0-6588a747b5f1  ethernet  ens37
bond-slave-ens38    dc260d63-0dae-4d63-ba90-66fbb57a4735  ethernet  ens38
bond0               25a6c049-251e-464a-87fc-6f25112c712e  bond      bond0
bond0.301           749d10a2-4900-42b5-964a-2ea146a2e7a6  vlan      bond0.301
br0                 7531e688-83cd-4b97-b596-3b3b55ea2cbf  bridge    br0
br1                 431ecf74-7476-4009-b13c-d6bb9b286697  bridge    br1
br301               040c6db1-4e47-4aaa-beec-014bc14f82a6  bridge    br301
bridge-slave-ens36  211c573e-7133-40c3-bba9-c3c19e751417  ethernet  ens36
ens33               004afe6f-a987-4467-a6e7-8d5d04ec3a33  ethernet  ens33
virbr0              0208dbe6-9eb8-4370-bd8b-227165f695db  bridge    virbr0
[root@c752 ~]# brctl show
bridge name     bridge id               STP enabled     interfaces
br0             8000.000c29975501       no              bond0
br1             8000.000c299755f7       no              ens36
br301           8000.000c29975501       no              bond0.301
virbr0          8000.525400701951       yes             virbr0-nic
[root@c752 ~]#

nmcli con showの出力のDEVICEにbond0.301が表示され、brctl showの出力にはbond0.301が表示されました。

6.補足1:brctlコマンドについて

先にも書きましたが、「Bridge」や「Bridgeインターフェース」は、仮想スイッチです。
このため、構成図上にもPort1やPort2と記載していますが、これらの確認方法を解説します。
結論から先に書くと、以下2つのオプションコマンドにより確認可能です。

brctl showstp br0
brctl showmacs br0

まずは構成図に記載した状態&Guest1~3を全て起動した状態にて、brctl showで確認してみます。

[root@c752 vm]# brctl show
bridge name     bridge id               STP enabled     interfaces
br0             8000.000c29975501       no              bond0
                                                        vnet1
                                                        vnet2
br1             8000.000c299755f7       no              ens36
                                                        vnet0
br301           8000.000c29975501       no              bond0.301
                                                        vnet3
virbr0          8000.525400701951       yes             virbr0-nic

ここではbr0にフォーカスします。
b0には、bond0,vnet1,vnet2の3つのインターフェースがアサインされています。
bond0は先に記載した通り、nmcliコマンドでb0にアサインしました。
vnet1やvnet2は、仮想マシンを起動させた際、起動順に動的にアサインされます。

では、これら3つのインターフェースがbr0の何番ポート*5に接続されているのでしょうか?

[root@c752 vm]# brctl showstp br0
br0
 bridge id              8000.000c29975501
 designated root        8000.000c29975501
 root port                 0                    path cost                  0
 max age                  20.00                 bridge max age            20.00
 hello time                2.00                 bridge hello time          2.00
 forward delay            15.00                 bridge forward delay      15.00
 ageing time             300.00
 hello timer               0.00                 tcn timer                  0.00
 topology change timer     0.00                 gc timer                 151.70
 flags


bond0 (1)
 port id                8001                    state                forwarding
 designated root        8000.000c29975501       path cost                100
 designated bridge      8000.000c29975501       message age timer          0.00
 designated port        8001                    forward delay timer        0.00
 designated cost           0                    hold timer                 0.00
 flags

vnet1 (2)
 port id                8002                    state                forwarding
 designated root        8000.000c29975501       path cost                100
 designated bridge      8000.000c29975501       message age timer          0.00
 designated port        8002                    forward delay timer        0.00
 designated cost           0                    hold timer                 0.00
 flags

vnet2 (3)
 port id                8003                    state                forwarding
 designated root        8000.000c29975501       path cost                100
 designated bridge      8000.000c29975501       message age timer          0.00
 designated port        8003                    forward delay timer        0.00
 designated cost           0                    hold timer                 0.00
 flags

上記コマンドにより、
 Port1=bond0
 Port2=vnet1
 Port3=vnet2
であることが確認できました。

次に各PortのMACアドレスarpにより学習したMACアドレスはどのように判別すればよいでしょうか?

[root@c752 vm]# brctl showmacs br0
port no mac addr                is local?       ageing timer
  1     00:50:56:c0:00:01       no                 6.96
  1     00:0c:29:97:55:01       yes                0.00
  1     00:0c:29:97:55:01       yes                0.00
  2     52:54:00:5d:46:f7       no               158.94
  2     fe:54:00:5d:46:f7       yes                0.00
  2     fe:54:00:5d:46:f7       yes                0.00
  3     52:54:00:1f:56:30       no               142.25
  3     fe:54:00:1f:56:30       yes                0.00
  3     fe:54:00:1f:56:30       yes                0.00

上記コマンドより、まず前提として

「port no」      :brctl showstp br0により確認したポート番号
「is local?=yes」:br0内ポートのMACアドレス*6
「is local?=no」 :arpにより学習したMACアドレス*7

となります。

次に
「is local?=yes」のMACアドレス

port no mac addr
  1     00:0c:29:97:55:01  bond0のMACアドレス
  2     fe:54:00:5d:46:f7  vnet1のMACアドレス
  3     fe:54:00:1f:56:30  vnet2のMACアドレス 

となります。

最後に
「is local?=no」のMACアドレス

port no mac addr
  1     00:50:56:c0:00:01  スイッチのPo1のMACアドレス
  2     52:54:00:5d:46:f7  Guest2のeth0のMACアドレス
  3     52:54:00:1f:56:30  Guest3のeth0のMACアドレス 

となります。

7.補足2:スイッチ側のサンプルConfig

Ciscoになってしまいますが、物理スイッチ側のサンプルConfigを乗せておきます。

ens36対向ポート(G0/0)の場合:その1

interface GigabitEthernet0/0
 switchport access vlan 100
 switchport mode access

最もオーソドックなパターンです。


ens36対向ポート(G0/0)の場合:その2

interface GigabitEthernet0/0
 switchport trunk encapsulation dot1q
 switchport trunk allowed vlan 100,110
 switchport mode trunk

Guest側でVLAN Tagを付ける場合です。
Guest側にCSR1000vとかNexus9000vなどを構築した場合、仮想ルータやスイッチ側でVLAN Tagを付けられるため、対向ポートではTrunkにします。
ちなみに、br0上ではスイッチングハブなどのようにTagを剥がされる心配はありません。


bond0対向ポート(Po1&G0/1&G0/2)の場合

interface Port-channel1
 switchport trunk encapsulation dot1q
 switchport trunk allowed vlan 100,110,301
 switchport mode trunk
 spanning-tree portfast trunk
!
interface GigabitEthernet0/1
 switchport trunk encapsulation dot1q
 switchport trunk allowed vlan 100,110,301
 switchport mode trunk
 channel-group 1 mode on
!
interface GigabitEthernet0/2
 switchport trunk encapsulation dot1q
 switchport trunk allowed vlan 100,110,301
 switchport mode trunk
 channel-group 1 mode on

図に記載した構成の場合、(9)でVLANインターフェースを作成しているため、301のTrunkは必須となります。
一方、br0は特にVLANインターフェースを経由していないため、VLAN Tagを付けるか否かは、GuestOS側に依存します。
GuestOS側でVLAN Tagを付けない場合は、 switchport trunk native vlan 100などとしてください。

あと、脱線してしまいますが、bonding modeについて少し触れておきます。
Static LAGの場合

nmcli connection add type bond con-name bond0 ifname bond0 mode balance-xor

の場合

interface GigabitEthernet0/1
 switchport trunk encapsulation dot1q
 switchport trunk allowed vlan 100,110,301
 switchport mode trunk
 channel-group 1 mode on
!
interface GigabitEthernet0/2
 switchport trunk encapsulation dot1q
 switchport trunk allowed vlan 100,110,301
 switchport mode trunk
 channel-group 1 mode on

LACPの場合

nmcli connection add type bond con-name bond0 ifname bond0 mode 802.3ad

の場合

interface GigabitEthernet0/1
 switchport trunk encapsulation dot1q
 switchport trunk allowed vlan 100,110,301
 switchport mode trunk
 channel-group 1 mode active
!
interface GigabitEthernet0/2
 switchport trunk encapsulation dot1q
 switchport trunk allowed vlan 100,110,301
 switchport mode trunk
 channel-group 1 mode active

8.補足3:GuestOS側のネットワーク設定

GuestOS側で今回作成したBridgeをアサインする場合、いくつか方法はありますが、Virt-Manager上では以下のように指定します。
f:id:metonymical:20181027132842p:plain

以上です。

9.最後に

この手の内容を記載したサイトは他にもたくさんあります。
しかし、どのコマンドを打ったときに、どの部分が作られているのかを順を追って解説したサイトは少ないように感じたので、私なりにまとめてみました。
また、過去記事ではCentOS6系の内容を記載しましたが、nmcliコマンドではなかったため新規記事として作成しました。

前回(2018/10/21に)記載したLXC/LXDのコンテナ環境構築において、ネットワーク周りの内容を記載するにあたり、前提となる知識が必要だったため、今回はLinuxのネットワーク周りについて、少し深堀りした内容にしました。

あと、SR-IOVを動かした際の構成については、次のステップとして検証したいなと思っています。

また「brctlコマンドについて」は今回の内容から少し脱線している認識があります。しかしながら、「brctlコマンドについて」の内容を理解していないと、トラブルシュートが難しくなると考えています。

何かのトラブルが発生した際、例えば、br0上のどのポートからどのMACアドレスが見えているのか?とか、br0上のどのポートをPcapすればよいのか?といったが瞬時に把握できないと、相当しんどいと思うので。

*1:ESXiでは、vSwitchと呼ばれています

*2:私としては、bridge-slaveというよりも、外部スイッチへのアップリンクポートという風に捉えています。

*3:nmcli con reloadやsystemctl reload NetworkManagerを行ってもbond0が表示されないため、rebootした方が手っ取り早いです。ちなみに、この段階でrebootするのではなく、(10)まで設定した後、最後にrebootしても問題ありません。

*4:VLAN番号を指定というよりも、私としては、bond0.301を通過するEtherフレームにVLAN301のTagを付与しているという風に捉えています。

*5:老婆心ながら、ここでいう「ポート」とは、スイッチポートの番号(G1/0/1とか)のことです。L4(TCPUDP)のポート番号ではありません。

*6:yesのMACアドレスが2つづつ表示されてる理由は私自身もあまりよくわかっていません。すいません。。。

*7:つまり、br0の各ポートの先に存在するMACアドレスとなります。このため、ageing timerが稼働しています。