ラズパイ4とubuntuでbondingを使う

※記事内に商品プロモーションを含む場合があります

自宅サーバーはラズベリーパイ4にubuntuを入れて使用しています。

普通に使うと有線LANとWiFi、2つのIPアドレスになります。

自宅サーバーの場合、有線は、RE450というWifi中継機を使用していて
本体は、いつも温かいので、故障が心配です。
【関連】自宅ファイルサーバーをトイレに移設した

今回はbondingでIPアドレスを1に束ね、
通常は有線LANを使用し、有線LANが不通の時には
無線LANに切り替わる仕組みをbondingで作りました。

bondingモジュールをインストール

標準では、bondingモジュールが入っていません。
入っているか、いないかは以下のコマンドで確認できます。

lsmod | grep bonding

何も表示されていない場合、bondingモジュールが
インストールされていないので、bondingが使えません。

モジュールのインストール方法は、多くのサイトなどでは
以下のコマンドが使われています。

 sudo apt install ifenslave

通常であれば、モジュールをインストールして再起動をすれば
カーネルモジュールが読み込まれます。
ラズパイ4では使えませんでした。

私のラズパイ4で動いているubuntu 22のカーネルは
5.15.0-1014-raspi
となっているので、ラズパイ用のカーネルとなっています。

ラズパイ用カーネルモジュールのインストール

カーネルモジュールのインストールは以下のコマンドで行います。

sudo apt install linux-modules-extra-raspi

インストール完了後、再起動すればbondingモジュールが読み込まれます。

netplanでの設定

ubuntuではnetplanでネットワーク設定を行います。
今回は、/etc/netplan/70-net.yamlを新たに作り設定を行います。

元からある、50-cloud-init.yamlは編集してはダメと言われています。

設定

network:
  version: 2
  renderer: networkd

  wifis:
    wlan0:
      dhcp4: no
      dhcp6: no
      access-points:
        "【SSID】":
            password: "【パスワード】"

  ethernets:
    eth0:
      dhcp4: no
      dhcp6: no

  bonds:
    bond0:
      interfaces:
        - eth0
        - wlan0
      addresses:
       - 192.168.1.2/24
      routes:
       - to: default
         via: 192.168.1.1
      nameservers:
       addresses:
       - 192.168.1.2
      parameters:
        mode: active-backup
        primary: eth0
        arp-ip-targets: [192.168.1.1]
        arp-interval: 1000

自宅サーバではrootから引くDNSキャッシュサーバが稼働しているので
自IPアドレス(192.168.1.2)を指定しています。
通常はルーターなどの192.168.1.1で良いと思います。

bondingには負荷分散のモードなど、さまざまなモードがありますが
今回はネットワークに冗長性を持たせるため、active-backupを使います。

arpでの監視

最初はMII監視を使用していましたが、動作確認をすると
ネットワークが落ちたままになります。

モニタに接続し、状態を確認しながらLANケーブルを抜くと
MII Statusがupのままで、ダウン検知されていませんでした。

bondingにはMII監視とARP監視がありますが、MIIがダウン検知しないので
ARP監視を使う事にしました。

ちなみに、MII監視からARP監視に変更は再起動が必要です。

ARPはIPアドレスからMACアドレスを取得するプロトコルで
実際にパケットを流して、疎通の確認を行います。

デメリットとしては、無駄な通信が増える事ですが
一般家庭なら問題無いと思います。

実際のARP関連の設定

        arp-ip-targets: [192.168.1.1]
arp-interval: 1000

arp-ip-targetsはネットワーク疎通の確認に使うIPアドレスを指定します。
私はルーターのIPアドレスを設定しています。
コンマで区切ることで、複数のIPアドレスを指定出来ます。

arp-intervalはARPポーリングの間隔を指定します。
上の設定では1000msで、1秒に1回ポーリングを行います。

ポーリング間隔を短くしても、無駄な通信が発生しますし
広げても復帰に時間が掛かるので、1秒ぐらいがちょうどよいと思います。

あとがき

これで、Wifi中継機が故障してもWifiがバックアップとして稼働する様になりました。

実際にWifi中継機のLANケーブルを抜いてbondingの
動作を確認してみました。

pingで疎通を確認しながら、LANケーブルを抜くと
抜いた直後は、タイムアウトが発生しました。
3~5秒後には、疎通が再開しました。

LANケーブルを抜いてbondingの動作テストをpingで確認

LANケーブルを元に戻した時は、通信断はありませんでした。
何回か試しましたが、SSH接続が落ちることがありました。

ただし、謎なのが

cat /proc/net/bonding/bond0

でbondingの状態を確認すると、wlan0のMII Statusが
downになったりupになったりします。

でも、eth0がdownになると、upになりbondingが動作します。