1. BGP基础回顾:协议、属性、选路与通告原则
各位同行,咱们今天聊聊BGP。说实话,这协议我用了十几年,每次遇到诡异的路由问题,最后总能从BGP的基础原理里找到答案。所以别嫌我啰嗦,基础打牢了,后面那些高级策略才能玩得转。
1.1 BGP协议概述
BGP,全称Border Gateway Protocol,边界网关协议。它是互联网的「交通警察」——负责在不同自治系统(AS)之间交换路由信息。
我刚开始接触BGP时,总觉得它跟OSPF、IS-IS这些IGP差不多。后来被坑过一次才明白:BGP是路径矢量协议,不是链路状态协议。它不关心链路带宽、延迟这些细节,只关心「你到某个目标网络,中间要经过哪些AS」。
BGP有两个版本在实际生产中广泛使用:
- EBGP(外部BGP):AS之间的BGP会话。比如你家运营商跟电信、联通之间跑的就是EBGP。
- IBGP(内部BGP):同一个AS内部的BGP会话。用于在AS内部传递从外部学到的路由。
核心要点:BGP使用TCP 179端口建立连接。这意味着BGP邻居之间必须IP可达,而且TCP连接本身不加密——嗯,这里埋个坑,后面讲安全设计时会重点说。
1.2 BGP路径属性
BGP之所以强大,很大程度上归功于它的路径属性。说白了,每条BGP路由都带着一堆「标签」,这些标签告诉路由器:这条路由是怎么来的、质量如何、该不该选它。
我个人习惯把属性分成四类:
| 类别 | 属性 | 作用 |
|---|---|---|
| 公认必遵 | AS_PATH、Next_Hop、Origin | 所有BGP路由必须携带,缺一不可 |
| 公认任意 | Local_Preference、Atomic_Aggregate | 可以带,也可以不带 |
| 可选传递 | Community、Aggregator | 可以跨AS传递,路由器可以不识别 |
| 可选非传递 | MED、Cluster_List、Originator_ID | 只在单个AS内有效,不传给其他AS |
这里我重点说几个项目中经常碰到的:
- AS_PATH:记录路由经过的AS编号列表。EBGP每经过一个AS,就把自己的AS号追加到列表前面。AS_PATH越短,路由越优——但别太迷信这个,后面我会讲怎么用AS_PATH做流量工程。
- Next_Hop:下一跳地址。EBGP的下一跳通常是直连接口地址,IBGP的下一跳默认不变。我曾经遇到过一个故障,就是因为IBGP的下一跳不可达,导致路由黑洞——这个坑后面会详细讲。
- Local_Preference:本地优先级。只在IBGP邻居之间传递,值越大越优先。这是做出口选路最常用的属性。
- MED:多出口区分符。用于告诉邻居AS「你从哪个入口进我比较划算」。值越小越优先。
避坑指南:我曾经在项目中遇到一个案例——两个AS之间有多条链路,结果流量全挤在一条链路上。后来发现是MED配置反了。记住:MED是「入站」优化用的,不是「出站」用的。很多新手容易搞反。
1.3 BGP选路原则
BGP选路,说白了就是「比大小」。当路由器从多个邻居学到同一条路由时,它会按照下面的顺序逐条比较,直到选出唯一的最优路由:
- 最高Weight(Cisco私有,值越大越优先)
- 最高Local_Preference
- 本地起源路由(network命令、aggregate命令)优于从邻居学到的路由
- 最短AS_PATH
- 最低Origin类型(IGP < EGP < Incomplete)
- 最低MED
- EBGP优于IBGP
- 最近Next_Hop(IGP度量最小)
- 最老路由(仅限EBGP)
- 最低Router ID
- 最低邻居地址
你想想看,这11条规则,实际项目中用到最多的其实就前5条。我个人的经验是:能用Weight和Local_Preference解决的问题,就别去动AS_PATH和MED。为什么?因为前两个是本地有效的,不会影响其他AS;后两个会传递出去,搞不好就影响全网。
注意:选路原则是逐条比较的。一旦某条规则分出胜负,后面的规则就不再执行。比如两条路由Local_Preference不同,直接选大的,后面的AS_PATH、MED都不用看了。
1.4 BGP路由通告原则
这部分是BGP的「交通规则」。搞不清楚这些规则,你的路由要么发不出去,要么发出去收不回来。
BGP路由通告有三个基本原则:
- 从EBGP学到的路由,可以通告给所有BGP邻居(包括EBGP和IBGP)
- 从IBGP学到的路由,不能通告给其他IBGP邻居(防止IBGP环路)
- 从IBGP学到的路由,可以通告给EBGP邻居
嗯,这里有个关键点:第二条规则意味着IBGP需要全互联(full mesh)。如果AS里有10台路由器,每台都要跟其他9台建立IBGP会话——总共45个会话。这还不算多,但如果AS里有100台路由器呢?那就是4950个会话,谁也受不了。
所以实际部署中,我们会用路由反射器(RR)或联盟(Confederation)来解决IBGP扩展性问题。这个后面有专门章节讲,这里先记住:IBGP默认不传递从IBGP学到的路由,这是BGP防环机制的核心。
实战经验:我曾经帮一个客户排查路由黑洞问题。他们的IBGP没有全互联,也没有配RR,结果某些路由只在部分路由器上可见。流量发过去,下一跳不可达,直接丢包。排查了整整两天才找到根因——就是IBGP通告规则没搞明白。
知识体系总览
下面这张图是我自己画的BGP基础知识框架,帮你把今天讲的内容串起来:
好了,BGP基础就回顾到这里。这些东西看着简单,但每次出问题回头看,往往就是某个基础点没吃透。下一节咱们开始聊BGP安全威胁——说实话,这部分才是真正让人头疼的地方。