本页目录
路由与 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:
# → 来自 192.168.1.0/24 的流量走 table 100
# → iptables -j MARK --set-mark 1 → 走 table 200
# → 从 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: 多路径负载均衡
# 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