【2025年01月】Ubuntu24.04 で ネットワークボンディング(モード6)の設定【冗長化・アダプティブロードバランシング】

# はじめに

Ubuntu でネットワークボンディングを試してみたメモ

# 前提

ボンディングとチーミングがあり、以下の認識。

- シンプルな冗長化や負荷分散 → ボンディング (bonding) 推奨
- 動的で柔軟な管理や高度な制御 → チーミング (teaming) 推奨

ここでは、ボンディングを行います。

ボンディングにも種類があり、以下の認識。

| モード         | 名称                             | 対向スイッチの設定 |
|----------------|----------------------------------|--------------------|
| balance-rr     | ラウンドロビン方式 (モード0)       | 必要               |
| active-backup  | アクティブ・バックアップ (モード1) | 不要               |
| balance-xor    | XORバランス (モード2)            | 必要               |
| 802.3ad        | LACP (モード4、推奨)             | 必要               |
| balance-tlb    | トランスミッションロードバランシング (モード5) | 不要               |
| balance-alb    | アダプティブロードバランシング (モード6) | 不要               |

ここでは、balance-albによるボンディングを行います。

また、障害の検知方法に種類があり、以下の認識。

- MII (Media Independent Interface) モニタリング → シンプルで物理リンクの状態を直接監視
- ARP (Address Resolution Protocol) モニタリング → スイッチ障害やルーティングの問題も検知可能

ここでは、MIIモニタリングを行います。

:::note info
MII (Media Independent Interface) モニタリングは、物理リンクの状態（リンクアップ/ダウン）をカーネルレベルで直接監視します。インターフェースのリンク状態をポーリング（定期的にチェック）します。
:::
        
# 設定方法

netplanによる設定を行います。

- ネットワークデバイスは、`ens18`、`ens19`
- 設定するIPアドレスは `192.168.1.100`、GWは `192.168.1.1`、DNSは `8.8.8.8, 1.1.1.1`

`/etc/netplan/50-cloud-init.yaml` を以下に修正します。

```/etc/netplan/50-cloud-init.yaml
network:
  version: 2
  renderer: networkd
  ethernets:
    ens18:
      dhcp4: no
    ens19:
      dhcp4: no

  bonds:
    bond0:
      interfaces:
        - ens18
        - ens19
      addresses:
        - 192.168.1.100/24
      routes:
      -   to: default
          via: 192.168.1.1
      nameservers:
        addresses:
          - 8.8.8.8
          - 1.1.1.1
      parameters:
        mode: balance-alb
        mii-monitor-interval: 100
```

- mode: balance-alb: モード6（アダプティブロードバランシング）
- mii-monitor-interval: リンク状態の監視間隔（100ミリ秒）

設定を反映します。

```
$ sudo netplan apply
```

# 確認方法

```terminal
$ ip a show bond0
5: bond0: <BROADCAST,MULTICAST,MASTER,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
    link/ether **:**:**:**:**:** brd ff:ff:ff:ff:ff:ff
    inet 192.168.1.100/24 brd 192.168.1.255 scope global bond0
       valid_lft forever preferred_lft forever
$
$ cat /proc/net/bonding/bond0
Ethernet Channel Bonding Driver: v6.8.0-51-generic

Bonding Mode: adaptive load balancing
Primary Slave: None
Currently Active Slave: ens18
MII Status: up
MII Polling Interval (ms): 100
Up Delay (ms): 0
Down Delay (ms): 0
Peer Notification Delay (ms): 0

Slave Interface: ens18
MII Status: up
Speed: Unknown
Duplex: Unknown
Link Failure Count: 0
Permanent HW addr: **:**:**:**:**:**
Slave queue ID: 0

Slave Interface: ens19
MII Status: up
Speed: Unknown
Duplex: Unknown
Link Failure Count: 0
Permanent HW addr: **:**:**:**:**:**
Slave queue ID: 0
```

:::note warn
VMなどで設定を行うと、リンク速度が検出されず、以下のエラーがジャーナルに出力される。

`Jan 12 09:57:48 hoge kernel: bond0: (slave ens18): failed to get link speed/duplex`

この場合、ethtoolでリンク速度を固定で与えてやると出力されなくなる。

```
$ sudo ethtool -s ens18 speed 1000 duplex full autoneg off
$ sudo ethtool -s ens19 speed 1000 duplex full autoneg off
```
:::

# 障害を起こしてみる

## 片側の切断

`ens19` を切断してみる

```
Jan 12 10:00:01 hoge systemd-networkd[3949]: ens19: Lost carrier
Jan 12 10:00:01 hoge kernel: bond0: (slave ens19): link status definitely down, disabling slave
Jan 12 10:00:01 hoge kernel: bond0: (slave ens18): making interface the new active one
Jan 12 10:00:01 hoge kernel: virtio_net virtio1 ens18: entered promiscuous mode
Jan 12 10:00:11 hoge kernel: virtio_net virtio1 ens18: left promiscuous mode
```

`ens19` を再接続してみる

```
Jan 12 10:01:47 hoge systemd-networkd[3949]: ens19: Gained carrier
Jan 12 10:01:47 hoge kernel: bond0: (slave ens19): link status definitely up, 1000 Mbps full duplex
```

`ens18` を切断してみる

```
Jan 12 10:02:51 hoge systemd-networkd[3949]: ens18: Lost carrier
Jan 12 10:02:51 hoge kernel: bond0: (slave ens18): link status definitely down, disabling slave
Jan 12 10:02:51 hoge kernel: bond0: (slave ens19): making interface the new active one
Jan 12 10:02:51 hoge kernel: virtio_net virtio3 ens19: entered promiscuous mode
Jan 12 10:03:02 hoge kernel: virtio_net virtio3 ens19: left promiscuous mode
```

`ens18` を再接続してみる

```
Jan 12 10:03:30 hoge systemd-networkd[3949]: ens18: Gained carrier
Jan 12 10:03:31 hoge kernel: bond0: (slave ens18): link status definitely up, 1000 Mbps full duplex
```

## 両側の切断

`ens18` と `ens19` の両方を切断してみる

```
Jan 12 10:06:26 hoge systemd-networkd[3949]: ens19: Lost carrier
Jan 12 10:06:26 hoge kernel: bond0: (slave ens19): link status definitely down, disabling slave
Jan 12 10:06:26 hoge kernel: bond0: now running without any active interface!
Jan 12 10:06:26 hoge systemd-networkd[3949]: bond0: Lost carrier
Jan 12 10:06:26 hoge systemd-timesyncd[527]: No network connectivity, watching for changes.
```

`ens18` と `ens19` の両方を再接続してみる

```
Jan 12 10:06:49 hoge systemd-networkd[3949]: ens18: Gained carrier
Jan 12 10:06:49 hoge kernel: bond0: (slave ens18): link status definitely up, 1000 Mbps full duplex
Jan 12 10:06:49 hoge kernel: bond0: (slave ens18): making interface the new active one
Jan 12 10:06:49 hoge kernel: virtio_net virtio1 ens18: entered promiscuous mode
Jan 12 10:06:49 hoge kernel: bond0: active interface up!
Jan 12 10:06:49 hoge systemd-networkd[3949]: bond0: Gained carrier
Jan 12 10:06:52 hoge systemd-networkd[3949]: ens19: Gained carrier
Jan 12 10:06:52 hoge kernel: bond0: (slave ens19): link status definitely up, 1000 Mbps full duplex
Jan 12 10:06:59 hoge kernel: virtio_net virtio1 ens18: left promiscuous mode
```

# さいごに

かんたんでしたね