CUBE SUGAR CONTAINER

技術系のこと書きます。

Network Namespace 内の Linux Bridge で STP が動くようになった

以前、システムが所属している以外の (= 非ルートな) Network Namespace 上では Linux Bridge の STP が動作しない件について書いた。

blog.amedama.jp

月日は流れて、去年の話ではあるけど Linux カーネルに以下のパッチが投稿されて取り込まれたようだ。

lore.kernel.org

つまり、新しいカーネル 1 であれば STP が動作するようになった。 今回は、それを試してみる。

使った環境は次のとおり。 Ubuntu 24.04 LTS の開発版ブランチを利用している。

$ cat /etc/lsb-release 
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=24.04
DISTRIB_CODENAME=noble
DISTRIB_DESCRIPTION="Ubuntu Noble Numbat (development branch)"
$ uname -srm
Linux 6.6.0-14-generic aarch64
$ ip -V
ip utility, iproute2-6.1.0, libbpf 1.3.0
$ brctl -V
bridge-utils, 1.7

もくじ

下準備

あらかじめ、必要なパッケージをインストールしておく。

$ sudo apt-get -y install iproute2 tcpdump

ネットワークを作る

ここからは、ループしたネットワークを作っていく。

まずは新しく Network Namespace を作成する。

$ sudo ip netns add bridge

Network Namespace に Linux Bridge を作成する。

$ sudo ip netns exec bridge ip link add dev br0 type bridge

続いて veth (Virtual Ethernet Device) のネットワークインターフェースを作成する。

$ sudo ip link add br-veth0 type veth peer name br-veth1

作成したインターフェイスを Network Namespace に所属される。

$ sudo ip link set br-veth0 netns bridge
$ sudo ip link set br-veth1 netns bridge

インターフェイスを使えるように UP に設定する。

$ sudo ip netns exec bridge ip link set br-veth0 up
$ sudo ip netns exec bridge ip link set br-veth1 up

インターフェイスを両方 Linux Bridge につなぐ。 これでループができた。

$ sudo ip netns exec bridge ip link set br-veth0 master br0
$ sudo ip netns exec bridge ip link set br-veth1 master br0

ストームを起こす

まだ肝心の Linux Bridge が DOWN したままなのでストームは起こっていない。

$ sudo ip netns exec bridge ip -s link show br0
2: br0: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000
    link/ether 00:00:5e:00:53:01 brd ff:ff:ff:ff:ff:ff
    RX:  bytes packets errors dropped  missed   mcast           
             0       0      0       0       0       0 
    TX:  bytes packets errors dropped carrier collsns           
             0       0      0       0       0       0

ここで Linux Bridge を UP に設定してみよう。

$ sudo ip netns exec bridge ip link set br0 up

すると、インターフェイスの統計情報でパケットがどんどん増えていく。

$ sudo ip netns exec bridge ip -s link show br0
2: br0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP mode DEFAULT group default qlen 1000
    link/ether 00:00:5e:00:53:01 brd ff:ff:ff:ff:ff:ff
    RX:  bytes packets errors dropped  missed   mcast           
     682266792 9739306      0       0       0 9739306 
    TX:  bytes packets errors dropped carrier collsns           
        627472    7296      0       0       0       0

このとき tcpdump(8) するとストームの様子を観察できる。

$ sudo ip netns exec bridge tcpdump -tnl -i br0

STP を有効にする

それでは Linux Bridge の STP を有効にしてみよう。

$ sudo ip netns exec bridge ip link set br0 type bridge stp_state 1

すると、先ほど確認した統計情報の増加がピタッと止まる。

$ sudo ip netns exec bridge ip -s link show br0
2: br0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP mode DEFAULT group default qlen 1000
    link/ether 00:00:5e:00:53:01 brd ff:ff:ff:ff:ff:ff
    RX:   bytes   packets errors dropped  missed     mcast           
    12533565936 192857688      0       0       0 192857688 
    TX:   bytes   packets errors dropped carrier   collsns           
        8275968     96232      0       0       0         0

どうやら、STP が正常に動作しているようだ。

いじょう。


  1. v5.6 あたりからいけそうな感じ (デフォルトの Ubuntu であれば 22.10 以降が該当する)