1. BGP基础回顾:协议概述、路径属性、选路原则、状态机

说实话,BGP这东西,我刚开始接触的时候也觉得头大。它跟OSPF、IS-IS那些IGP协议完全不是一个路子。你想想看,一个要承载整个互联网路由表的协议,设计上肯定得有点「心机」。

今天咱们就把BGP的基础再过一遍。嗯,别看是基础,很多老手在这些细节上也会翻车。

1.1 BGP协议概述

BGP,全称Border Gateway Protocol,边界网关协议。它干的事很简单——在不同的自治系统(AS)之间交换路由信息。

我个人的理解是:IGP是管「城内交通」的,BGP是管「城际交通」的。你想想看,北京和上海之间的路怎么走,这得靠BGP来决策。

BGP有几个关键特点,我列一下:

  • 路径矢量协议:不是链路状态,也不是距离矢量。它记录的是整条路径的AS号列表。
  • 基于TCP:端口179。这意味着BGP的可靠性由TCP保证,自己不用搞那些花里胡哨的确认重传机制。
  • 增量更新:只发送变化的路由,不搞周期性全量刷新。这在互联网规模下是必须的。
  • 丰富的路径属性:这是BGP最强大的地方,后面会细说。

核心认知:BGP不是用来「发现」路由的,它是用来「传递」和「选择」路由的。你必须在IGP层面先把直连和内部路由搞定,BGP才能干活。

我记得有一次帮客户排查一个跨国业务的路由问题。他们抱怨说从中国访问美国站点的延迟忽高忽低。我一看BGP表,好家伙,AS_PATH里绕了七八个AS,明显是选路出了问题。这就是典型的BGP运维没做到位。

1.2 BGP路径属性

BGP的路径属性,说白了就是给每条路由贴的「标签」。BGP靠这些标签来做选路决策。我习惯把它们分成四类:

类别 属性 说明
公认必遵 Origin、AS_PATH、Next_Hop 所有BGP更新消息必须包含
公认任意 Local_Pref、Atomic_Aggregate 所有BGP路由器都必须识别,但可以不包含
可选过渡 Community、Aggregator 不识别也照传不误
可选非过渡 MED、Cluster_List、Originator_ID 不识别就丢弃

这里我重点说几个日常运维中经常打交道的属性:

  • AS_PATH:路由经过的AS列表。防环靠它,选路也靠它。AS_PATH越短,路由越优。
  • Next_Hop:下一跳IP。注意,在EBGP场景下,下一跳通常是邻居的接口IP。但在IBGP场景下,下一跳可能不变,这就涉及到「下一跳可达性」的问题了。
  • Local_Pref:本地优先级。只在IBGP对等体之间传递。值越大越优先。这是控制出站流量最常用的手段。
  • MED:多出口区分。用于告诉邻居AS「你从我这走这条路由更好」。值越小越优先。
  • Community:团体属性。这是个「万能标签」,可以自定义各种策略。比如NO_EXPORT(0xFFFFFF01)表示不要传给EBGP邻居。

实战技巧:我建议你在设计BGP策略时,优先考虑Local_Pref和Community的组合使用。Local_Pref控制本AS的选路偏好,Community则可以在不同AS之间传递策略意图。这两者配合好了,能省很多事。

1.3 BGP选路原则

BGP的选路原则,一共13条。嗯,你没看错,13条。但实际工作中,我们通常只用到前几条。我按优先级从高到低列一下:

  1. Weight(权重):Cisco私有属性,本地有效,值越大越优先。
  2. Local_Pref(本地优先级):值越大越优先。
  3. 本地生成路由:network命令或aggregate-address生成的路由优先。
  4. AS_PATH长度:越短越优先。
  5. Origin类型:IGP < EGP < Incomplete。
  6. MED:值越小越优先。
  7. EBGP优于IBGP:EBGP路由优先于IBGP路由。
  8. 下一跳度量:到下一跳的IGP度量值越小越优先。
  9. ...后面几条基本用不上,我就不啰嗦了。

为什么会设计这么多条?说白了,就是为了在任何情况下都能「选出一个唯一的最优路由」。BGP不允许出现「两条路由一样优」的情况,必须分个高下。

避坑指南:我曾经遇到过一个案例,某运营商的BGP路由表中出现了大量等价路由。按理说BGP不会出现等价路由,但因为他们用了load-balancing配置,导致选路逻辑被绕过了。结果就是流量在不同路径之间来回抖动,丢包率飙升。所以,除非你明确知道自己在做什么,否则别轻易动BGP的等价路由功能。

1.4 BGP状态机

BGP的状态机,一共6个状态。我画个图帮你理解:

BGP状态机 Idle Connect Active OpenSent OpenConfirm Established 启动 TCP失败 TCP成功 重试 收到OPEN 收到KEEPALIVE 错误 → Idle

这6个状态分别是:

  • Idle:初始状态。BGP进程启动后,先进入Idle。在这个状态下,BGP不会做任何事,等待触发事件(比如配置了邻居)。
  • Connect:尝试建立TCP连接。如果TCP连接成功,进入OpenSent;如果失败,进入Active。
  • Active:TCP连接失败后进入此状态。BGP会不断重试TCP连接。如果成功,进入OpenSent;如果一直失败,会在Connect和Active之间来回切换。
  • OpenSent:TCP连接已建立,BGP发送OPEN消息。等待对方的OPEN消息。
  • OpenConfirm:收到对方的OPEN消息,双方协商参数。发送KEEPALIVE消息,等待对方的KEEPALIVE。
  • Established:邻居关系建立成功。开始交换UPDATE消息(路由信息)。

排障思路:当你发现BGP邻居起不来时,先看状态卡在哪。如果卡在Idle,检查BGP配置和网络连通性。如果卡在Active,通常是TCP连接问题,检查ACL、防火墙是否放行了TCP 179端口。如果卡在OpenSent或OpenConfirm,检查BGP参数是否匹配(AS号、Hold Time等)。

我记得有一次,一个客户的BGP邻居一直在Active和Connect之间来回跳。我排查了半天,最后发现是中间防火墙把TCP 179端口给拦了。嗯,这种问题其实很常见,但往往容易被忽略。

总结一下:BGP的基础其实不复杂,但细节很多。路径属性是BGP的灵魂,选路原则是BGP的大脑,状态机是BGP的骨架。把这三点吃透了,BGP运维就成功了一半。


公众号:蓝海资料掘金营,微信deep3321