
因为BGP协议技术难度有些高,维护成本较高,在一些高端的互联网企业中会应用的到,我加入了BGP爱好者群中和一些高手交流了关于BGP协议的一些技术要点,分享出来一些BGP的技术知识。
建议初学者重点掌握BGP思想,命令其次!
BGP是个复杂而又庞大的距离矢量类型的动态路由协议,其中涉及了许多非常复杂的配置,我之前分享的RIP/OSPF/IS-IS路由协议都是内部网关协议(IGP),而BGP则属于外部网关协议简称EGP,另外还需要注意的是,BGP本身不产生路由,而是通过引入其他类型的路由在对等体中间传播,下面我逐一解开BGP面纱。

BGP (Border Gataway Portocol,边界网关协议)
一种实现AS(自治系统)之间的路由的距离适量性动态路由协议。
随着不断扩大的网络,像OSPF之类的网络承载的路由条目是有限的,如果超过了相应的路由条数,OSPF算法本身就很难应对,因此BGP路由协议诞生了,针对大型网络、大型跨国集团、运营商,甚至国与国之间的路由!
从大型网络拓扑上来说,一个局部网络出现了变化,会影响到整个网络结构!众多的路由设备要达到一个稳定的收敛状态,过程是非常不易的!BGP作用于用户数据的控制(路由选择)

AS:自治系统。这个自治系统我们可以理解为一个区域(例如运营商、集团区域什么的。)
华为官方定义:AS是指在一个组织机构管辖下的拥有相同选录策略的IP网络。类似图中这样的分布:

BGP的诞生的是具有特定的环境,举例来说,以北京联通和北京电信两大运营商来讲,两个区域之内运行的都是OSPF路由协议,没有人可敢保证两者之间就可以通讯!(原因在于两者间OSPF区域不敢保证一样,二一个就是IP地址还有可能冲突,甚至两者之间的链路不见得就是直线连接,可能会绕道其他运营商。)

前文摘要中我说过BGP属于EGP,OSPF、RIP、IS-IS之类的都是属于IGP。
那么在庞大的互联网中,有了IGP之后,为什么还会出现EGP呢?
在实际的运营商架构都是以双环路的形式存在。在华为官方中曾经这样描述:IGP协议所拥有承载的路由条目数是有限的,而BGP承载的路由条目会更多一些!
BGP在广泛使用的根本原因就是解决不同AS之间的选路问题(流量控制)

先搭建出实验拓扑环境:
按照这个拓扑,会渐渐的深入讲解BGP的基础配置

BGP的基础配置
自制系统号
先来看看BGP中AS的自治系统号:
[R1]bgp ?
关于自制系统号的范围,在思科的设备中是没有这些范围的!
在华为设备中,它考虑到随着网络规模不断的扩大,使用BGP协议的地区越来越多,自治系统号定义了4个字节,就是图中我们看到的1-4294967295.

针对于庞大的网络而言,划分N个区域,你只能管理某个区域,其他的区域由其他人员管理,自治系统的划分没有特定的标准,以省份,以部门都是可以的。图中以省份为单位:为了区分自治系统,我们才用自制系统号来加以区分。

在设备中,配置命令选定了自制系统号
[R1]bgp 1

就代表了R1这台路由器,处于图中的AS1号区域中了。

配置BGP对等体
在华为官方中定义 ,BGP中的对等体类似于RIP、OSPF、IS-IS中的邻居,单BGP的对等体不一定就是智联设备,所以在BGP中需要手动指定对等体且需要在对等体双方分别配置!

BGP报文交互角色
①Speaker:发送BGP报文的设备称为BGP speaker(发言者)。它接收或产生新的报文信息,并发布给其他BGP Speaker,Speaker角色是针对具体报文发送过程而言,网络中每台BGP路由器均可称为自己发送BGP报文的Speaker。可以理解为参与到BGP协议中的路由设备都可以称之为speaker。
②Peer:相互交互报文的speaker之间互称为(peer)对等体,多个相关的对等体可以构成对等体组,(peer group)可以为这个对等体组进行集中配置!
互相交换报文(交换的路由信息报文)之间的两个实体之间称之为对等体
所谓的对等体就图中我AS1区域中R1和R2的意思。

既然要建立对等体,我站在R1上去配置对等体的时候首先是要告诉R1的设备这个R2是哪个地址?位于哪个区域(可以是不同的区域)?
这里我定义R1和R2在同一个AS1区域中。
配置命令如下:
[R1-bgp]peer 12.0.0.2 as-number 1

通过对等体配置命令,引出BGP的分类。
华为官方定义BPG按照运行方式分为:
①EBPG(外部BPG):运行于不同AS之间的BGP称为EBGP,为了防止AS间产生的环路,当BGP设备接收EBGP对等体发来的路由,会将路由信息AS_Path列表中电邮本地AS号的路由丢弃。(后期会详细介绍)
②IBGP(内部BGP)运行于同一 AS内部的BGP,称为IBGP。为了防止AS域产生环路,BGP设备将不从IBGP对学习到的路由发布给其他IBGP对等体。(后期也会详细介绍)
简单的来说在双方建立BGP对等体关系之后,IBGP指的是双方在同一个自治系统之中,EBGP指的是双方不在同一个自治系统中。

在拓扑中,我们将R1和R2建立Peer,并定义为IBGP类型.
站在R2上配置对等体:并和R1建立了IBGP的对等体关系。
[R2]bgp 1 (和R1配置保持一致)
[R2-bgp]peer 12.0.0.1 as-number 1 (指向R1的互联地址,区域和R1相同)
如果要建立EBGP的对等体关系类型,那么以上两个配置的数值就可以不一样。

注意的是,BGP协议没有发现路由的机制!
何为没有发现路由的机制呢?
举例OSPF协议,当配置network的时候,两者间的直连路由通过LSU链路状态信息以组播的形式发送出去,这就是路由的发现机制!
但是根据BGP协议的思想,对等体之间是可以交换路由信息,但是协议本身是不会支持发现路由信息的(无法刺探对方有什么路由,只能靠对方把路由信息高速自己)!
建议初学者在学习BGP路由技术的时候,遵循BGP法则融会贯通:
法则一:BGP没有路由发现机制。
前段时间我学习BGP的时候看到这样的法则的时候,会有这个疑问,既然BGP没有发现路由的机制,那么凭借什么来学习到路由呢??
BGP协议本身是发现不了路由信息的,因此路由信息都是依靠引入进来的!
法则二:BGP的路由最初都是通过路由引入得到的!
就是因为BGP协议本身不发现路由,所以,我需要将位于本地设备IP路由表中的其他路由引入到BGP路由表中,从而将这些路由在AS之间或AS之内通过BGP协议传播!
之前R1和R2已经建立了IBGP的对等体关系,站在R2上,我们看到不来自R1的loopback0的路由信息!

在华为官方定义中,BGP引入路由时支持Import和network两种方式!
Import 方式(重分布):按协议类型将RIP路由,OSPF路由、Isis路由等协议的路由引入BGP路由表中。为了保证引入的IGP路由的有效性,Import方式还可以引入静态路由和直连路由。
Network方式:逐条将IP路由表中已经存在的路由(可能是静态路由、直连路由、也可能是RIP、OSPF、is-is路由)引入到BGP路由表中,比Import方式更加精确!

此次试验中,我站在R1上,通过Import的方式引入直连路由到BGP路由表中:
[R1-bgp]import-route direct

配置完成后,站在R2上查看路由表,就可以查看到R1的1.1.1.1的路由条目信息了!
因此,我可以认为,在BGP没有发现路由机制,又如何学习到路由的过程逻辑如下:
①建立对等体的关系:目的一定是建立交换路由信息!
②路由信息是来自于配置路由引入的。
③路由引入来自于是重分布配置!

根据法则一,为何BGP协议是没有发现路由机制的!
因为BGP作用于一些非常庞大的网络拓扑架构中,单单靠组播这样的发现协议机制,在庞大的网络下恐怕没有几个小时路由条目是探知不完的!

之前说到BGP引入路由时支持Import和network两种方式!
说完import我们再来看看network的方式。
Netwrok的方式在IGP(ospf is-is rip )中是指定了哪些接口参与到了路由进程中来,并且把该接口所在网络或者链路状态发布出去!(详见之前分享的RIP和is-is协议技术)
但是在BGP中,可不是这个意思!也是路由引入的一个手段!可不是IGP中的宣告!
两种方式的主要区别就是import的方式可以成批导入路由条目,而network只能一条一条(网络号和子网掩码要一一匹配)的导入!

BGP的路由器ID
与OSPF一样,BGP也是采用Router ID来标识一个BGP设备的其命名规则是和OSPF的RID一模一样。
简单复习下OSPF-routerid的定义规则:
在OSPF中配置了routerID,优先级最大!没有配置的话以loopback口为大!没有loopback口的话,我们去接口IP地址最大的那个!
在OSPF中,如果你指定了loopback口作为routeID的话,你在配置routerid是不会生效的(重启OSPF进程之外)。
路由器ID会在BGP会话建立时发送的Open报文中携带,也是一个32位值,通常以IP地址(Ipv4)的形式。
值得注意的是在对等体建立BGP会话时,每台BGP设备都必须有位移的路由器ID,否则对等体之间不能建立BGP链接!

法则三:BGP认为同一个自治系统中的路由器是全连接。
以这张图来说,虽然在图中我们看出R1-R2-R3是物理上是串联的,但是在BGP设计应用场景就是在大型互联网上,BGP协议的设计思想就认为R1-3是直连的! 也就是说R1和R3之间可以建立对等体关系。

为了使R1-R2-R3都位于AS1中,我需要在R1上和R3上分别建立对等体peer关系。
[R1-bgp]peer 23.0.0.2 as-number 1

[R3-bgp]peer 12.0.0.1 as-number 1

起初在BGP协议开发者设计中,IBGP之间是全互联的,在同一个区域中,任意两台BGP路由设备时可以交换路由信息的!
按照这样的说话,R1的路由会和R2产生路由交换,那么R2的路由会不会和R3产生路由交换呢???
答案是:不会的!
原因在于,在BGP协议思想中认为同一个自治系统里路由都是全互联的,因此R2学到的路由条目就没有任何必要再传给R3了(R2认为R1和R3之间是全互联,他它们之间已经交换过路由条目信息了)!

我们可以站在R3来验证下刚才那句话是否正确!我查看R3上的BGP路由表信息,看看有没有从R2学来的路由信息。
[R3]dis bgp routing-table
不出意料,BGP路由表里的信息是空的。

曾经学到这里的时候,我对照拓扑发现,R2和R3之间还没有建立对等体关系,因此我认为是不是没有建立对等体关系之后,才不会学到的路由。
特此,我站在R2和R3上建立对等体关系。
[R2-bgp]peer 23.0.0.2 as-number 1
[R3-bgp]peer 23.0.0.1 as-number 1
配置完成后,我站在R3上再次查看BGP路由表:还是没有!

但是我站在R2上查看BGP路由表,却发现有R1的路由条目!
原因在于:在IBGP内、R1和R2是对等体关系!R2和R3之间虽然配置了对等体(关系实际上并没有建立成功),但是R2上的路由条目信息中的1.1.1.0是从R1上学来的,因此R2不会交给R3的。

R1和R3之间配置对等体关系之后,但是对等关系却建立不成功,路由交换信息没有。因此,我们需要引入了IGP或者静态路由(静态路由会麻烦一些!)来解决以下的矛盾:
既然BGP协议思想认为:在IBGP中都是全互联的,就没有必要有路由发现机制了,最终会造成R2和R3之间没建立成功对等体关系!
因此,我需要介入IGP协议,这里我用OSPF动态路由协议来演示此次试验,打通拓扑中的路由条目,让R3学到R2学到的1.1.1.0的路由信息!
站在R1-R2-R3上分别配置OSPF协议,区域设置为0:
[R1]ospf 1
[R1-ospf-1]area 0
[R1-ospf-1-area-0.0.0.0]network 12.0.0.0 0.0.0.3

[R2]ospf1
[R2-ospf-1]area 0
[R2-ospf-1-area-0.0.0.0]network 12.0.0.0 0.0.0.3
[R2-ospf-1-area-0.0.0.0]network 23.0.0.0 0.0.0.3

[R3]ospf 1
[R3-ospf-1]area 0
[R3-ospf-1-area-0.0.0.0]network 23.0.0.0 0.0.0.3

配置结束后,(需要等待一会路由学习的过程,BGP学习过程比较慢)站在R3查看BGP的路由表!
查看路由表我们发现,R1下面的1.1.1.0的网络被学习进来,但是我们发现下一条的地址是12.0.0.1,相当于图中我标注的黑色箭头,R1就直接给了R3,符合BGP的设计思想。

我们回到R3上,查看路由表,不懂BGP思想的同行,对照拓扑初看这样路由表是错误的,会认为下一条地址是23.0.0.1。但是实际的路由报文来自于R2。
说明在BGP协议中,路由信息下一条地址在传播过程中不做任何改动!又充分了符合BGP在IBGP类型中全互联的设计思想!


分享完了IBGP类型,我们继续对照拓扑打开R5设备,
EBGP拓扑如下:

配置R3和R5两个设备peer关系,注意区域是有区别的!
站在R3上配置对等体关系
[R3-bgp]peer 35.0.0.2 as-number 2

R5配置对等体关系:注意按照拓扑上的描述是有区别的
[R5]bgp 2
[R5-bgp]peer 35.0.0.1 as-number 1
配置完成,R3和R5就建立了EBGP的对等体的关系!

之前通过IGP的引入路由,R3上是有1.1.1.0这条路由的,站在R5上查看路由条目,发现是有1.1.1.0这条路由的!
这就说明一个运行BGP设备,在IBGP类型中学习到的路由信息,会无条件的向EBGP对等体设备传播!
华为对BGP官方定义BGP对等体的5种交互原则
从IBGP对等体获得的BGP路由,只发给他的EBGP对等体。
从EBGP对等体获得的BGP路由,发给他所有的EBGP和IBGP对等体。
当存在多条达到同一目的地址的有效路由时,BGP设备只将最优路由发布给对等体。
路由更新时,BGP设备只发送要更新的BGP路由,不是发送整个路由表。
所有对等体发送的路由,BGP设备都会接受。

所以,按照这样的原则来说,R5从R3学来的路由一定会给它下面的BGP路由设备的。R5就会给R4 / 6 的。
关于当存在多条达到同一目的地址的有效路由时,BGP设备只将最优路由发布给对等体这个概念,对照这个拓扑举例来说,光纤链路和DDN链路同时存在,BGP设备一定转发最优的光纤链路!

那么BGP路由中存在等价路由吗?
是不存在的,IGP路由协议中会有,如果BGP出现了等价路由,会造成环路的问题。
实际在运营商的环境上,网络架构一定是大环套小环的拓扑。所以BGP设备最忌讳就是环路问题,AS防环机制因此产生....

AS_PATH
AS_path属性按矢量(所谓“矢量”就是带有方向性的变量)顺序记录了某条路由从本地到达目的地址所经过的所有AS号,即“AS路径列表”的含义。
缺省情况下,BGP不会接受AS_PATH中已包含本地AS号的路由,从而避免了形成环路的可能!
图中标注的1就代表了路径,这张图实在EBGP对等体的设备上看到的。

我站在IBGP对等体设备上来查看BGP路由条目:
是没有任何值的,说明在同一区域就没有必要输入,同一区域中(IBGP)路由器不存在环路。

当初学到这的时候,我真的没明白,同一个区域中的BGP路由设备怎么可能没有环路呢?比如说这张图:在BGP 同一区域中BGP是认为全互联的状态,看起来是有环的,但是在BGP路由学习的不是这个样子!

别忘了,之前我在R3看到的的下一条地址并不是互联的那个地址,因此这些设备都是两两互联的!73






