本页目录

路由与 BGP

互联网的路由分两段:IGP(OSPF/IS-IS)管域内,BGP 管域间。BGP 不是选"最快"路径,而是按 AS_PATH、local pref、MED 的优先级链选"策略最优"路径——它是互联网政治版图的体现。

概述

路由是互联网的"导航系统"——决定 IP 包从哪条路径到达目标。单台主机只需默认网关,但自治系统(AS)之间通过 BGP 交换可达性信息:目前全互联网 BGP 表约 95 万条 prefix。BGP 不是"选最快路径"——它是基于策略(business relationship, traffic engineering),最短 AS PATH 只是众多决策因素之一。在自治系统内部,OSPF/IS-IS 用链路状态算法计算最短路径。Linux 既可以做主机路由(ip route),也可以跑 BGP daemon(FRRouting/BIRD)成为全功能路由器。

路由表架构

RIB vs FIB

RIB (Routing Information Base):
  control plane — 路由协议 (BGP/OSPF) 学习到的所有路由
  存在用户态 daemon (FRRouting/BIRD/bgpd) 中
  可能非常大 (全 internet BGP table: ~950K prefixes)

FIB (Forwarding Information Base):
  data plane — 实际用于转发的路由表
  从 RIB 选出 best paths → 安装到内核 (ip route add)
  必须高度优化 (LC-trie for Linux, O(1) lookup for longest prefix match)

Linux 内核路由表:
  table local (255): 本地接口地址, 自动
  table main (254): 主路由表 (默认)
  table default (253): 默认路由
  table N (1-252): 用户自定义

策略路由

# 除了 destination-based routing, Linux 支持 policy routing:
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 遍历 → 第一个匹配的 rule
# 每个 table: longest prefix match (trie 查找)

BGP 协议

BGP Session

BGP 使用 TCP port 179 建立 session:

  1. TCP 3-way handshake → port 179
  2. BGP OPEN:
       Version: 4
       My AS: <local ASN, 16 or 32 bit>
       Hold Time: <通常 90s>
       BGP Identifier: <router ID, 通常是 loopback IP>
       Optional Parameters: Capabilities (4-byte ASN, MP-BGP, Route Refresh, ...)

  3. BGP KEEPALIVE: 心跳, Hold Time/3 间隔 (默认 30s)

  4. BGP UPDATE: 路由宣告 / 撤销
       Withdrawn Routes: 要撤销的 prefix 列表
       Path Attributes: 新 prefix 的属性
         ORIGIN: IGP (network statement) / EGP / INCOMPLETE (redistribution)
         AS_PATH: 路径上的 AS 序列 (加自己的 AS#)
         NEXT_HOP: 下一跳 IP
         MED (MULTI_EXIT_DISC): 多出口鉴别器 (低=优先)
         LOCAL_PREF: 本地优先级 (高=优先, 不传出 AS)
         COMMUNITIES: 32-bit tags

       NLRI (Network Layer Reachability Information): 实际 prefix 列表

AS_PATH 与 Loop Prevention

AS_PATH 是 BGP 的防环机制:
  收到路由 → 如果自己的 AS 在 AS_PATH 中 → 拒绝 (环路!)

AS_PATH 操作:
  eBGP: 发出时 preprend 自己的 AS#
  iBGP: 不 preprend (同 AS 内传播)

AS_PATH Prepend (流量工程):
  AS 100: 宣告 prefix 1.1.1.0/24 到 upstream A: AS_PATH = 100 100 100
          宣告同一 prefix 到 upstream B: AS_PATH = 100
  → 互联网看到: 到 1.1.1.0/24 的 path 经 B 更短 → 选择 B
  → 但 A 仍有此 prefix (备用)

BGP Communities

32-bit community tag, 格式: ASN:value

标准 Communities:
  NO_EXPORT (0xFFFFFF01):    不传播到 eBGP peers
  NO_ADVERTISE (0xFFFFFF02): 不传播到任何 BGP peer
  LOCAL_AS (0xFFFFFF03):     不传播到外部 AS (confederation-aware)

Extended Communities (8 bytes):
  Type + Value → SOO (Site of Origin), RT (Route Target for VPN), ...

Large Communities (RFC 8092, 12 bytes):
  Global Admin (4) + Local Data 1 (4) + Local Data 2 (4)
  → 更多 tagging 空间, 不再受限 16-bit ASN

Best Path Selection

Cisco/Huawei BGP best path algorithm (简化):

  1. Highest Weight (Cisco proprietary, local to router)
  2. Highest LOCAL_PREF (default 100)
  3. Prefer locally originated
  4. Shortest AS_PATH length
  5. Lowest ORIGIN type (IGP < EGP < INCOMPLETE)
  6. Lowest MED (来自同一 AS 时比较)
  7. Prefer eBGP over iBGP
  8. Lowest IGP metric to NEXT_HOP
  9. (如果 multi-path enabled) — ECMP over equal paths
  10. Oldest eBGP route (稳定性)
  11. Lowest Router ID (最终的 tie-breaker)

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

# Hash: 默认 src_ip + dst_ip → 同一 flow 始终走同一路径
# 权重: 按比例分配 (weight 2 = 2× traffic)

参考

  • RFC: 4271 (BGP-4), 6793 (4-byte ASN), 8092 (Large Communities), 2992 (ECMP)
  • 源码⁠: net/ipv4/fib_trie.c (FIB trie), net/ipv4/fib_rules.c (policy routing)
  • 工具⁠: 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