【実務・中級編】 スタティックリンクアグリゲーション(PAGP / 独自チーミング)の挙動とリスク – インフラ・物理&L2/L3ネットワーク基礎実践ガイド

冗長化のつもりが「死のループ」を招く? スタティックリンクアグリゲーションの闇と実務リスク

こんにちは、インフラアーキテクトのシニア・エンジニアです。これまでに幾度となく本番環境のネットワーク障害や不可解なパケットドロップの洗礼を受けてきましたが、その中でも特に「初心者がやりがち、かつベテランでも構成ミスで冷や汗をかく」のが、今回取り上げるスタティックリンクアグリゲーションの挙動とリスクです。

「とりあえずLACP(IEEE 802.3ad)の設定めんどくさいから、両端でスタティックにポートを束ねちゃおうぜ」
――もしあなたが、あるいはあなたのチームのメンバーがそんなノリで手動チーミング(Ciscoで言う mode on や、各ベンダーのスタティック・モード)を本番投入しようとしているなら、ちょっと待ってください。そのペンディングされたネゴシエーションの欠如が、ネットワーク全体を飲み込むブロードキャストストーム(死のループ)を引き起こす導火線になり得るのです。

今回は、プロトコルを伴わないスタティックリンクアグリゲーションのメカニズムと、誤接続時に何が起きるのかというリアルなパケットの挙動、そして現場で身を守るための実務的知見を徹底解説します。

—

1. なぜ「スタティック(静的)」なのか? LACPとの決定的な違い

現代のデータセンターや企業ネットワークにおいて、複数の物理リンクを束ねて論理的な大容量パスを作る「リンクアグリゲーション(IEEE 802.3ad / LACP)」は、もはやインフラの空気のような存在です。

しかし、LACPが動的に対向機器とフレーム(LACPDU)を交換し、「お互いのポートが正しくアグリゲーションのグループに入っているか」「リンクの速度や全二重/半二重の設定が一致しているか」を厳密にチェックし合うのに対し、スタティックリンクアグリゲーションは一切の対話を行いません。

ネゴシエーション欠如の代償

スタティック設定(Cisco IOSであれば channel-group X mode on)は、人間が「このポートとこのポートは同じグループだ」とスイッチに思い込ませる設定です。
対向のスイッチが何であろうと、LACPDUを喋ろうが喋らなかろうが、送信元は問答無用でトラフィックをハッシュアルゴリズムに基づいて各物理ポートへ分散・送出します。受信側も、ポートごとに独立して入ってきたフレームを「よし、同じ論理インターフェースの受信バッファに入れたぞ」と無理やりマージします。

つまり、「お互いの認識がズレていても、スイッチはエラーを出さずにそのままパケットを流し続ける」という、極めてドライで危険な特性を持っています。

—

2. 現場で一番怖い「誤接続・片側設定ミス」のパケットフロー

では、この「お互いに確認を取らない」仕様が、現場でどのような惨劇を生むのか。最もよくある実例として、「スタティックで束ねられたポートの片側だけを誤って別のスイッチや、異なるポートに接続してしまった場合」の挙動を追ってみましょう。

構成シナリオ

  • CoreスイッチA: Gi0/1, Gi0/2 をスタティックなポートチャネル(Po1)として設定。
  • AccessスイッチB:
  • Gi0/1 は CoreスイッチAの Gi0/1 へ。
  • 【誤接続】 Gi0/2 は、なんと誤って AccessスイッチB自身の別のポート(ループ) または 全く関係ない別系統のスイッチへ接続してしまった。

この瞬間、ネットワーク内では何が起きているでしょうか?

[Core Switch A]
   | (Gi0/1) ------ (Gi0/1) [Access Switch B]
   |                                  |
   | (Gi0/2) --(誤って変なとこへ接続)--+ (Gi0/2) [自社内でのループ発生!]

1. トラフィックの分散送信: CoreスイッチAは、Po1宛てのブロードキャストや不明なユニキャストフレームを、Gi0/1 と Gi0/2 の両方に送り出します。
2. 片側の迷子: Gi0/1 を通ったパケットは正常にAccessスイッチBへ届きますが、Gi0/2 を通ったパケットは誤接続先をグルグルと回り始めます。
3. LACPなら防げたはずの悲劇: もしこれがLACPであれば、対向機器からのLACPDUが不一致または不通となるため、ポートは Hot-Standby または Error-Disabled になり、物理リンクはシャットダウンされます。しかし、スタティック(mode on)には「リンクが物理的にUpしている=通信可能」という判断基準しかありません。STP(Spanning Tree Protocol)が走っていなければ、この瞬間にブロードキャストストームが発生し、数秒でネットワーク全体がCPU使用率100%の沈黙状態に陥ります。

—

3. 実設定ファイルと現場でのデバッグTips

では、実際にネットワーク機器(Cisco IOSを例に取ります)でスタティックリンクアグリゲーションを設定する場合と、その状態を確認・トラブルシューティングするコマンドを見ていきましょう。

設定例(Cisco IOS)

以下の設定は、Ciscoスイッチ間をスタティック(mode on)で冗長化する例です。あえてLACPを使わないレガシーな機器との接続などを想定しています。

! --- CoreスイッチA側の設定 ---
interface GigabitEthernet0/1
 description === Link to Access Switch B (Primary) ===
 channel-group 1 mode on   ! プロトコルを使わず強制的にPo1に所属させる
!
interface GigabitEthernet0/2
 description === Link to Access Switch B (Secondary/Static) ===
 channel-group 1 mode on   ! ネゴシエーションなしで強制束ね
!
interface Port-channel 1
 description === Uplink to Access Switch B (Static Aggregation) ===
 switchport mode trunk
 switchport trunk allowed vlan 10,20,30

運用時のトラブルシューティング・コマンド

もし「通信が不安定だ」「特定の宛先だけパケットがロストする」というトラブルに遭遇した際、スタティック構成のスイッチで確認すべきポイントは、「本当に両端のハッシュやポート構成が一致しているか」です。

! ポートチャネルの全体的な稼働状況と、各物理ポートが正しく束ねられているか確認
# show etherchannel summary
Flags:  D - down P - bundled in port-channel
        I - stand-alone s - suspended
        H - Hot-standby (LACP only)
        R - L3   S - L2
        U - in use to forward

Number of channel-groups in use: 1
Number of aggregators: 1

Group  Port-channel  Protocol    Ports
------+-------------+-----------+-----------------------------------------------
1      Po1(SU)       -           Gi0/1(P) Gi0/2(P)

*注目ポイント*: Protocol の欄が - (ハイフン)になっています。これはLACPやPAgPなどのプロトコルが稼働しておらず、スタティック(強制)で束ねられている証拠です。

さらに、各物理ポートのトラフィック偏り(ロードバランスの偏り)を確認するには、以下のコマンドを使います。

! ポートチャネル内のトラフィック分散状況をチェック
# show etherchannel load-balance

スタティックリンクアグリゲーションでは、送信元のIP/MACアドレスと宛先のIP/MACアドレスのハッシュ値に基づいてポートを決定するため、特定のセッション(例:巨大なバックアップファイル転送など)が1本の物理リンクに偏ることがあります。「冗長化しているのに、なぜか1Gbpsの回線のうち片方しか帯域を使っていない」という現象も、このハッシュアルゴリズムの特性に起因します。

—

4. APIや自動化スクリプトからの死活監視・構成管理

現代のインフラ運用では、このようなレイヤー2の構成ミスを人間頼みにせず、APIやネットワーク自動化ツール(Python等)で定期的に検知・監査することが求められています。

以下は、Pythonの requests ライブラリ(またはネットワーク機器のRESTCONF/NETCONF APIを想定した概念コード)を用いて、スイッチのポートチャネル状態を定期的に取得し、スタティック設定(mode on)のポートで異常なエラーカウンタやリンクフラップが発生していないかを監視するスクリプトの例です。

import requests
import json
from requests.auth import HTTPBasicAuth

# ネットワーク機器のAPIエンドポイント設定(例: Cisco IOS-XE RESTCONF)
DEVICE_IP = "192.168.100.1"
API_URL = f"https://{DEVICE_IP}/restconf/data/Cisco-IOS-XE-ethernet:ethernet-groups/ethernet-group=1"
AUTH = HTTPBasicAuth("admin", "secure_password")

def check_static_etherchannel():
    """
    スタティックリンクアグリゲーションの状態をAPI経由で取得し、
    ポートのダウンや異常なエラーがないかを監査する関数
    """
    headers = {
        "Accept": "application/yang-data+json",
        "Content-Type": "application/yang-data+json"
    }

    try:
        response = requests.get(API_URL, auth=AUTH, headers=headers, verify=False)
        
        if response.status_code == 200:
            data = response.json()
            # レスポンスからポートチャネルのステータスを抽出
            # (※データ構造はベンダーのYANGモデルに依存します)
            channel_data = data.get("Cisco-IOS-XE-ethernet:ethernet-group", {})
            group_status = channel_data.get("status", "unknown")
            
            print(f"[INFO] EtherChannel Group 1 Status: {group_status}")
            
            if group_status != "up":
                print("[WARNING] ポートチャネルがダウンしています!結線と設定を確認してください。")
                # ここにSlackやPagerDutyへのアラート通知処理を記述
            else:
                print("[OK] ポートチャネルは正常に稼働しています。")
                
        else:
            print(f"[ERROR] APIからのデータ取得に失敗しました。Status Code: {response.status_code}")

    except requests.exceptions.RequestException as e:
        print(f"[CRITICAL] ネットワーク機器への接続に失敗しました: {e}")

if __name__ == "__main__":
    check_static_etherchannel()

このように、インフラをコードやAPIで管理する時代であっても、L2の低レイヤーにおける「プロトコル不在の恐怖」を理解していなければ、自動化スクリプトすらも誤った構成をそのまま盲信してしまうリスクがあります。

—

まとめ:スタティックリンクアグリゲーションを使うべきではない場面

最後に、シニアエンジニアとしての実務的な教訓をまとめます。

1. 基本はLACP(IEEE 802.3ad)を使え: 現代の機器でLACPをサポートしていないハードウェアはほぼ存在しません。特別な理由(レガシー機器との接続など)がない限り、mode on ではなく mode active (LACP)を選択し、ネゴシエーションによる安全性(フェイルセーフ)を確保してください。
2. スタティックを使うなら、物理配線とドキュメントを厳格に管理せよ: どうしてもスタティックにせざるを得ない場合は、誤接続が即座にネットワークの死を招くことを意識し、ラベリングやケーブリングの監査を徹底すること。
3. STP(Spanning Tree Protocol)を過信しない: STPが動いていればループは防げる、というのは理想論です。大規模な環境やスパニングツリーのコンバージェンス(収束)遅延が発生する最悪のタイミングでは、ブロードキャストストームによるパケットの洪水を防ぎきれないケースがあります。

「動いているからヨシ」ではなく、「なぜ動いているのか、何が担保されているのか」を意識して、堅牢なネットワークを構築していきましょう。

コメント

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