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选路,说白了就是「比大小」。当路由器从多个邻居学到同一条路由时,它会按照下面的顺序逐条比较,直到选出唯一的最优路由:

  1. 最高Weight(Cisco私有,值越大越优先)
  2. 最高Local_Preference
  3. 本地起源路由(network命令、aggregate命令)优于从邻居学到的路由
  4. 最短AS_PATH
  5. 最低Origin类型(IGP < EGP < Incomplete)
  6. 最低MED
  7. EBGP优于IBGP
  8. 最近Next_Hop(IGP度量最小)
  9. 最老路由(仅限EBGP)
  10. 最低Router ID
  11. 最低邻居地址

你想想看,这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基础 BGP协议概述 BGP路径属性 BGP选路原则 路由通告原则 EBGP IBGP AS_PATH Next_Hop Local_Pref MED 11条比较规则 逐条比较 EBGP→所有邻居 IBGP→不传IBGP IBGP→可传EBGP 核心:BGP是路径矢量协议,靠属性选路,靠规则防环 理解这些基础,才能设计出安全可靠的路由策略

好了,BGP基础就回顾到这里。这些东西看着简单,但每次出问题回头看,往往就是某个基础点没吃透。下一节咱们开始聊BGP安全威胁——说实话,这部分才是真正让人头疼的地方。


专注资料整理