犬でも分かるLinuxネットワーク設定(2): ボンディング(bonding)

前回は、LANポートにIPアドレスを設定するという基本的な操作をしてみました。ウチのミニPCは本体にLANポートが2つ付いているので、せっかくだからこの2つのLANポートをボンディング(bonding)してみることにしました。

ボンディング(bonding)とは何か

ボンディングは複数のLANポート(物理インターフェース)を1つの論理インターフェースとして使えるようにする機能です。LANポートに冗長性を持たせたり、帯域幅を向上させるといった目的があります。

ボンディングしない場合

ウチのミニPCには、本体のLANポート2つの他に、USB-LAN変換アダプタのLANポートもあって、合計3つのLANポートを持っています。LAN1とLAN2を192.168.2.0/24の管理ネットワークに接続して、それぞれにIPアドレスを持たせて通信することはできますが、それぞれのLANポートに通信してもメリットはありません。

この接続形態では、LAN1とLAN2のそれぞれのコネクション(type=ethernet)がIPアドレスを持ちます。

ボンディングする場合

今回の例では、LAN1とLAN2を束ねて1つの論理インターフェースとして使えるようにボンディングすることにします。

ボンディングする場合は、bondingの論理インターフェースを作成します(名前はbond2とします)。登場するインターフェースは、enp2s0(LAN1)、enp3s0(LAN2)、bond2 の3つとなります。そして、それぞれのインターフェースがコネクションを持っています。enp2s0とenp3s0は、type=ethernetとして作成しますが、ボンディング bond2に接続するボンディングスレーブの役割を持たせます。今回の例では、分かりやすいようにコネクションの名前を変えています。そして、IPアドレスはボンディングマスターとなるbond2のほうに割り当てます。

インターフェースコネクションタイプ役割
enp2s0bond-slave-enp2s0ethernetbond2のボンディングスレーブ
enp3s0bond-slave-enp3s0ethernetbond2のボンディングスレーブ
bond2bond2bondボンディングマスター
ボンディングのモード

ボンディングのメリットは、ネットワークインターフェースに冗長性を持たせることと帯域幅を向上させることです。尚、ボンディングにはいくつかのモード(仕様)があり、オプションで指定することができます。

モード(番号)モード(仕様)説明
0balance-rrパケットをそれぞれのインターフェースに順番に送信します(ラウンドロビン方式)。パケット順序が乱れたときに影響がある場合があります。
1active-backup一方がアクティブ、他方がバックアップとなります。アクティブ側が故障するとバックアップ側に切り替わります。
2balance-xor送信元と宛先のMACアドレスに基づき、特定のスレーブインターフェースにパケットを割り当てます。パケットの順序が保持されます。リンクアグリゲーション(LAG)対応のスイッチと組み合わせて利用します。
3broadcast各インターフェースで同じデータを送信します。
4802.3adIEEE 802.3ad Dynamic Link Aggregation (LACP=Link Aggregation Control Protocol)を使用したリンクアグリゲーション(LAG)を実現します。スイッチ側でもLACPを有効にする必要があります。

これらの中で帯域幅を向上できるのは、モード0,2,4 の3つです。

nmcliコマンドによるボンディング設定

以下に、ウチのミニPCでボンディングを設定したときのnmcliコマンドの例を示します。尚、作業の前に、LAN1, LAN2のコネクションはボンディングスレーブとして作成することになるので、LAN1, LAN2に対応した既存のコネクション enp2s0, enp3s0を以下の通り削除しておきます。

# nmcli connection down enp2s0
Connection 'enp2s0' successfully deactivated (D-Bus active path: /org/freedesktop/NetworkManager/ActiveConnection/58)
# nmcli connection down enp3s0
Connection 'enp3s0' successfully deactivated (D-Bus active path: /org/freedesktop/NetworkManager/ActiveConnection/65)
# nmcli connection delete enp2s0
Connection 'enp2s0' (fa3cffcf-7e07-48a3-93e6-3bd18fc33380) successfully deleted.
# nmcli connection delete enp3s0
Connection 'enp3s0' (9623dab8-a26b-470a-84bb-a4503efd0e27) successfully deleted.

ボンディングを設定する

今回作成するボンディングの名前はbond2とします。LAN1,LAN2に対応するコネクションは bond-slave-enp2s0, bond-slave-enp3s0 という名前で新たに作成し、bond2のボンディングスレーブとして接続します。nmcliコマンドでは以下の通り実行します。

# nmcli connection add type bond con-name bond2 ifname bond2 mode balance-xor ★1
Connection 'bond2' (5bb26fe0-877d-4ef7-bc21-336158659033) successfully added.
# nmcli connection add type ethernet con-name bond-slave-enp2s0 ifname enp2s0 master bond2 ★2
Connection 'bond-slave-enp2s0' (d19cf27f-a18a-43a1-8d67-47af23bf8c7a) successfully added.
# nmcli connection add type ethernet con-name bond-slave-enp3s0 ifname enp3s0 master bond2 ★2
Connection 'bond-slave-enp3s0' (b66afd72-1a1e-460c-a0d8-b49170a6b8d2) successfully added.
# nmcli connection modify bond2 ipv4.addresses 192.168.2.200/24 ★3
# nmcli connection modify bond2 ipv4.method manual ★4
# nmcli connection modify bond2 connection.autoconnect yes ★5
# nmcli connection modify bond2 ipv6.method ignore ★6
# nmcli connection up bond2 ★7
Connection successfully activated (controller waiting for ports) (D-Bus active path: /org/freedesktop/NetworkManager/ActiveConnection/28)
# nmcli connection up bond-slave-enp2s0 ★8
Connection successfully activated (D-Bus active path: /org/freedesktop/NetworkManager/ActiveConnection/31)
# nmcli connection up bond-slave-enp3s0 ★8
Connection successfully activated (D-Bus active path: /org/freedesktop/NetworkManager/ActiveConnection/32)

★1: ボンディングインターフェースのコネクション bond2 を作成します。ボンディングモードはbalance-xorとする。
★2: bond2をマスターとするイーサネットインターフェースのコネクション bond-slave-enp2s0, bond-slave-enp3s0 を作成します。
★3: bond2にIPアドレスを割り当てます
★4: bond2のIPアドレスを静的にします
★5: システム起動時にbond2を自動的に接続するようにします
★6: bond2のIPv6を無効化します
★7: bond2のコネクションを有効化(up)すると同時に、bond2.nmconnection ファイルを作成します
★8: bond-slave-enp2s0, bond-slave-enp3s0のコネクションを有効化(up)すると同時に、bond-slave-enp2s0.nmconnection, bond-slave-enp3s0.nmconnection ファイルを作成します

上記のnmcliコマンドを実行した後、/etc/NetworkManager/system-connections/ 配下を確認すると以下のファイルが作成されています。

bond-slave-enp2s0.nmconnection
bond-slave-enp3s0.nmconnection
bond2.nmconnection

参照されたい方は、以下からダウンロードしてください。
Rocky Linux 9のbonding設定ファイル

nmcli connection show コマンドを実行すると、コネクションの一覧は以下の通りになっています。

NAME                    UUID                                  TYPE      DEVICE
bond2                   5bb26fe0-877d-4ef7-bc21-336158659033  bond      bond2
bond-slave-enp2s0       d19cf27f-a18a-43a1-8d67-47af23bf8c7a  ethernet  enp2s0
bond-slave-enp3s0       b66afd72-1a1e-460c-a0d8-b49170a6b8d2  ethernet  enp3s0
lo                      a01cfad5-56ea-409c-a892-be800ebb1596  loopback  lo

ネットワークスイッチのほうもLAGに設定したよ

ウチのネットワークスイッチ tp-link製TL-SG108E はLAGに対応しているので、LAN1,LAN2と接続しているPort 5-6をLAGに設定しました。

ミニPCとSW間は2本のケーブルで接続しているので帯域幅が(論理的に)倍になりますが、その先に接続されているマシンはLAGを構成していないので、帯域幅が倍になる恩恵を受けていませんが、まあ今回はあくまでもテストです。

ミニPCのLAN2,LAN3のケーブルの片方を抜いても、通信が途絶えることがないことをテストで確認しました。

ちなみに、高価なネットワークスイッチではLACP(Link Aggregation Control Protocol)に対応しているので、その場合はネットワークスイッチでLACPを有効にすると同時に、サーバ側のbonding設定もLACP対応に設定します。
以下は、ボンディングのコネクションbond2のモードをLACPに変更する例です。

# nmcli connection modify bond0 bond.options "mode=802.3ad" ★1
# mcli connection modify bond0 +bond.options "miimon=100" ★2
# nmcli connection modify bond0 +bond.options "lacp_rate=fast"
★3

★1: モードをLACPに設定します
★2: miimon(Media Independent Interface Monitor)の設定で、各リンクの状態(ミリ秒単位)を監視する間隔を設定します。
★3: lacp_rate は、LACPプロトコルで使用される制御メッセージ(LACPDU)の送信頻度を設定します。fastは1秒毎となります。

また、ネットワークスイッチ側でLAG設定をしない(またはLAG機能がない)のであれば、balance-rr または active-backup に設定するのが良いかと思います。

広告主へのリンク

オイラが今回のテストに使っているのは、高価なサーバではなくて、安価なミニPC MINISFORUM GK41 というマシンです。LANポートが2つ付いているので、PXEブートのテストにも便利です。

接続しているネットワークスイッチは以下のモデルです。安価だけど、VLANやLAGにも対応しているのでお勉強用ですね。




このブログにおける関連リンク

犬でも分かるLinuxネットワーク
犬でも分かるLinuxネットワーク設定(1): nmcliコマンドの使い方
犬でも分かるLinuxネットワーク設定(2): ボンディング(bonding)
犬でも分かるLinuxネットワーク設定(3): 仮想ブリッジ
犬でも分かるLinuxネットワーク設定(4): ボンディング+仮想ブリッジ
犬でも分かるLinuxネットワーク設定(5):定義ファイルの修正
犬でも分かるLinuxネットワーク設定(6): ルーティングとNAT
犬でも分かるLinuxネットワーク設定(7):firewalldによるアクセス制限
犬でも分かるLinuxネットワーク設定(8):VLAN
犬でも分かるLinuxネットワーク設定(9):IPエイリアス
犬でも分かるLinuxネットワーク設定(10):outboundのアクセス制限
犬でも分かるLinuxネットワーク設定(11):NATポリシーにアクセス制限を設定する

MINISFORUM GK41 ミニPC を買ってみた
コスパの高いネットワークスイッチTL-SG108Eを試す

コメント

タイトルとURLをコピーしました