4. BGP路径属性实验
BGP 之所以能在大型网络中承担策略路由的角色,核心在于它携带了一组可比较、可修改、可传递的路径属性。路由能否被优选、能否被邻居接受、能否影响对端选路,往往不取决于“有没有这条路由”,而取决于这些属性在决策过程中的位置和取值。本节围绕六类最常用的属性展开:Origin、AS_Path、Next_Hop、Local_Preference、MED 和 Community,重点说明它们各自影响选路的哪个阶段,以及如何通过配置和观察验证其效果。
一、属性在选路决策中的位置
BGP 选路不是一次性比较所有属性,而是按固定顺序逐级筛选。理解顺序,才能判断“改哪个属性有用”。在 Cisco 实现中,常见顺序可简化为:权重(本地私有)→ Local_Preference(越大越优)→ 本地始发 → AS_Path 长度(越短越优)→ Origin(IGP < EGP < Incomplete)→ MED(越小越优)→ eBGP 优于 iBGP → 到达 Next_Hop 的 IGP 度量 → 其他 tie-breaker。Local_Preference 只在同一 AS 内部传递,不会发给 eBGP 邻居;MED 可以传给 eBGP 邻居,用于影响对端如何进入本 AS;AS_Path 和 Next_Hop 则随路由传播被自然修改或保留。
二、Origin:路由来源的可信度标记
Origin 描述一条 BGP 路由最初是如何进入 BGP 的,取值有三种:i(IGP,通过 network 命令注入)、e(EGP,早期外部网关协议)、?(Incomplete,通过 redistribute 重分发进入)。选路时 i 优于 e,e 优于 ?。实验中最容易观察的是:同一前缀分别用 network 和 redistribute 注入,在邻居上执行 show ip bgp,会看到 Origin 分别为 i 和 ?。若两条路由其他属性相同,Origin 为 i 的会被优选。配置上不需要专门“设置 Origin”,它由注入方式决定;若确实需要修改,可用 route-map 的 set origin igp 强制调整,但应谨慎,因为它会改变路由来源的真实语义。
三、AS_Path:防环与路径长度的双重角色
AS_Path 有两个作用:一是记录路由经过的 AS 号序列,接收方看到自己的 AS 号在列表中就会丢弃,从而防止环路;二是作为选路依据,路径越短越优。实验时可在 R1 上对发往 R4 的路由追加 AS 号:
route-map AS_PATH_ADD permit 10
set as-path prepend 100 100 100
!
router bgp 100
neighbor 10.0.24.4 route-map AS_PATH_ADD out
在 R4 上执行 show ip bgp 192.168.1.0/24,会看到 AS_Path 变为 100 100 100 100(原本已有 100,再追加三次)。若 R4 同时从另一邻居收到 AS_Path 更短的同前缀路由,就会改选另一条。需要注意:AS_Path 追加只影响对端选路,不影响本 AS 内部;且追加过多会浪费 AS 号空间,工程上通常只追加 1~3 次。
四、Next_Hop:下一跳可达性决定路由是否可用
Next_Hop 是 BGP 路由的下一跳地址。eBGP 传播时,默认将 Next_Hop 改为自己出接口地址;iBGP 传播时,默认保留从 eBGP 学到的 Next_Hop 不变。这带来一个经典问题:iBGP 邻居收到路由后,若其 IGP 路由表中没有到达该 Next_Hop 的路由,则这条 BGP 路由不会进入最佳路由表。解决办法有两种:一是在边界路由器上配置 neighbor x.x.x.x next-hop-self,让 iBGP 邻居把下一跳指向自己;二是在 AS 内部保证 Next_Hop 网段通过 IGP 可达。实验中可先不配 next-hop-self,观察 R3 上 show ip bgp 中该路由前面没有 > 标记,再配置后重新观察,路由变为有效。
五、Local_Preference:本 AS 出站选路的首要依据
Local_Preference 只在同一 AS 内部的 iBGP 邻居之间传递,用于告诉本 AS 的路由器“从哪个出口离开本 AS 更好”。值越大越优,默认 100。实验拓扑中,R1 和 R2 分别与 AS 200 建立 eBGP 会话,若希望本 AS 流量优先从 R1 出去,可在 R1 上对来自 AS 200 的路由设置 Local_Pref 为 200:
route-map LP_HIGH permit 10
set local-preference 200
!
router bgp 100
neighbor 10.0.12.2 route-map LP_HIGH out
注意方向:Local_Pref 应在本 AS 内部传递,因此通常在 iBGP 出方向或入方向设置。R2 收到后,比较两条路由的 Local_Pref,200 优于默认 100,于是优选 R1 方向。验证命令为 show ip bgp 192.168.1.0/24,观察 Local_Pref 字段和最佳路径标记。
六、MED:影响对端如何进入本 AS
MED(Multi-Exit Discriminator)用于向 eBGP 邻居建议进入本 AS 的入口,值越小越优,默认 0。它只在相邻 AS 之间有效,且通常只在同一对 AS 的多个连接之间比较。实验时,R1 和 R2 都向 AS 200 发布同一前缀,若希望 AS 200 的流量优先从 R1 进入,可在 R1 上设置 MED 为 50,R2 保持默认 0,则 R2 反而更优;若希望 R1 更优,应把 R1 的 MED 设为比 R2 更小,例如 R1 设 10、R2 设 50。配置示例:
route-map MED_LOW permit 10
set metric 10
!
router bgp 100
neighbor 10.0.24.4 route-map MED_LOW out
在 R4 上执行 show ip bgp 192.168.1.0/24,比较两条来自 AS 100 的路由的 MED 值,较小者被优选。需要提醒:MED 的比较前提是其他属性相同,且对端可能配置 bgp always-compare-med 或忽略 MED,因此 MED 是“建议”而非强制。
七、Community:给路由打标签,供策略匹配
Community 是一个 32 位属性,常写成 AS:值 形式,例如 100:100。它本身不直接参与选路,但可以被 route-map 匹配,从而实现批量策略。常见做法是:在 R1 上给特定路由打上 100:100 标签,R4 收到后匹配该 Community,执行本地优先级调整或过滤。配置示例:
ip community-list standard COMM100 permit 100:100
!
route-map SET_COMM permit 10
set community 100:100
!
router bgp 100
neighbor 10.0.24.4 route-map SET_COMM out
!
! 对端匹配
route-map MATCH_COMM permit 10
match community COMM100
set local-preference 300
验证时在 R4 上执行 show ip bgp 192.168.1.0/24,查看 Community 字段是否出现 100:100,再检查 Local_Pref 是否被改为 300。若使用 no-export、no-advertise 等公认 Community,还会影响路由是否允许传出本 AS 或发给其他邻居,实验中可分别打标后观察邻居是否还能收到该路由。
八、验证与排障要点
属性实验的通用验证路径是:先在本地用 show ip bgp 确认属性值,再在邻居上用同样命令确认接收值,最后用 show ip route 确认最佳路由是否变化。若属性改了但选路没变,优先检查三点:一是该属性是否在比较顺序中位于更靠前且已分出胜负的属性之后;二是方向是否正确,例如 Local_Pref 不应发给 eBGP 邻居;三是邻居是否配置了 soft-reconfiguration inbound 或 route-refresh,否则策略变更后需要重置会话才能生效。建议每次只改一个属性,记录修改前后的 show ip bgp 输出差异,形成可复现的对照实验。
show ip bgp 输出。这样能直观看到每个属性在决策链中的实际权重,而不是凭记忆判断。