このページの目次
ルーティングと 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 はポリシールーティングをサポートする:
# → 192.168.1.0/24 からのトラフィックは table 100 を使用する
# → iptables -j MARK --set-mark 1 → table 200 を使用する
# → 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: 複数経路での負荷分散
# ハッシュ: デフォルトは 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