一、BGP基础回顾:BGP协议概述、BGP路径属性、BGP选路原则
1.1 BGP协议概述——互联网的“交通调度员”
BGP,全称是边界网关协议。说白了,它就是互联网上不同自治系统(AS)之间交换路由信息的“官方语言”。
我经常跟团队里的新人打比方:如果把互联网比作一个巨大的快递网络,每个AS就是一家快递公司。BGP就是这些快递公司之间互相通报“我能送到哪些地方”、“走哪条路最快”的通信协议。没有BGP,不同运营商之间的数据包根本不知道该怎么走。
BGP有几个关键特征,我挑重要的说:
- 路径矢量协议:它不像OSPF那样只知道距离,BGP会记录整条路径上的AS编号。你想想看,这就像快递单上盖满了沿途中转站的章,一目了然。
- 基于TCP 179端口:BGP的可靠性建立在TCP之上。嗯,这里要注意,这意味着BGP邻居之间必须先建立TCP连接,才能交换路由。
- 触发式增量更新:BGP不会像某些IGP那样疯狂泛洪。只有路由发生变化时,它才发送更新。我在项目中遇到过,有些刚入行的同事把BGP的更新间隔调得太短,结果把核心路由器的CPU打满了……
- 丰富的路径属性:这是BGP最强大的地方。属性决定了路由怎么选、怎么传。下面我会详细讲。
核心要点:BGP不是用来发现路由的,而是用来传递和选择路由的。它假设你内部已经跑通了IGP(比如OSPF或IS-IS),BGP只负责在AS之间做“外交工作”。
1.2 BGP路径属性——路由的“标签”与“身份证”
BGP路径属性,就是附着在每条路由上的元数据。我个人习惯把它们分成四类:公认必遵、公认任意、可选过渡、可选非过渡。不过说实话,你不需要死记硬背分类,关键是要理解每个属性的作用。
下面这张SVG图,是我梳理的BGP核心属性关系图,你看一眼就能明白它们之间的逻辑:
下面我挑几个最常用的属性,结合实战经验给你拆解一下:
(1)AS_PATH —— 路由的“旅行记录”
AS_PATH记录了这条路由经过的所有AS编号。它的作用有两个:一是防环(BGP路由器看到自己的AS号在路径里,就知道出现环路,直接丢弃);二是选路(路径越短,通常越优先)。
避坑指南:我曾经在调整流量出口时,手动在AS_PATH里追加了重复的AS号,想通过“拉长路径”来降低某条路由的优先级。结果操作失误,导致部分流量绕了大半个地球才回来。后来我学乖了——修改AS_PATH一定要先在测试环境验证,尤其是涉及AS_PATH prepend操作时。
(2)NEXT_HOP —— 下一跳是谁?
BGP路由的下一跳,不一定是对端邻居的接口IP。这一点很多新手会搞混。在EBGP场景下,下一跳通常是邻居的接口IP;但在IBGP场景下,下一跳默认保持不变。这意味着,如果你的IGP没有学到这个下一跳的路由,BGP路由就会变成“无效”状态。
我记得有一次排查故障,发现BGP路由表里有路由,但就是不通。查了半天,原来是IBGP邻居之间没有配置next-hop-self,导致下一跳指向了一个不可达的EBGP地址。嗯,这个坑踩过一次就忘不了了。
(3)LOCAL_PREF —— 本地偏好,控制出站流量
LOCAL_PREF只在IBGP邻居之间传递,默认值是100。值越大,优先级越高。它是控制“从本AS出去时走哪条路”的关键属性。
举个例子:你有两条出口链路,一条是电信(带宽大但贵),一条是联通(带宽小但便宜)。你想让大部分流量走电信,只有电信挂了才走联通。这时候,你只需要在电信链路的入方向设置LOCAL_PREF为200,联通保持默认100即可。
(4)MED —— 多出口区分,控制入站流量
MED是可选非过渡属性,只在相邻AS之间传递。值越小,优先级越高。它用来告诉邻居:“你从我这边的哪个入口进来更近”。
重要提醒:MED的比较有个前提——必须来自同一个AS。不同AS的MED不能直接比较。我曾经见过有人把两个不同运营商的MED拿来对比,结果选路完全乱套了。
1.3 BGP选路原则——路由决策的“十二道金牌”
当BGP路由器收到同一条前缀的多条路径时,它必须做出选择。BGP的选路原则一共有12条,按顺序逐条比较,一旦某条分出胜负,后面的就不看了。
我把最常用的前几条列出来,这些是你在实战中几乎天天要打交道的:
| 优先级 | 选路原则 | 说明 |
|---|---|---|
| 1 | 最高权重(Weight) | Cisco私有属性,本地有效,值越大越优先 |
| 2 | 最高LOCAL_PREF | 本地偏好,值越大越优先,默认100 |
| 3 | 本地起源优先 | 本地通过network或aggregate注入的路由,优于从邻居学来的 |
| 4 | 最短AS_PATH | AS路径长度越短越优先 |
| 5 | 最低起源类型 | IGP < EGP < Incomplete |
| 6 | 最低MED | 多出口区分,值越小越优先 |
| 7 | EBGP优于IBGP | EBGP路由优先级高于IBGP |
你可能会问:“这么多条,我到底该用哪条来控制选路?”
我的建议是:能用LOCAL_PREF解决的,就别动AS_PATH;能用MED解决的,就别动Weight。为什么?因为LOCAL_PREF和MED是标准属性,跨厂商兼容性好。而Weight是Cisco私有,换了华为或Juniper设备就不灵了。
实战口诀:
- 控制出站流量(从本AS出去):改LOCAL_PREF
- 控制入站流量(别人怎么进你的AS):改MED或AS_PATH prepend
- 临时调优、本地测试:改Weight
最后说一句,BGP选路原则虽然看起来复杂,但核心逻辑其实就一句话:选最靠谱、最近、最可控的那条路。你只要理解了每个属性背后的“意图”,自然就知道该调哪个参数了。
个人经验:我每次做BGP选路策略调整前,都会先在脑子里过一遍这12条原则,确认我改的属性在第几条生效。因为如果你改的是第6条MED,但前5条已经分出胜负了,那你的改动就是白费功夫。别问我怎么知道的……