【実務・中級編】 LACPDU(Link Aggregation Control Protocol Data Unit)のヘッダー構造とフィールド詳細 – インフラ・物理&L2/L3ネットワーク基礎実践ガイド

ネットワークの泥沼から生還せよ:LACPDUの深層と、リンクアグリゲーションを支配するパケットの掟

こんにちは。現場の最前線を渡り歩いてきたシニアネットワークエンジニアの私です。

Web系からインフラの世界に飛び込んできた若いエンジニアから、よくこんな相談を受けます。「APIのレスポンスが妙に遅い」「本番環境のデータベースクラスタ間でパケットドロップが起きる」。調査を進めると、物理インターフェースを束ねたはずのLACP(Link Aggregation Control Protocol:IEEE 802.3ad / 802.1AX)が、なぜか片側リンクしか使っていなかったり、ディストリビューションハッシュの偏りで特定の物理リンクが悲鳴を上げている……そんな現場の修羅場を、あなたも目撃したことがあるのではないでしょうか。

LACPは、ただの「回線の束ね役」ではありません。スイッチとサーバ(あるいはスイッチ間)が毎秒会話を交わし、お互いの生存確認とポートの同期をミリ秒単位で制御する、極めて洗練されたプロトコルです。

今回は、このLACPがワイヤー上でどのようなパケット(LACPDU)を飛ばし、いかにしてリンクの束を統率しているのか。そのヘッダー構造の深淵から、実務で使えるコンフィグやデバッグ手法まで、徹底的に解説していきましょう。

—

1. LACPDUの正体:イーサネットの海を泳ぐ「対話の切符」

LACPDU(Link Aggregation Control Protocol Data Unit)は、OSI参照モデルのデータリンク層(L2)で動作する制御フレームです。上位のIPやTCP/UDPの世話にはならず、イーサネットフレームの姿を借りて直接L2の海を駆け巡ります。

マルチキャストの宛先とEthertype

LACPDUが送信される際、宛先MACアドレスには特定のマルチキャストアドレスが使われます。

  • 宛先MACアドレス: 01:80:c2:00:00:02 (Slow Protocols用のマルチキャストアドレス)
  • Ethertype: 0x8809 (IEEE 802.3 Slow Protocols)
  • Subtype: 0x01 (LACP)

この 0x8809 というEthertypeを見た瞬間、ネットワーク機器のASIC(あるいはCPU)は「お、LACPの制御パケットだな」と認識し、通常のデータ転送パスから外してコントロールプレーンへCPU処理のために引き渡します。つまり、LACPDUはデータプレーンのトラフィックを妨げないよう、専用の裏口を通っているのです。

—

2. LACPDUヘッダー構造の解剖学:ActorとPartnerの心理戦

LACPDUのペイロードは、お互いの状態を伝え合う「名刺交換」の場です。パケット内部には、大きく分けて Actor(送信側) と Partner(受信側・認識している相手側) の情報が鏡写しのように格納されています。

実際のパケットアナライザ(Wireshark等)を覗いたとき、エンジニアが必ず確認すべき主要なフィールドを深掘りしていきましょう。

Actor / Partner System Information の中身

各システム情報は、以下の要素で構成されています。

1. System Priority (2オクテット):

  • システム全体の優先度です。値が小さいほど(例: 32768 より 100)、アグリゲーションにおける「主導権(マスター)」を握りやすくなります。

2. System ID (6オクテット):

  • 本体のMACアドレスです。System Priorityが同点の場合、このMACアドレスの数値が小さい方が優位に立ちます。

3. Key (2オクテット):

  • 「オレはこのグループ(Channel-Group)に所属している!」という共通の合言葉です。送信側と受信側でこのKeyが一致しないと、LACPはリンクを束ねてくれません。現場での設定ミス(LACPのモードやグループ番号の不一致)は、大抵このKeyのミスマッチが原因です。

4. Port Priority (2オクテット):

  • 個々の物理ポートの優先度です。リンクアグリゲーションの最大バンド幅(例えば8本までしか束ねられない制限など)を超えて物理ポートが接続された際、どのポートを生かすかを決める基準になります。

5. Port (2オクテット):

  • 送信元/送信先の物理ポート番号(内部ID)です。

6. State (1オクテット):

  • LACPのステートマシンを動かす最も重要なフラグ群です(後述)。

—

3. ステートマシンを支配する「Stateバイト」のフラグたち

LACPDUの State フィールド(1オクテット=8ビット)は、パケット通信の成否を握る心臓部です。ここには、以下のフラグがビット単位で詰め込まれています。

  • Bit 0 (LACP_Activity): アクティブモード(常にLACPDUを送出する)か、パッシブモード(相手から来るのを待つ)か。
  • Bit 1 (LACP_Timeout): タイムアウトの周期。Fast(1秒ごと)か Slow(30秒ごと)か。
  • Bit 2 (Aggregation): このリンクがアグリゲーション可能(集約可能)であるか。
  • Bit 3 (Synchronization): ここが最重要! 相手とパラメータ(Keyや速度など)が完全に一致し、束ねる準備が「同期(In-Sync)」しているかを示すフラグ。これが 1 にならないと、トラフィックは流れ始めません。
  • Bit 4 (Collecting): このポートが受信フレームの処理(収集)を行っているか。
  • Bit 5 (Distributing): このポートが送信フレームの送出(分散)を行っているか。
  • Bit 6 (Defaulted): パートナーからのLACPDUが途絶えたため、デフォルト値にフォールバックしているか。
  • Bit 7 (Expired): タイムアウト期限を超過した状態。

実務の現場で「LACPがUpしない!」という障害に直面したとき、パケットキャプチャや機器のデバッグコマンドで確認すべきは、まさにこの Synchronization と Distributing が 1 に立っているか否か、ただそれだけです。

—

4. 現場で役立つ!実機設定とデバッグの作法

理論を理解したところで、実務へのアプローチを見ていきましょう。今回はLinux(bonding / team)と、Ciscoライクなスイッチでの設定例・トラブルシューティング手順を公開します。

A. Linux (Ubuntu / RHEL) におけるLACP (Mode 4) 設定例

現代のWebインフラでは、ベアメタルサーバやハイパーバイザー(KVM/Proxmox等)でLinuxのBonding(802.3ad)を使う機会が多々あります。以下は、Netplan(Ubuntu等)を用いた設定サンプルです。

# /etc/netplan/01-netcfg.yaml
network:
  version: 2
  renderer: networkd
  ethernets:
    enp3s0:
      dhcp4: no
    enp4s0:
      dhcp4: no
  bonds:
    bond0:
      interfaces:
        - enp3s0
        - enp4s0
      parameters:
        mode: 802.3ad          # LACPモードを指定
        mii-mon: 100           # リンク監視間隔(ms)
        lacp-rate: fast        # LACPDUの送信頻度をFast(1秒)に設定 (デフォルトはslow)
        transmit-hash-policy: layer3+4 # ハッシュアルゴリズムの指定(負荷分散の要)
      addresses:
        - 192.168.10.100/24
      gateway4: 192.168.10.1
      nameservers:
        addresses:
          - 8.8.8.8

> シニアの現場Tips: lacp-rate: fast は、物理リンクの断線や障害発生時のフェイルオーバーを劇的に高速化(約3秒以内)させます。ただし、スイッチ側のCPU負荷がわずかに上がるため、大規模なポート数を持つ環境ではスイッチのスペックに注意してください。また、transmit-hash-policy は layer3+4(送信元/宛先IPおよびポート番号をハッシュ化)にすることで、複数セッションのトラフィックが綺麗に物理回線へ分散されます。

—

B. Ciscoスイッチ側(Cisco IOS)の対応コンフィグ

サーバ側を受け止めるCisco CatalystやNexusスイッチ側の設定は、Channel-Groupを active モードで作成するのが鉄則です。

! 物理インターフェースの定義 (GigabitEthernet 0/1 と 0/2 を束ねる)
interface GigabitEthernet0/1
 description === Server-01 Port 1 ===
 channel-group 1 mode active
 no shutdown

interface GigabitEthernet0/2
 description === Server-01 Port 2 ===
 channel-group 1 mode active
 no shutdown

! 論理ポートチャネル(Po1)の定義
interface Port-channel1
 description === LACP Trunk to Server-01 ===
 switchport mode trunk
 switchport trunk allowed vlan 10,20,30

—

C. トラブルシューティング:LACPが枯渇したときのデバッグ手順

もし「ポートチャネルがUpしない(Err-Disabledになる、あるいはBundledにならない)」という状況に陥ったら、以下の手順でパケットとステータスを追いかけます。

1. スイッチ側のLACPネイバー状態を確認する

Cisco IOSであれば、以下のコマンドでActorとPartnerの情報(KeyやState)が一致しているかを一目で確認できます。

# LACPのネイバー詳細とステートを確認するコマンド
show lacp neighbor

*確認のポイント*: 相手側のSystem IDやKeyが意図した値になっているか、そしてステートに F(Fwd / Distributing)や S(Sync)の文字が点灯しているかを確認します。

2. パケットキャプチャでワイヤー上の現実を見る

スイッチのミラーポート、あるいはLinuxサーバ上で tcpdump を用いてLACPDUが生で流れているかを確認します。

# Linuxサーバ上でLACPDU(Ethertype 0x8809)をリアルタイムにキャプチャする
sudo tcpdump -i bond0 -nnvv "ether proto 0x8809"

コンソールに LACP v1, length 110... といったログが流れてくれば、物理層とLACPのデーモンは正常に動作しています。逆にこれが一切流れていない場合は、物理ケーブルの断線、SFPモジュールの不具合、あるいはVLANやトランク設定のミスマッチ(ネイティブVLANの不一致など)を疑うべきです。

—

5. おわりに:プロトコルの行間に隠された真実

LACPDUというわずか数十バイトの小さなパケット。その中には、ネットワーク機器同士が「お前を相棒と認めた」「いや、まだ同期が終わっていない」と静かに語り合うドラマが詰まっています。

インフラやWeb APIの設計において、冗長性とスループットの確保は避けて通れない命題です。表面的なコマンドのコピペにとどまらず、「今、ワイヤーの上で何が交わされているのか」というパケットの息吹を感じ取れるエンジニアこそが、障害の迷宮から一瞬で生還できる真のプロフェッショナルです。

さあ、今日のログ確認とパケット解析の旅に出かけましょう。あなたのネットワークに、穏やかなパケットの奔流がありますように。

コメント

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