NetBSD-currentに搭載されたリンクアグリゲーション機能(lag(4))を試してみる

[NetBSD Advent Calendar 2023](https://qiita.com/advent-calendar/2023/netbsd) 7日目の記事です。今日はNetBSD-currentで追加されている[lagg(4)](https://man.netbsd.org/lagg.4)の機能を試してみようと思います。

## リンクアグリゲーション(Link Aggregation)

NetBSD-currentに追加されている[lagg(4)](https://man.netbsd.org/lagg.4)デバイスは、複数のNIC(Network Interface Card)を束ねてひとつの論理的なネットワークインタフェースとして扱うことができる、[リンクアグリゲーション](https://en.wikipedia.org/wiki/Link_aggregation)の機能を提供するものです。ネットワークスイッチ等では標準で搭載されているような機能ですが、いよいよNetBSDでもこの機能が利用可能になるようです。

## さっそく試してみる

[lagg(4)](https://man.netbsd.org/lagg.4)のマニュアルをみると、基本的な設定手順が記載されているので、これを参考にリンクアグリゲーションの機能を試してみましょう。検証用に以下のような構成のNetBSD環境を用意します。

今回は対抗のNetBSD間 `lagg0` という[lagg(4)](https://man.netbsd.org/lagg.4)デバイスを作成し、そこに `wm1` `wm2` `wm3` という物理NICを紐づけます。 `172.16.151.9/32` のネットワークがリンクアグリゲーションされたものになります。

```
+----------------+
|                +(wm1)---------------+               +---------------(wm1)+----------------+
|                |10.0.1.11           |               |           10.0.1.21|                |
|                |                    |               |                    |                |
| NetBSD-current +(wm2)------------(lagg0)---------(lagg0)------------(wm2)| NetBSD-current |
|     (lag01)    |10.0.1.12      172.16.151.1    172.16.151.2     10.0.1.22|     (lag02)    |
|                |                    |               |                    |                |      
|                +(wm3)---------------+               +---------------(wm3)|                |
|                |10.0.1.13                                       10.0.1.23|                |
+----------------+                                                         +----------------+
```

## lagg(4)の設定手順

それぞれのNetBSDでは `wm1` `wm2` `wm3` に以下のIPアドレス設定を行っておきます。

```sh
# # lagg01側
# cat /etc/ifconfig.wm[123]
up
10.0.1.11 netmask 0xffffff00 media autoselect
up
10.0.1.12 netmask 0xffffff00 media autoselect
up
10.0.1.13 netmask 0xffffff00 media autoselect
```

```sh
# # lag02側
# cat /etc/ifconfig.wm[123]
up
10.0.1.21 netmask 0xffffff00 media autoselect
up
10.0.1.22 netmask 0xffffff00 media autoselect
up
10.0.1.2 netmask 0xffffff00 media autoselect
```

それぞれのNetBSDマシンに以下の設定を投入します。
( `/etc/rc.local` に設定を入れておくのが良さそうです)

```sh
# # lagg01,lagg02共通の設定
# ifconfig lagg0 create 
# ifconfig lagg0 laggproto loadbalance
# ifconfig lagg0 laggport wm1 pri 100
# ifconfig lagg0 laggport wm2 pri 100
# ifconfig lagg0 laggport wm3 pri 100
```

```sh
# # lagg01側での設定
# ifconfig lagg0 inet 172.16.151.1 netmask 255.255.255.0 up
```

```sh
# # lagg02側での設定
# ifconfig lagg0 inet 172.16.151.2 netmask 255.255.255.0 up
```

これでリンクアグリゲーションの設定は完了です。

## 疎通確認してみる

双方のマシンにpingを飛ばしてみると無事に応答が返ってくるので、リンクアグリゲーションしてあるネットワーク上での疎通が行えているようです。

```sh
# # lagg01側
# ping -c 2 172.16.151.2
PING 172.16.151.2 (172.16.151.2): 56 data bytes
64 bytes from 172.16.151.2: icmp_seq=0 ttl=255 time=0.443074 ms
64 bytes from 172.16.151.2: icmp_seq=1 ttl=255 time=0.663492 ms

----172.16.151.2 PING Statistics----
2 packets transmitted, 2 packets received, 0.0% packet loss
round-trip min/avg/max/stddev = 0.443074/0.553283/0.663492/0.155859 ms
```

```sh
# # lagg02側
# ping -c 2 172.16.151.1
PING 172.16.151.1 (172.16.151.1): 56 data bytes
64 bytes from 172.16.151.1: icmp_seq=0 ttl=255 time=0.580241 ms
64 bytes from 172.16.151.1: icmp_seq=1 ttl=255 time=0.999289 ms

----172.16.151.1 PING Statistics----
2 packets transmitted, 2 packets received, 0.0% packet loss
round-trip min/avg/max/stddev = 0.580241/0.789765/0.999289/0.296312 ms
```

## 冗長性を確認してみるも…

しかし、リンクアグリゲーションで束ねているネットワークの一つをdownさせると、とたんに疎通が途切れてしまいます…。ネットワークの一つが途切れても疎通は保たれるのがリンクアグリゲーションの利点の一つであるはずなので、もうちょっと調べてみようと思います。
(単に私の設定が間違っている可能性もありますが…)

## まとめ

NetBSD-currentに搭載された、リンクアグリゲーションの機能を試してみました。まだちょっと思った通りの設定手順を把握できていませんが、NetBSDにも欲しかった機能の一つであるため、活用できるように設定ノウハウを集めたいと思います。