BGP 是互联网的「黏合剂」:它把全球数十万个自治域(AS)连接成一张可路由的网络。与 OSPF 这类内部网关协议(IGP)不同,BGP 的决策以策略为主导而非单纯的最短路径。理解 BGP,是理解互联网路由骨架、构建多云与数据中心网络的必修课。
一、BGP 基本概念
1.1 自治域 AS 与 BGP 分类
自治域(AS) 是拥有统一路由策略的单一网络实体,用 16/32 位 ASN 标识(公网 1-64511,私网 64512-65535)。
AS 100 ── eBGP ──► AS 200 ── eBGP ──► AS 300
│ │
└── iBGP(域内)──┘
eBGP:不同 AS 之间的邻居(External BGP)
- 邻居关系跨 AS,用于传递全网可达性
iBGP:同一 AS 内部的路由器之间(Internal BGP)
- 邻居关系在域内,用于传播学习到的 eBGP 路由
| 类型 | 邻居所在 | 传递范围 | 关键规则 |
|---|---|---|---|
| eBGP | 不同 AS | 跨 AS 传播 | 默认 TTL=1,路径属性可修改 |
| iBGP | 同一 AS | 域内传播 | 默认不修改 NEXT_HOP/AS_PATH |
| 联盟/反射器 | 域内优化 | 简化 iBGP 全网状 | Route Reflector、BGP Confederation |
1.2 路径属性(Path Attributes)
BGP 路由携带一组路径属性,决策正是基于这些属性:
| 属性 | 类别 | 作用 |
|---|---|---|
| AS_PATH | Well-known | 记录经过的 AS 序列,防环 |
| NEXT_HOP | Well-known | 下一跳地址 |
| ORIGIN | Well-known | 路由来源(IGP/EGP/Incomplete) |
| LOCAL_PREF | Well-known(可选) | 本地优先值,越大越优 |
| MED | 可选 | 向邻居建议进入本 AS 的优选路径,越小越优 |
| COMMUNITY | 可选 | 标记路由,便于策略批量操作 |
AS_PATH 示例:
route 192.0.2.0/24
AS_PATH: [100, 200, 300] # 经过 AS300→AS200→AS100 传到本地
防环:路由器不会再次通告包含自己 ASN 的路由
一句话:BGP 不是找「最短路径」,而是按「策略最优」选路——AS_PATH 只是众多决策因子之一。
二、BGP 会话与配置实战
2.1 eBGP 邻居配置(FRR/Bird 示例)
# FRR(Free Range Routing)中的 BGP 配置
# /etc/frr/frr.conf
router bgp 65001
bgp router-id 10.0.1.1
no bgp default ipv4-unicast
# eBGP 邻居:上游运营商 AS 64512
neighbor 203.0.113.1 remote-as 64512
neighbor 203.0.113.1 ebgp-multihop 2
neighbor 203.0.113.1 description "ISP-A uplink"
# iBGP 邻居:域内核心路由器
neighbor 10.0.1.2 remote-as 65001
neighbor 10.0.1.2 update-source lo0
# 通告本地网段
address-family ipv4 unicast
network 192.0.2.0/24
neighbor 203.0.113.1 activate
neighbor 10.0.1.2 activate
exit-address-family
2.2 邻居状态机
BGP 邻居经历 Idle → Connect → OpenSent → OpenConfirm → Established 五个状态:
Idle ──启动──► Connect ──TCP 建立──► OpenSent ──收到 OPEN──► OpenConfirm ──收到 KEEPALIVE──► Established
│ │ │
└─◄──重试─────┘ OPEN 携带 holdtime/capability 正常收发 UPDATE
│
└─◄─ KEEPALIVE 每 60s
# 查看 BGP 邻居状态
vtysh -c "show bgp summary"
# BGP router identifier 10.0.1.1, local AS number 65001
# Neighbor V AS MsgRcvd MsgSent InQ OutQ Up/Down State/PfxRcd
# 10.0.1.2 4 65001 102 98 0 0 00:12:33 Established
# 203.0.113.1 4 64512 918 912 0 0 02:14:09 Established
# 查看学习到的路由
vtysh -c "show bgp ipv4 unicast 192.0.2.0/24"
三、路由决策流程
3.1 BGP 选路顺序
当收到同一条前缀的多条路由时,BGP 按以下顺序择优(遇到第一个能区分的属性即定胜负):
1. 优选权重最大(Weight,Cisco 私有,本地有效)
2. 优选 LOCAL_PREF 最大
3. 本地始发路由优先于学习到的路由
4. 优选 AS_PATH 最短
5. 优选 ORIGIN 类型(IGP > EGP > Incomplete)
6. 优选 MED 最小
7. 优选 eBGP 路由(优于 iBGP)
8. 优选到 NEXT_HOP 的 IGP 度量最小
9. 若多条等价,可负载均衡(ECMP)或继续比较 Router-ID
同前缀 3 条路径决策示例:
路径 A:LOCAL_PREF 100, AS_PATH [64512]
路径 B:LOCAL_PREF 200, AS_PATH [64512] ← 胜出(LOCAL_PREF 更大)
路径 C:LOCAL_PREF 100, AS_PATH [64512, 64513]
一句话:BGP 选路是「逐条比较属性优先级」的确定性过程,运维通过修改 LOCAL_PREF/MED/AS_PATH 来影响路由走向。
3.2 基于 COMMUNITY 的选路策略
# 常见运营商做法:用 COMMUNITY 标记路由再统一动作
# 例如 AS 64512 的 community 规则:
# 64512:90 → 本地优先值 90
# 64512:120 → 本地优先值 120(更优先)
# 64512:666 → 丢弃(黑洞路由)
router bgp 65001
bgp community-list standard DROP seq 5 permit 64512:666
neighbor 203.0.113.1 route-map ISP-IN in
!
route-map ISP-IN permit 10
match community DROP
set ipv4 next-hop 192.0.2.1 # 或者直接 deny 实现黑洞
route-map ISP-IN permit 20
set community additive # 保留原始 community 并附加本地标记
四、多路径与 ECMP
4.1 ECMP 与多路径 BGP
同一前缀存在多个等价下一跳时,可以启用多路径负载均衡:
# 开启 BGP 多路径(FRR)
router bgp 65001
maximum-paths 4 # eBGP 多路径
maximum-paths ibgp 2 # iBGP 多路径
# 查看 ECMP 明细
vtysh -c "show bgp ipv4 unicast 0.0.0.0/0"
# Network Next Hop Metric LocPrf Weight Path
# *> 0.0.0.0/0 203.0.113.1 0 0 64512 i
# * 203.0.113.5 0 0 64512 i
# * 198.51.100.1 0 0 64512 i
一句话:ECMP 让多条等价 BGP 路径同时承载流量,是「多出口带宽聚合」的基础,也天然提升了链路冗余性。
4.2 ECMP 的哈希一致性
ECMP 按流哈希分流,必须保证同一五元组固定走同一路径,否则乱序:
ECMP 哈希输入:src IP + dst IP + src port + dst port + proto
→ 哈希取模映射到下一跳
→ 同一 TCP 流的包始终选同一路径
# Linux 内核 ECMP 路由(等价下一跳 + 逐流哈希)
ip route add default \
nexthop via 203.0.113.1 dev eth0 weight 1 \
nexthop via 203.0.113.5 dev eth1 weight 1
五、BGP 故障场景:黑洞与震荡
5.1 路由黑洞(Black Hole)
路由黑洞指路由有通告、无实际转发能力——报文被静默丢弃:
产生黑洞的典型原因:
1. 设备上通告了路由,但实际没有对应的转发条目
2. 边界设备误将流量引入不通的下一跳
3. 防火墙/ACL 放行控制面却丢转发面流量
4. 部分集群黑洞:聚合路由存在但内部节点已失效
# 排查黑洞:用回环源探测 + 逐跳查看转发
ping -S 192.0.2.1 -c 3 203.0.113.9
# 追踪路由是否在本地有真实出接口
ip route get 203.0.113.9
# 查看 BGP 是否把路由学到了但未装表
vtysh -c "show ip route 203.0.113.9"
DDoS 场景的反向黑洞(RTBH):被攻击时把受害 IP 通告为黑洞路由,让上游丢弃攻击流量——常见用 community 标记 64512:666 触发上游丢弃。
5.2 路由震荡(Route Flap)
路由频繁撤销与通告(Flap)会导致全网路由表抖动、CPU 飙升。缓解手段:
# 路由阻尼(Route Damping)——FRR 配置示例
router bgp 65001
bgp dampening 15 750 2000 60
# 参数:半衰期 15min,上限 750,抑制阈值 2000,最大抑制 60min
| 故障 | 症状 | 定位手段 |
|---|---|---|
| 黑洞 | 连通性中断但路由表正常 | ping + ip route get 对比 |
| 震荡 | BGP 会话反复 Up/Down | show bgp summary 看 Flap 计数 |
| 环路 | 路由来回传播 | 检查 AS_PATH 是否含自己 |
| 收敛慢 | 切换链路后仍访问旧路径 | 检查 holdtime、KEEPALIVE 间隔 |
| 前缀劫持 | 流量被错误引导到第三方 AS | RPKI / IRR 校验 |
5.3 前缀劫持与 RPKI
BGP 信任模型脆弱,任何人可通告任意前缀。RPKI(Resource Public Key Infrastructure) 用 ROA 记录验证「AS 是否有权通告该前缀」:
# 查看 RPKI 生效状态(FRR 集成)
vtysh -c "show bgp ipv4 unicast 192.0.2.0/24"
# ... Path #1: Received by 203.0.113.1 from 203.0.113.1
# Origin AS 64512, VALID ← RPKI 验证结果
| RPKI 状态 | 含义 | 建议动作 |
|---|---|---|
| VALID | ROA 匹配,可安全接收 | 正常接收 |
| INVALID | ROA 明确不匹配(劫持嫌疑) | 拒绝/降低优先级 |
| NOT_FOUND | 无 ROA 记录 | 按本地策略处理 |
六、与 OSPF/IS-IS 的协同
6.1 IGP 与 BGP 的分工
控制面分层:
┌────────────────────────────────────────────┐
│ BGP(EGP):域间路由,跨 AS 可达性 │
│ - 策略驱动、属性丰富、规模可达几十万条 │
├────────────────────────────────────────────┤
│ OSPF / IS-IS(IGP):域内路由,内部可达性 │
│ - 算法驱动(SPF 最短路径)、秒级收敛 │
│ - 只承载内部网段,规模数千条 │
└────────────────────────────────────────────┘
| 维度 | BGP | OSPF | IS-IS |
|---|---|---|---|
| 适用域 | 域间/全网 | 域内 | 域内 |
| 协议 | 路径矢量 | 链路状态 | 链路状态 |
| 算法 | 策略比较 | SPF | SPF |
| 收敛 | 慢(秒~分钟级) | 快(秒级) | 快(秒级) |
| 规模 | 数十万条 | 数千条 | 数万条 |
| 承载 | IP 路由 | IPv4/IPv6 | CLNS + IP |
6.2 典型的协同架构
数据中心/骨干的标准分工:IGP 管内部直连,BGP 管对外与域间;eBGP 学到的路由再经过 iBGP 在域内分发。
核心路由器(BGP 边界 + OSPF 骨干)
├── eBGP → 运营商/其他 AS
├── iBGP → 域内其他核心路由器
├── OSPF → 接入交换机/服务器网段
└── 路由重分发边界:BGP → OSPF 只引默认路由,避免打满 IGP
# FRR 中 BGP 引用 OSPF 学到的高可用网段
router bgp 65001
address-family ipv4 unicast
network 10.0.0.0/8 # 直接通告内部大段
# 或重分发静态/直连
redistribute connected
exit-address-family
# OSPF 进程:域内快速收敛
router ospf
network 10.0.0.0/16 area 0
一句话:BGP 决定「互联网怎么到你家」,OSPF/IS-IS 决定「你家内部怎么到服务器」,两者在边界有节制地重分发。
七、云与数据中心的 BGP 实践
7.1 云上动态路由
云厂商普遍通过 BGP 实现专线与 VPC 的动态互通:
企业 IDC ──专线/MPLS──► 云边界网关(云厂商)
│ BGP 会话(VGW/Gateway)
▼
云 VPC 路由表(动态学习)
对端网段通告 = 免手工配置静态路由
# 云厂商 BGP 配置要点(以 AWS Direct Connect / 阿里云高速通道为例)
# 1. 创建虚拟接口,指定本地 ASN 与 BGP 认证密钥
# 2. 云侧通告 VPC 网段,本侧通告 IDC 网段
# 3. 用 MED 控制多专线的主备/负载:
# 主专线 MED=100,备专线 MED=200
7.2 数据中心 BGP 架构
现代数据中心(CLOS 拓扑)常用 eBGP 作为数据中心 IGP 的替代,每台 ToR 一个 ASN:
Spine 层(AS 65000 集群,ibgp 全互联)
│ eBGP
ToR-1 (AS 65001) ToR-2 (AS 65002) ToR-3 (AS 65003)
│ │ │
Server / Pod 网段 Server / Pod 网段 Server / Pod 网段
为什么用 eBGP 替代 OSPF?
- 每 ToR 独立 ASN → 天然隔离故障域
- eBGP 会话比 OSPF 更简单、更可控
- 支持 underlay + overlay 分离(VXLAN 封装)
# 典型的数据中心 ToR BGP(FRR)配置片段
router bgp 65001
bgp router-id 10.1.1.1
neighbor 10.0.0.1 remote-as 65000 # 上联 Spine
neighbor 10.0.0.2 remote-as 65000
address-family ipv4 unicast
network 10.1.0.0/16 # 本 ToR 下挂网段
neighbor 10.0.0.1 allowas-in 1
exit-address-family
7.3 云环境下 BGP 排障速查
# 核心排查三板斧
vtysh -c "show bgp summary" # 邻居是否 Established
vtysh -c "show bgp ipv4 unicast" # 路由是否学习到
vtysh -c "show ip route" # 路由是否装表并转发
# BGP 会话抓包(DEBUG)
tcpdump -i eth0 -s 0 -w bgp.pcap 'tcp port 179'
# BGP 端口 179(TCP),KEEPALIVE 默认 60s,HOLD 默认 180s
八、总结
| 主题 | 核心知识点 | 运维建议 |
|---|---|---|
| AS 与邻居 | eBGP 跨域 / iBGP 域内 | 私网 ASN 用 64512-65535 |
| 路径属性 | LOCAL_PREF/MED/AS_PATH/COMMUNITY | 用 Community 统一策略 |
| 选路 | 属性优先级逐条比较 | 修改 LOCAL_PREF 而非盲目调 IGP |
| 多路径 | ECMP 逐流哈希 | 保证五元组一致性,防乱序 |
| 故障 | 黑洞/震荡/劫持 | RPKI 校验 + 路由阻尼 + 快速收敛 |
| 协同 | IGP 管内部、BGP 管外部 | 边界有节制重分发,勿打满 IGP |
BGP 是互联网路由的「大脑」,它的难点不在协议本身,而在策略的规模化管理:从邻居配置、属性操纵、到故障收敛与安全(RPKI),每一步都决定着一台设备、一个 AS、乃至全网的路由稳定性。对后端工程师而言,理解 BGP 的决策逻辑,才能在与云网络、数据中心网络协作时准确判断「流量为什么走这条路」。
继续阅读
探索更多技术文章
浏览归档,发现更多关于系统设计、工具链和工程实践的内容。