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条。但实际工作中,我们通常只用到前几条。我按优先级从高到低列一下:
- Weight(权重):Cisco私有属性,本地有效,值越大越优先。
- Local_Pref(本地优先级):值越大越优先。
- 本地生成路由:network命令或aggregate-address生成的路由优先。
- AS_PATH长度:越短越优先。
- Origin类型:IGP < EGP < Incomplete。
- MED:值越小越优先。
- EBGP优于IBGP:EBGP路由优先于IBGP路由。
- 下一跳度量:到下一跳的IGP度量值越小越优先。
- ...后面几条基本用不上,我就不啰嗦了。
为什么会设计这么多条?说白了,就是为了在任何情况下都能「选出一个唯一的最优路由」。BGP不允许出现「两条路由一样优」的情况,必须分个高下。
避坑指南:我曾经遇到过一个案例,某运营商的BGP路由表中出现了大量等价路由。按理说BGP不会出现等价路由,但因为他们用了load-balancing配置,导致选路逻辑被绕过了。结果就是流量在不同路径之间来回抖动,丢包率飙升。所以,除非你明确知道自己在做什么,否则别轻易动BGP的等价路由功能。
1.4 BGP状态机
BGP的状态机,一共6个状态。我画个图帮你理解:
这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