このページの目次

ルーティングと BGP

インターネットのルーティングは2段構成:IGP(OSPF/IS-IS)がドメイン内を管理し、BGPがドメイン間を管理する。BGPは「最速」経路を選ぶのではなく、AS_PATH、local pref、MEDの優先度チェーンに基づいて「ポリシー最適」な経路を選択する——それはインターネットの政治地図の現れである。

概要

ルーティングはインターネットの「ナビゲーションシステム」であり、IPパケットがどの経路を経て宛先に到達するかを決定する。単一のホストではデフォルトゲートウェイだけで十分だが、自律システム(AS)間では BGP を用いて到達可能情報を交換する。現在、インターネット全体の BGP テーブルには約 95 万個のプレフィックスが存在する。BGP は「最速」経路を選ぶものではなく、ポリシー(ビジネス関係、トラフィックエンジニアリング)に基づいて動作し、最短 AS PATH は意思決定要因の一つに過ぎない。自律システム内部では、OSPF/IS-IS がリンクステートアルゴリズムを用いて最短経路を計算する。Linux はホストルーティング(ip route)を実行できるだけでなく、BGP デーモン(FRRouting/BIRD)を実行してフル機能のルーターとなることも可能である。

ルーティングテーブルのアーキテクチャ

RIB と FIB

RIB (Routing Information Base):
  コントロールプレーン — ルーティングプロトコル (BGP/OSPF) によって学習されたすべてのルート
  ユーザー空間のデーモン (FRRouting/BIRD/bgpd) に存在
  非常に大きくなる可能性がある (インターネット全体 BGP テーブル: プレフィックス約 950K)

FIB (Forwarding Information Base):
  データプレーン — 転送に実際に使用されるルーティングテーブル
  RIB から best paths を選択し、カーネルにインストール (ip route add)
  高度に最適化する必要がある (Linux 用 LC-trie、最長プレフィックスマッチ用 O(1) ルックアップ)

Linux カーネルルーティングテーブル:
  table local (255): ローカルインターフェースアドレス、自動
  table main (254): メインルーティングテーブル (デフォルト)
  table default (253): デフォルトルート
  table N (1-252): ユーザー定義

ポリシールーティング

# 宛先ベースのルーティングに加え、Linux はポリシールーティングをサポートする:
ip rule add from 192.168.1.0/24 table 100 priority 100
# → 192.168.1.0/24 からのトラフィックは table 100 を使用する

ip rule add fwmark 1 table 200
# → iptables -j MARK --set-mark 1 → table 200 を使用する

ip rule add iif eth0 table 300
# → eth0 で受信したパケット → table 300 を使用する

# 検索: ip rule → priority 0→32766 を順に走査 → 最初に一致するルール
# 各テーブル: 最長プレフィックスマッチ (トライ検索)

BGP プロトコル

BGP セッション

BGP は TCP port 179 を使用してセッションを確立する:

  1. TCP 3ウェイハンドシェイク → port 179
  2. BGP OPEN:
       Version: 4
       My AS: <ローカル ASN、16ビットまたは32ビット>
       Hold Time: <通常 90秒>
       BGP Identifier: <ルーターID、通常はループバックIP>
       Optional Parameters: Capabilities (4バイト ASN、MP-BGP、Route Refresh、...)

  3. BGP KEEPALIVE: ハートビート、Hold Time/3 の間隔 (デフォルト 30秒)

  4. BGP UPDATE: ルート宣告 / 取消
       Withdrawn Routes: 取消するプレフィックスのリスト
       Path Attributes: 新規プレフィックスの属性
         ORIGIN: IGP (network statement) / EGP / INCOMPLETE (リダイストリビューション)
         AS_PATH: 経路上の AS シーケンス (自身の AS# を追加)
         NEXT_HOP: 次ホップ IP
         MED (MULTI_EXIT_DISC): 複数出口識別子 (低い値=優先)
         LOCAL_PREF: ローカル優先度 (高い値=優先、AS 外には伝播しない)
         COMMUNITIES: 32ビットタグ

       NLRI (Network Layer Reachability Information): 実際のプレフィックスリスト

AS_PATH とループ防止

AS_PATH は BGP のループ防止メカニズムである:
  ルートを受信 → AS_PATH に自身の AS が含まれている場合 → 拒否 (ループ!)

AS_PATH 操作:
  eBGP: 送信時に自身の AS# を preprend (先頭に追加)
  iBGP: preprend しない (同一 AS 内での伝播)

AS_PATH Prepend (トラフィックエンジニアリング):
  AS 100: プレフィックス 1.1.1.0/24 を upstream A に宣告: AS_PATH = 100 100 100
          同じプレフィックスを upstream B に宣告: AS_PATH = 100
  → インターネット側は: 1.1.1.0/24 への経路が B 経由の方が短いと認識 → B を選択
  → ただし A にもこのプレフィックスは存在する (バックアップ)

BGP Communities

32ビットのコミュニティタグ、形式: ASN:value

標準コミュニティ:
  NO_EXPORT (0xFFFFFF01):    eBGP ピアへ伝播しない
  NO_ADVERTISE (0xFFFFFF02): 任意の BGP ピアへ伝播しない
  LOCAL_AS (0xFFFFFF03):     外部 AS へ伝播しない (confederation 対応)

拡張コミュニティ (8バイト):
  Type + Value → SOO (Site of Origin)、RT (VPN 用 Route Target)、...

大規模コミュニティ (RFC 8092、12バイト):
  Global Admin (4) + Local Data 1 (4) + Local Data 2 (4)
  → より多くのタグ付けスペース、16ビット ASN に制限されない

Best Path Selection

Cisco/Huawei BGP best path アルゴリズム (簡略化):

  1. Highest Weight (Cisco 独自、ルーターローカル)
  2. Highest LOCAL_PREF (デフォルト 100)
  3. ローカル生成されたルートを優先
  4. 最短 AS_PATH 長
  5. Lowest ORIGIN 種別 (IGP < EGP < INCOMPLETE)
  6. Lowest MED (同一 AS からのものである場合のみ比較)
  7. eBGP を iBGP より優先
  8. NEXT_HOP への最低 IGP メトリック
  9. (multi-path が有効な場合) — 同等経路での ECMP
  10. 最古の eBGP ルート (安定性)
  11. Lowest Router ID (最終的な同点解除)

ECMP

# Equal-Cost Multi-Path: 複数経路での負荷分散
ip route add 10.0.0.0/8 nexthop via 192.168.1.1 weight 1 \
                        nexthop via 192.168.1.2 weight 1

# ハッシュ: デフォルトは src_ip + dst_ip → 同一フローは常に同一経路を使用
# 重み: 比率に応じて分散 (weight 2 = トラフィックの 2倍)

参考

  • RFC: 4271 (BGP-4)、6793 (4バイト ASN)、8092 (Large Communities)、2992 (ECMP)
  • ソースコード⁠: net/ipv4/fib_trie.c (FIB trie)、net/ipv4/fib_rules.c (ポリシールーティング)
  • ツール⁠: FRRouting (vtysh -c "show ip bgp")、BIRD (birdc show route)、ip route

Keywords: BGP, AS, AS_PATH, LOCAL_PREF, MED, community, FIB, RIB, policy routing, ECMP, FRR