关键词:BGP、路径属性、AS_PATH、Next_Hop、Origin、LOCAL_PREF、MED、公认必遵、可选过渡

第84篇:BGP 路径属性:AS_PATH、Next_Hop、Origin

一、引言

BGP 路径属性是 BGP 路由决策的核心依据。与 IGP 仅使用单一的度量值(Cost/Metric)不同,BGP 通过多种路径属性描述路由的特征,并结合本地策略做出路由选择。

BGP 路径属性分为四大类:公认必遵、公认任意、可选过渡和可选非过渡。每种属性有不同的含义、作用和传播规则。理解这些属性,是掌握 BGP 路由控制和选路优化的基础。

二、核心概念

2.1 BGP 路径属性分类

BGP 路径属性按两个维度分类:是否所有 BGP 实现都必须识别(Well-known vs Optional),以及不识别时是否继续传递(Transitive vs Non-transitive):

分类 所有实现必须识别? 不识别时继续传递? 包含的属性
公认必遵(Well-known Mandatory) 是 N/A AS_PATH、Next_Hop、Origin
公认任意(Well-known Discretionary) 是 N/A LOCAL_PREF、Atomic_Aggregate
可选过渡(Optional Transitive) 否 是 Community
可选非过渡(Optional Non-transitive) 否 否(丢弃该属性) MED、Aggregator、Originator_ID、Cluster_List

分类规则: - 公认必遵:Update 报文中必须包含,缺失则视为错误,发送 Notification - 公认任意:所有实现必须识别,但 Update 报文中不一定包含(如 LOCAL_PREF 仅在 iBGP 中传递) - 可选过渡:可以不识别,但不识别时仍将该属性传递给其他 Peer(Community 的典型场景) - 可选非过渡:可以不识别,不识别时直接丢弃该属性(MED、Originator_ID 等)

2.2 AS_PATH 属性

AS_PATH 是 BGP 最重要的路径属性之一,用于记录路由经过的 AS 序列:

特性 说明
类型 公认必遵
内容 路由经过的 AS 号序列(从目的地向外排列,最近经过的 AS 在最前面)
作用 选路依据(AS_PATH 短的优先)、环路检测
环路检测 如果 BGP 路由器在 AS_PATH 中发现自己的 AS 号,丢弃该路由

AS_PATH 的编码格式:

编码类型 代码 说明
AS_SEQUENCE 2 有序 AS 列表(最常见的形式)
AS_SET 1 无序 AS 集合(聚合时保留,as-set 场景)
AS_PARTIAL 3 不完整的 AS 序列(已废弃)

AS_PATH 示例:

AS_PATH: 300 200
含义:本路由从AS 300学到,经过AS 200到达目的地

AS_PATH: 300 200 200 200 100
含义:AS_PATH Prepending场景,AS 200重复了3次以延长路径

2.3 Next_Hop 属性

Next_Hop 指定到达目标网络的下一跳地址:

场景 Next_Hop 行为
eBGP 传递 自动修改为发送者的 eBGP 出口接口 IP
iBGP 传递 默认不修改(透传原始 Next_Hop)
Confederation eBGP 传递 不修改(透传,与标准 iBGP 行为一致)
next-hop-self 手动修改 Next_Hop 为本端 IP

iBGP Next_Hop 问题: - iBGP 传递路由时不修改 Next_Hop,保留 eBGP 对端的 IP 地址 - 如果 iBGP Peer 没有到达该 Next_Hop 的 IP 路由(IGP 路由或静态路由),BGP 路由虽然存在于 BGP 表中,但不会被标记为最佳路径(Best),也不会安装到 IP 路由表 - 这就是著名的"Next_Hop 不可达导致路由无效"问题

解决方案: 1. 在 eBGP 路由器上配置 next-hop-self,将 Next_Hop 修改为本端 iBGP 接口 IP 2. 在 iBGP Peer 上添加到达原始 Next_Hop 的静态路由 3. 将 eBGP 对端 IP 重分发到 IGP(不推荐,增加 IGP 路由负担)

2.4 Origin 属性

Origin 标识路由的注入来源:

Origin 值 符号 说明 优先级(选路)
IGP i 通过 network 命令宣告进入 BGP 最高
EGP e 通过 EGP 协议学习(已废弃,历史上使用) 中间
Incomplete ? 通过 import-route(重分发)引入 最低

Origin 的选路意义:当多条路由在其他属性上完全一致时,Origin 作为第三条比较规则,IGP(network 宣告)优先于 Incomplete(重分发)。

三、技术细节

3.1 AS_PATH 的传递与修改

AS_PATH 的传递与修改 - 图示

AS_PATH 修改规则: 1. eBGP 传递:在 AS_PATH 前面(最左侧)添加自己的 AS 号 2. iBGP 传递:不修改 AS_PATH(Peer 在同一 AS,无需追加) 3. 路由聚合:默认丢弃明细的 AS_PATH 信息(可使用 as-set 保留) 4. AS_PATH Prepending:通过路由策略人为追加自己的 AS 号,使路径"变长"

3.2 Next_Hop 的处理流程

Next_Hop 的处理流程 - 图示

3.3 其他重要属性概览

属性 类型 默认值 说明
LOCAL_PREF 公认任意 100 本地优先值,越大越优,在 AS 和 Confederation 内部传递,仅在传递给标准 eBGP 时被剥离
MED 可选非过渡 0 多出口度量,建议进入 AS 的最佳入口
Community 可选过渡 无 团体属性,用于路由标记和策略匹配
Originator_ID 可选非过渡 无 路由反射场景中原始发布者的 Router ID
Cluster_List 可选非过渡 无 路由反射场景中经过的 Cluster ID 列表
Atomic_Aggregate 公认任意 无 标识该路由是聚合路由,可能丢失明细信息

四、实战配置/案例分析

4.1 查看路径属性

# 查看BGP路由的详细信息(包含所有属性)
display bgp routing-table 10.1.1.0 verbose
  Network: 10.1.1.0/24
  Path Attributes:
    Origin: IGP
    NextHop: 2.2.2.2
    AS_PATH: 300 200 I
    LOCAL_PREF: 100
    MED: 0
    Community: 200:100
    PrefVal: 0

# 查看BGP表的汇总信息
display bgp routing-table summary

4.2 案例分析:iBGP Next_Hop 不可达

故障现象:AS 100 内,R1(PE)通过 eBGP 从 AS 200 学到路由 172.16.0.0/16,通过 iBGP 传递给 R2。R2 的 BGP 表中存在该路由,但未被标记为 Best,也没有安装到 IP 路由表。

排查:

  1. 检查 R2 的 BGP 表:
[R2] display bgp routing-table 172.16.0.0
  Network          NextHop            MED  LocPrf  PrefVal Path/Ogn
  > 172.16.0.0/16  3.3.3.3              0     100        0  200i
  # 注意:>表示Valid但*表示Best,该路由只有>没有*,说明Valid但非Best
  1. 检查 Next_Hop(3.3.3.3 是 AS 200 的 eBGP 对端 IP):
[R2] display ip routing-table 3.3.3.3
  # 无到达3.3.3.3的路由!
  # Next_Hop不可达,因此BGP路由无法被选为Best路径
  1. 根因:R2 没有到达 eBGP Next_Hop(3.3.3.3)的 IGP 路由。R1 通过 iBGP 传递路由时未修改 Next_Hop,保持了原始的 eBGP 对端 IP(3.3.3.3),而 R2 无法到达该地址。

  2. 解决方案(推荐方案1):

# 方案1:在R1(eBGP路由器)上配置next-hop-self
[R1] bgp 100
[R1-bgp] peer 2.2.2.2 next-hop-self
 # 配置后,R1传递给R2的路由Next_Hop修改为R1的iBGP地址

# 方案2:在R2上添加到达Next_Hop的静态路由
ip route-static 3.3.3.3 32 10.1.1.1

# 方案3:使用路由策略统一设置next-hop-self
route-policy NH-SELF permit node 10
  apply next-hop 2.2.2.2    # 设置为R2可达的地址

4.3 案例分析:AS_PATH 环路检测

故障场景:网络中存在配置错误,导致 BGP 路由形成环路:

案例分析:AS_PATH 环路检测 - 图示

环路检测过程:

  1. R1 通过 eBGP 将 10.0.0.0/8 路由传给 R2,AS_PATH: 100
  2. R2 传给 R3,AS_PATH: 100 200
  3. R3 尝试将路由传回 R1(AS 100)
  4. R1 收到路由,检查 AS_PATH: 100 200 100
  5. R1 在 AS_PATH 中发现自己的 AS 号(100),判定为环路,丢弃该路由

关键:AS_PATH 环路检测仅对 eBGP 有效,因为 iBGP 传递不追加 AS 号。这也是 iBGP 需要水平分割(或 RR/联邦)防环的原因。

4.4 案例分析:Origin 影响选路

场景:BGP 路由器同时通过 network 和 import-route 获得同一条路由:

[R1] bgp 100
[R1-bgp] network 10.0.0.0 24          # Origin = IGP(i)
[R1-bgp] import-route ospf 1          # Origin = Incomplete(?)

两条路由在其他属性完全相同的情况下,network 宣告的路由(Origin=IGP)被选为最佳路径,import-route 引入的路由(Origin=Incomplete)成为备选。

五、总结

属性 类型 核心作用 传递规则
AS_PATH 公认必遵 选路依据(短路径优先)、环路检测 eBGP追加本AS号,iBGP不修改
Next_Hop 公认必遵 指定数据转发的下一跳地址 eBGP修改为本端IP,iBGP透传
Origin 公认必遵 标识路由来源(IGP/EGP/Incomplete) 保持不变
LOCAL_PREF 公认任意 AS内部出口选择(越大越优) AS和Confederation内部传递,传递给标准eBGP时剥离,默认100
MED 可选非过渡 建议进入AS的最佳入口 默认不传递到下一AS

思考

  1. 为什么 AS_PATH 属性是从目的地向外排列(最近经过的 AS 在最前面),而非从源向外?这种排列方式对环路检测和选路有什么意义?
  2. iBGP 传递路由时不修改 Next_Hop,这种设计的初衷是什么?在什么场景下会导致路由无法安装到 IP 路由表?
  3. BGP 的 Origin 属性有三个取值(IGP/EGP/Incomplete),为什么 EGP 已经被废弃但仍然保留在协议定义中?

下篇预告:第85篇:BGP 选路原则(13条规则)详解