BGP协议

BGP报文

运行BGP的路由器称之为BGP Speaker,它们之间将会交换五种类型的报文,其中Open、Keeplive以及Notification报文用于邻居关系的建立和维护前4种消息是在RFC4271中定义的,而Refresh的消息则是在RFC2918中定义的
BGP报文头

  • Marker(标记):16字节,固定为1
  • Length(长度):两字节无符号整数。指定了消息的全长,包括头部
  • Type(类型):1 字节,指示报文类型,如OPEN、UPDATE报文等
    • 1 – OPEN
    • 2 – UPDATE
    • 3 – NOTIFICATION
    • 4 – KEEPALIVE
    • 5 – REFRESH

Open

负责和对等体建立邻居关系。
Open

  • Version:BGP的版本号,对于BGPv4来说,其值为4
  • My Autonomous System:本地AS编号,通过比较两端的AS编号可以确定是EBGP连接还是IBGP连接
  • Hold Time:在建立对等体关系时协商Hold time,如果两端配置不同,则选择较小的值
  • BGP Identifier:BGP路由器的RouterID,以IP地址的形式表示,用来识别BGP路由器RouterID没有配置情况下的选举原则:Loopback接口地址中最大的地址--物理接口中最大IP地址
  • Opt Parm Len(Optional Parameters Length):可选参数的长度。如果为0则没有可选参数
  • Optional Parameters:是一个可选参数用于BGP验证、多协议扩展或者4字节的AS号等功能,每个参数都是TLV格式
    AFI及SAFI编码说明

4字节AS号

将AS号的编码范围从2字节扩展到4字节
协议扩展:

  1. 定义了一种新的Open能力码用于进行BGP连接的能力协商
  2. 2中新的可选过渡属性,AS4_Path和AS4_Aggregator属性
  3. 定义AS_TRANS(保留值为23456),用于衔接2字节和4字节的AS
    open报文里AS号等于23456代表什么?用于衔接2字节AS号和4字节的AS号

Update

用来在BGP对等体之间传递路由信息(更新、撤销)。
Update

  • 撤销路由部分:
    • Withdrawn Routes Length :(2字节无符号整数) 不可达路由长度,表示Withdrawn Routes字段的数据长度。如果Withdrawn Routes Length字段数值为0,则表示Withdrawn Routes字段没有任何数据,在UPDATE消息中不会被显示
    • Withdrawn Routes :(变长) 撤销路由。该字段包括一系列的IP地址前缀信息,以<length, prefix>的格式来表示,比如<19,198.18.160.0>表示一个198.18.160.0 255.255.224.0的网络。
  • 更新路由部分:
    • Path Attribute Length :(2字节无符号整数)路由属性长度,表示Path Attribute字段的数据长度。如果Path Attribute Length数值为0,则表示Path Attribute字段没有任何数据,在UPDATE消息中不会被显示
    • Path Attributes :(变长) 路径属性。每个路径属性都是由TLV三元组所组成:<attribute type, attribute length, attribute value>
    • Network Layer Reachability Information :(变长) 网络可达信息。包括一系列的IP地址前缀。格式与撤消路由字段一样<length, prefix>
      1
      2

最小UPDATE消息的长度为23个字节(19字节的报文头+2字节的撤消路由长度+2字节的路径属性长度)。这样的UPDATE消息被称之为End-of-RIB,用于BGP GR

  1. 一条UPDATE消息可以发布多条具有相同路由属性的可达路由,这些路由可共享一组路由属性。所有包含在一个给定的Update消息里的路由属性适用于该Update消息中的NLRI(网络层可达性信息)字段里的所有目的地(用IP前缀表示)。
  2. 一条UPDATE消息可以撤销多条不可达路由。每一个路由通过目的地(用IP前缀表示),清楚的定义了BGP Speaker之间先前通告过的路由。
  3. 一条UPDATE消息可以只用于撤销路由,这样就不需要包括路径属性或者网络可达信息。相反,也可以只用于通告可达路由,就不需要携带Withdrawn Routes了。不可即更新又撤销路由

Notification

当BGP Speaker检测到错误的时候,就发送该消息给对等体(报错,用于拆除连接,释放资源)。
Notification

  • Errorcode:错误码
  • Errsubcode:错误子码
    错误码和错误子码

KeepAlive

在对等体之间周期性(60s)地发送,检测TCP的连通性,用以维护连接。
KeepAlive
KeepAlive报文只包括一个BGP数据报头,KeepAlive 消息在对等体之间的交换频率以保证对方保持定时器不超时为限
缺省情况下,发送KeepAlive的时间间隔为60秒Hold Time是180秒。每次从邻居处接收到KeepAlive 报文将重置Hold Time定时器,如果Hold Time定时器超时,就认为对等体Down掉。

Route-refresh

用来通知对等体自己支持路由刷新能力对等体一端不支持路由刷新的能力,如果强制刷新,则会重新建立邻居
Route-refresh

  • AFI(Address Family Identifier):地址族标识符
  • Res.(Reserved field):保留区域,发送方应将其设置为0,接收方应当忽略该区域的信息
  • SAFI(Subsequent Address Family Identifier):子地址族标识符

在所有BGP路由器使能Route-refresh能力的情况下,如果BGP的入口路由策略发生了变化,本地BGP路由器会向对等体发布Route-refresh消息,收到此消息的对等体会将其路由信息重新发给本地BGP路由器即由路由的接收方发送RouteRefresh报文,用来重新请求相应协议簇的报文,路由的发送方发送对应路由的Update报文,路由的接收方收到Update报文之后应用修改之后的入口路由策略。这样,可以在不中断BGP连接的情况下,对BGP路由表进行动态刷新,并应用新的路由策略。

什么时候产生Route-refresh报文?

  1. 请求:refresh bgp all import,自身产生refresh报文,邻居收到之后回复update报文【如果执行refresh bgp all export,则是主动发送update报文】
  2. ORF(出方向的路由过滤),只允许通过需要的路由

状态机

BGP状态机
  • Idle:
    • 不发起TCP连接,需要转换成Connect状态,然后才发起一条TCP连接,复位连接重试计时器(32秒)
      如果EBGP邻居使用环回口建立,但是没有设置EBGP多跳或者开启了直连检查,会停留在此状态,因为EBGP规定是直连,即eBGP报文的TTL默认是1、iBGP报文的TTL默认是255
  • Connect:
    在此状态,BGP发起第一个TCP连接在重试计时器时间内只发送这一个TCP连接
    • 如果连接重试计时器超时,就重新发起TCP连接,并继续保持在Connect状态,
    • 如果TCP连接成功,就转入OpenSent状态,
    • 如果TCP连接失败,就转入Active状态。
  • Active:
    在此状态,BGP总是在试图建立TCP连接
    • 如果连接重试计时器超时,就退回到Connect状态,
    • 如果TCP连接成功,就转入OpenSent状态,
    • 如果TCP连接失败,就继续保持在Active状态,并继续发起TCP连接
      Active和Connect状态的区别:Connect状态只发送一次TCP连接,而Active状态下会多次发送TCP连接;Connect是主动建立TCP连接,Active是被动等待TCP连接
      如果一直处在Connect或者Active状态,说明TCP连接未建立起来,有以下情况:更新源地址错误(源IP地址检查)、认证(通过TCP的option字段实现的)、ACL过滤
  • OpenSent:
    在此状态,TCP连接已经建立,BGP也已经发送了第一个Open报文,剩下的工作,BGP就在等待其对等体发送Open报文。并对收到的Open报文进行正确性检查,
    • 如果有错误,系统就会发送一条出错通知消息并退回到Idle状态
    • 如果没有错误,BGP就开始发送Keepalive报文,并复位Keepalive计时器,开始计时。同时转入OpenConfirm状态。
      发送KeepAlive报文的时机:收到Open报文并检测通过
  • OpenConfirm:
    在OpenConfirm状态,BGP等待一个Keepalive报文,同时复位保持计时器
    • 如果收到了一个Keepalive报文,就转入Established阶段,BGP邻居关系就建立起来了。
  • Established:
    在Established状态,BGP邻居关系已经建立,这时,BGP将和它的邻居们交换Update报文,同时复位保持计时器。

除Idle状态以外的其它五个状态出现任何Error的时候,BGP状态机就会退回到Idle状态
在BGP对等体建立的过程中,通常可见的三个状态是:Idle、Active、Established

  1. Idle状态下,BGP拒绝任何进入的连接请求,是BGP初始状态。
  2. Active状态下,BGP将尝试进行TCP连接的建立,是BGP的中间状态。
  3. Established状态下,BGP对等体间可以交换Update报文、Route-refresh报文、Keepalive报文和Notification报文。

BGP对等体双方的状态必须都为Established,BGP邻居关系才能成立,双方通过Update报文交换路由信息

BGP的数据库

  1. IP路由表 (IP-RIB):全局路由信息库,包括所有IP路由信息
  2. BGP路由表 (Loc-RIB):BGP路由信息库,包括本地BGP Speaker选择的路由信息
  3. 邻居表:对等体邻居清单列表
  4. Adj-RIB-In:对等体宣告给本地Speaker的未处理的路由信息库
  5. Adj-RIB-Out:本地Speaker宣告给指定对等体的路由信息库
    BGP路由信息处理
    本地被优选的路由,才允许更新给对等体

路由黑洞

简单的说,它会默默的将数据包丢弃,使所有数据包有去无回,主要原因是没有相应的路由,本质是IP逐跳转发导致数据包丢失
BGP的路由黑洞
举例:AR6无法ping通AR1的11.11.11.11,主要是AR5的路由表中11.11.11.11的下一跳是2.2.2.2(AR5和AR2没有直连),在其转发表中2.2.2.2的下一跳是35.1.1.3(或者45.1.1.4),但是AR3(或者AR4)中没有关于11.11.11.11的路由,导致所有涉及11.11.11.11的数据包被丢弃。

解决路由黑洞方法

  1. 物理线路直连(不可取),但是可以使用GRE隧道。【即在AR2和AR5之间建立GRE通道】
  2. 全互联可以解决 ,管理成本增加(不可取
  3. 将EBGP路由引入IGP可以解决路由黑洞 (不可取),会造成IGP负担过重
  4. 可以在黑洞设备上配置静态也可以解决(不可取
  5. 开启同步,即从IBGP收到的路由,如果IGP中不存在,就不会通告EBGP邻居【即AR5中不存在11.11.11.11/32,所以AR5不会将此路由通告给AR6】
  6. 配置路由反射器,路由反射器不是解决路由黑洞的,是解决水平分割的问题。【在R3上配置RR,R2和R5不再需要配置BGP邻居】iBGP的水平分割规则:来自iBGP对等体的路由,不能传递给iBGP对等体 。路由反射器是专门破坏这个规则的
  7. 联邦是用来解决水平分割的问题,但也可以解决路由黑洞
  8. MPLS网络

BGP路由通告原则

  1. 只把本身的最优路由通告给对等体,多条路径时,只选择最优路由放入路由表
  2. eBGP获得的路由会向它所有的BGP对等体(包括eBGP和iBGP)通告
  3. iBGP获得的路由不会通告给它的iBGP邻居水平分隔
  4. iBGP获得的路由是否通告给它的eBGP对等体要依IGP和BGP同步的情况来决定。

BGP同步的概念:
BGP Speaker不将从IBGP对等体获得的路由信息通告给它的EBGP对等体,除非该路由信息也能通过IGP获得即从IBGP对等体获得的路由只有在IGP中也存在的情况下才会优选
目的是防止AS内部出现路由黑洞,向外部通告了一个本AS不可达的虚假的路由
只影响IBGP邻居之间的路由传递,不影响EBGP邻居之间的路由传递

理解

  1. 从IBGP对等体获得的BGP路由,BGP设备只发布给它的EBGP对等体默认修改下一跳
  2. 从EBGP对等体获得的BGP路由,BGP设备发布给它所有EBGP不在同一广播网,默认修改下一跳;在同一广播网则不修改下一跳和IBGP默认不修改下一跳对等体为了避免次优路径,例子参考同一交换机下的三个路由器即接收者为EBGP时才会修改下一跳
  3. 当存在多条到达同一目的地址的有效路由时,BGP设备只将最优路由发布给对等体,同时只把最优的放进路由表
  4. 路由更新时,BGP设备只发送更新的BGP路由
  5. 所有对等体发送的路由,BGP设备都会接收
    EBGP多跳和指定更新源:EBGP可以采用直连建立,也可以采用环回口作为更新源建立EBGP邻居用以备份,但需要修改TTL值

BGP路由的来源

  1. network(宣告)
    精确的将一条IGP路由放入BGP路由表,需要本地存在并且可达,network宣告的路由的起源属性为i
  2. import-route命令(引入)
    通过import-route命令把IGP路由或静态路由注入到BGP路由表中,import-route引入的路由的起源属性为?
  3. aggregate命令(聚合)
    聚合路由,本地该路由的下一跳是127.0.0.1

BGP路径属性

公认必遵Well-known mondatory(周知强制)

所有BGP路由器都可以识别,且必须存在于Update消息中。如果缺少这种属性,路由信息就会出错。

1. Origin:起源

一般的,具体的实现按如下方式决定一条路由的Origin属性默认情况下不被任何路由器修改,i>e>?

  1. 某条路由是直接而具体的注入到BGP路由表中的,则origin属性为IGP(i),例如:通过network命令注入BGP的路由
  2. 通过EGP学到的路由,则origin属性为EGP(e),目前已经不用了
  3. 其他情形下,Origin属性都为Incomplete(?),例如通过import命令注入BGP的路由

2. AS_Path:AS路径

描述到达目标网络所要经过的AS号序列。最重要的作用是EBGP防环,如果要修改AS_PATH属性,则必须在ABR上执行策略。
有四种类型的AS_PATH

  1. AS_SET:as-number无序的,表示方法为{100 200 300},并且大括号内不管有多少个as-number,在选路时其长度为1【拓展:小括号表示联盟的子as,中括号表示联盟内对路由汇总】
  2. AS_SEQUENCE:as-number有序的,追加as-number时是在as-path头部插入,例如起源于as100的路由,由as200传递给as300时,其as-path为"200 100"
  3. AS_CONFED_SEQUENCE:联盟内使用,as-number有序的
  4. AS_CONFED_SET:联盟内使用,as-number无序的

eBGP防环规则的修改以及应用场景

  1. Hub-spoke架构网络
    1. 使用DM VPN模块
    2. 使用相同的AS,中间点配置成路由反射器
  2. 客户路由通过SP(运营商)更新
    1. overraid,覆写,即左边AS300的路由传到AS200时,其属性as-path修改为200,然后在传递给右边的AS300(应用于MPLS VPN)
    2. 允许接收相同AS的路由,可以设置次数,即右边的AS300可以接收左边AS300的路由
      eBGP防环规则的修改
  3. 仅通过as-path选路可能会出现次优路径,但可以通过加长as_path的列表长度,从而影响路径选择。例如:从RTA向RTB更新时增加as-path长度,则使得路由选择2M链路,而不是64K的
    加长as_path的列表长度

3. Next_Hop:下一跳

  1. 从IBGP对等体获得的BGP路由,BGP设备只发布给它的EBGP对等体,默认修改下一跳只有这条路由能够从IGP获得时才会通告给EBGP邻居,主要是为了防止路由黑洞
  2. 从EBGP对等体获得的BGP路由
    1. BGP设备发布给它所有EBGP邻居不在同一广播网,默认修改下一跳,在同一广播网则不修改下一跳
    2. BGP设备发布给它所有IBGP邻居默认不修改下一跳,对等体为了避免次优路径

即只有2种情况下修改下一跳:1. iBGP到EBGP;2. EBGP到不同网络的EBGP
【总结】:一般会在ASBR对内部对等体设置下一跳自我,即修改下一跳;eBGP对等体之间的下一条不改变一般用于域间MPLS VPN,一般用在RR之间

公认任意Well-known discretionary(周知可选)

所有BGP路由器都可以识别,但不要求必须存在于Update消息中,可以根据具体情况来决定是否添加到Update消息中

1. Local_Pref:本地优先级

告诉AS中的路由器,哪条路径是离开AS的首选路径。优先级属性用来影响iBGP邻居,告诉自己的iBGP邻居如何离开本AS只能在本AS内传递(iBGP对等体或者联邦内部),不能传给EBGP邻居。默认值为100,越大越好。
MED控制流量怎样进入AS,而本地优先级则控制流量怎样流出AS;路由器优选Local-preference值大的路由控制出流量,优选MED值小的路由控制入流量。

2. Atomic_Aggregate:原子聚合

与团体属性互斥,只有在聚合路由时追加detail-suppressed时才会携带该属性,命令如下:aggregate 1.1.1.0 255.255.255.0 detail-suppressed一旦设置该属性,则不会再继承明细路由的团体属性,即默认情况下通告聚合路由的同时也通告明细路由,追加此参数之后就不再通告明细路由
有时BGP发布者会收到两条重叠的路由,其中一条路由包含的地址是另一条路由的子集。一般情况下BGP发布者会优选更精细的路由(前者),但是在对外发布时,如果它选择发布更粗略的那条路由(后者),这时需要附加上ATOMIC-AGGREGATE属性,以知会对等体。它实际上是一种警告,因为发布更粗略的路由意味着更精细的路由信息在发布过程中丢失了。在进行路由聚合时,对于聚合的路由信息会添加ATOMIC-AGGREGATE属性

可选可传递Optional transitive(过渡)

BGP路由器可以选择是否在Update消息中携带这种属性接收的路由器如果不识别这种属性,可以转发给邻居路由器,邻居路由器可能会识别并使用到这种属性。

1. Aggregator:聚合者

聚合时也会自动出现该属性。它包括发动聚合路由器的AS号码还有它的RouterID,从而提供了执行聚合的地点信息。Atomic-aggregate属性指示出现了路径信息的丢失而aggregator属性指示聚合路由出现在哪里。

路由聚合后会继承哪些属性?

  1. Origin:如果一条路由有多个起源,则继承优先级最低的那个起源属性
  2. AS_Path:只有配置了as-set才会继承,继承此属性是为了防环,在detail-suppressed后追加参数as-set才会继承
  3. Community:在没有配置Atomic_Aggregate时才会继承

2. Community:团体

团体是一组有相同性质的目的地址路由目的就是将路由信息编组,通过组的标识决定路由传递的策略。它被一组共享相同特性的前缀所定义,多个社团可以应用到一条前缀上。
团体属性是BGP的私有属性在BGP对等体之间传播,且不受AS限制。利用团体属性可以使AS中的一组BGP设备共享相同的策略,从而简化路由策略的应用和降低维护管理难度。
BGP设备可以在发布路由时(或者针对邻居更新以及收取时、或者引入路由时),新增或者改变路由的团体属性。
团体属性是在BGP中一种给路由条目打上标记,用于确保路由过滤和选择的连续性,BGP路由器可以过滤进出路由更新或者优选某些路由。
默认不传递给对等体,要针对邻居做传递,即传递团体属性需要配置命令peer 22.1.1.1 advertise-community
Community属性有4个字节(0x00000000—0xFFFFFFFF)前两个字节代表AS号码后两个字节是管理上定义的标识符。格式为AA:NN。
团体属性有以下3种类型:保留的团体属性、公认的团体属性、私有团体属性

  1. 保留团体属性:0x00000000—0x0000FFFF、0xFFFF0000—0xFFFFFFFF
  2. 公认团体属性:当收到这些带有团体属性的前缀时,对等体会自动根据预定义(操作已经定义好了)的社团属性意义来采取操作,不需要额外的配置。公共团体属性的保留范围是(0xFFFF0000-0xFFFFFFFF)。下面是4种公共社团属性:
    1. Internet:所有属于这个团体属性的路由都有一个缺省值,可以自由地公布属于这个团体的路由。换句话说这个团体的前缀通告没有任何限制
    2. No-export:有这个属性的前缀不会被通告给eBGP对等体,但是可以发送给联邦的eBGP对等体,也就是不能在联邦范围以外公布。这个团体的值为0xFFFFFF01
    3. No-advertise:接收到带有此值的路由不能公布给任何对等体,包括iBGP对等体和eBGP对等体。它的值为0xFFFFFF02
    4. No-export-subconfed:有这个属性的路由条目不会被通告到本地AS之外。在联邦情况下,只有在同一个子AS中的对等体才会允许接受这些前缀。它的值为0xFFFFFF03在RFC1997中这个团体也叫做no-export-subconfed
  3. 私有社团属性(自定义团体属性):AS(2B):Number(2B),有网络管理员自己定义的社团属性,它的主要目的是为前缀附加管理标记,以便制定合适的策略。通过干预携带的团体属性的路由,影响数据报文的转发,也用于路由清洗。

可选非可传递Optional non-transitive(非过渡)

BGP路由器可以选择是否在Update消息中携带这种属性。在整个路由发布的路径上,如果部分路由器不能识别这种属性,可能会导致该属性无法发挥效用。因此接收的路由器如果不识别这种属性,将丢弃这种属性,不必再转发给邻居路由器

1. Multi_Exit_Disc(MED):多出口分离器

区别到达同一邻居AS的多条入口链路(MED的默认值为0,越小越优先),通过eBGP发送MED值给对等体
通告规则起源于自身的传递给任何邻居时都携带,从邻居学到的只能在本AS内传递

  1. MED属性起源于iBGP对等体,在传递给eBGP对等体时会清除MED属性
  2. MED起源于eBGP对等体,在传递给iBGP对等体时携带
  3. MED起源于本地,可以通告给所有对等体

例如:起源于RT1,RT1传递给RT2时携带MED值;起源于RT1,RT2在向RT3传递时不携带;起源于RT2,RT2在向RT3传递时携带。只在2个设备之间传递,不会传递给第3个设备
通告规则
对比规则:缺省情况下,不允许比较来自不同AS邻居的路由信息的MED值。但是,可以调整这个规则。

2. Originator_ID:起源ID

用于RR,防止客户端之间环路
是本地AS中路由发起者的RouterID。如果路由发起者在接收到路由的originator-id中发现了自己的RouterID,就知道产生了环路,于是忽略该路由条目,它提供在AS内的防环作用,它由第一个RR创建,并且不被后续的RR修改
只应在iBGP对等体那里接收到,在RR上originator-id用来替代路由选择过程中的RouterID。它应该是这些路由器的RouterID:在本地AS始发路由的BGP宣告者的router-id;如果是从eBGP学到的就是最初学到那个条目的路由器(本AS内边界路由器)的router-id(它一定是本AS内路由器的router-id)

3. Cluster_List

用于RR,防止RR之间的环路
路由经过的路由反射器的簇ID(默认RR的router-ID)的一个列表,如果路由反射器接收到的路由的cluster-List中发现了自己的本地簇ID,就知道产生了环路,于是忽略该路由条目,RR从而能够分别出路由选择信息是否又环回到同一个簇。可以配置bgp cluster-id。cluter-id默认为RR自己的router-id所以默认情况下所有的RR都不在同一个簇。

BGP选路原则

前提如果此路由的下一跳不可达,忽略此路由

1. Preferred-Value(首选项)

越大越优默认0,只具有本地意义,不传递给对等体
Preferred-Value

2. Local-Preference(本地优先级)

越大越优默认100,属于公认非强制属性,只在AS内部传递
Local-Preference

3. 本地起源评估

本地生成路由优先,手动聚合>自动聚合>network>import-route起源于0.0.0.0或者127.0.0.1的,例如network、aggregate、import-route
本地起源评估
例如:R1、R2都将10.1.12.0/24宣告进BGP,R2收到R1发过来的10.1.12.0 的路由,prefer-value、local-preference都一样,但是本地发起的优先,所以bgp表中自己宣告的路由为最优路径

手动聚合和自动聚合的区别:

  1. 手动聚合可以聚合network和import-route的路由条目
  2. 自动聚合只能聚合import-route的路由条目,并且只能汇总为主类路由

4. as-path

长度越短越优

  1. 可以使用命令bestroute as-path-ignore跳过本条
  2. AS_CONFED_SEQUENCE 和 AS_CONFED_SET(联盟内部AS号)不计入as-path长度
  3. AS_SET长度计为1
    as-path
    例如:左侧路径路由传递过来as-path为200 100,长度为 2;右侧传递过来as-path为400, 长度为1,优选右侧传递过来的路由为最优路径

5. 路由起源代码

i>e>?

6. MED值(即cost值)

越小越优默认为0

  1. 默认只比较as-path中最近一个相同as中的路由,否则忽略此条
  2. 配置compare-different-as-med,允许比较来自不同自治系统中的邻居的路由的MED值
  3. 配置bestroute med-confederation,仅在联盟内比较MED值即超出子AS的界限,边界是联盟
  4. 配置deterministic-med,对从多个不同AS收到的相同前缀的路由进行选路时,首先会按路由的AS_Path最左边的AS号进行分组。在组内进行比较后,再用组中的优选路由和其他组中的优选路由进行比较,消除了选路的结果和路由接收顺序的相关性
    MED值

7. EBGP>IBGP

EBGP>IBGP

8. BGP下一跳的IGP度量

越小越优
BGP下一跳的IGP度量

当以上全部相同且as-path完全相同,则为等价路由,可以负载分担。但是默认情况下max-paths为1,即最多只能有一个下一跳,因此通告给邻居的路由条目只有一条最优路由。如果要进行负载分担,需要修改max-paths值。当负载分担时,以下原则无效

9. Cluster-List

长度越短越优由RR添加该属性,Cluster-List中包含RR的ClusterID,默认情况下为RR的RouterID,用于RR的防环
Cluster-List

10. RouterID(非RR反射的路由)/Originator_ID(经过RR反射的路由)

越小越优如果两条路由一条只有Originator_ID、一条只有RouterID,那么选择只有RouterID那条。因为携带Originator_ID那条路由是经过反射的,经过反射的路由必然会携带Clust-list,而不经过反射的不携带,即长度为0,所以会选择只有RouterID的那条路由
Originator_ID
as外部路由,originator-id就是边界路由器5和6,这里虽然邻居R3路由器ID小,但是由于 originator-id是4那边小,所以选择右侧过来的路由为最优
RouterID

11. 对等体的IP地址

越小越优
对等体的IP地址
下方路由器与上面路由器的2个地址10.1.12.2和10.1.22.2分别建立2个邻居,2个链路igp开销也相同,这2个邻居其实是同一个路由器,所以路由器id一样,至此前面所有的法则都无法打破僵局,最终只能根据建邻居地址越低越优先,选择了10.1.12.2的邻居关系来发送BGP路由

BGP的防环

  1. EBGP
    通过as-path防环。丢弃从EBGP对等体接收到的在as-path属性里包含自身as号的任何更新信息。可以配置peer allow-as loop 重复出现的次数,来配置一个AS号在as-path中出现的次数
  2. IBGP
    通过水平分隔防环。BGP路由器不会将任何从IBGP对等体接收到的更新信息传给其他IBGP对等体。这个带来路由黑洞等问题,可以通过全互联、RR、联盟等手段解决
  3. 路由反射器
    1. 通过Cluster-list防止RR间环路。RR收到的路由的Cluster-list中包含自己的cluste-id则丢弃
    2. 通过Originator_ID防止客户端之间环路。客户端收到的路由的Originator_ID为自己的RouterID则丢弃
  4. 路由聚合时,聚合路由器会自动产生指向null0的路由自动和手动聚合都会产生
  5. IBGP默认不能重发布给IGP,即把BGP的路由引入到IGP中只会引入EBGP的路由,不会引入IBGP的路由。如果想要引入IBGP的路由需要在import bgp后面再加上IBGP。

解决IBGP的水平分隔防环导致的问题

路由反射器

成为RR的两种方式:1.配置ClusterID;2.配置至少一个客户端

角色

BGP路由反射器
  • 路由反射器RR:允许把从IBGP对等体学到的路由反射到其他IBGP对等体的BGP设备,类似OSPF网络中的DR。
  • 客户机Client:与RR形成反射邻居关系的IBGP设备。在AS内部客户机只需要与RR直连
  • 非客户机Non-Client:既不是RR也不是客户机的IBGP设备。在AS内部非客户机与RR之间,以及所有的非客户机之间仍然必须建立全连接关系
    客户端和非客户端只具有本地意义,并且只有RR才知道。客户端和非客户端都只和RR建立邻居关系,RR收到后负责转发,因此只需要在RR上定义客户端和非客户端
    RR反射的路由条目不修改任何属性,同时会追加属性Cluster-list和Originator_ID,用于防止集群之间和集群内部的环路
  • 始发者Originator:在AS内部始发路由的设备。Originator_ID属性用于防止集群内产生路由环路
  • 集群Cluster:路由反射器及其客户机的集合。Cluster_List属性用于防止集群间产生路由环路。

路由反射宣告原则

RR突破了"从IBGP对等体获得的BGP路由 只发布给它的EBGP对等体"的限制

  1. 从非客户机IBGP学到的路由,发布给此RR的所有客户机和EBGP对等体
  2. 从客户机学到的路由,发布给此RR所有非客户机和客户机(发起此路由的客户机除外)
  3. 从EBGP对等体学到的路由,发布给所有的非客户机和客户机
    从非客户端学到的只发布给客户端,否则发布给所有的客户端和非客户端
    【总结】:eBGP-->所有客户机和非客户机(因为这些设备与RR之间都是IBGP关系),非客户机路由-->所有客户机和eBGP,客户机-->所有客户机、非客户机和eBGP

路由反射簇(即路由反射集群,Cluster)

  • 通过4字节的Cluster_ID来标识Cluster,通常会使用LoopBack地址作为Cluster_ID
  • 一个Cluster里可以包括一个或者多个RR;一个Client可以同时属于多个Cluster

反射器部署方式

1. 备份路由反射器

为增加网络的可靠性,防止单点故障对网络造成影响,需要在一个集群中配置一个以上的RR,但集群中的所有RR必须使用相同的ClusterID,以避免RR之间的路由环路。
备份路由反射器
路由反射器RR1和RR2在同一个集群内,配置了相同的Cluster ID

  1. 当客户机Client1从EBGP对等体接收到一条更新路由,它将通过IBGP向RR1和RR2通告这条路由。
  2. RR1和RR2在接收到该更新路由后,将本地Cluster ID添加到Cluster List前面,然后向其他的客户机(Client2、Client3)反射,同时相互反射。
  3. RR1和RR2在接收到该反射路由后,检查Cluster List,发现自己的Cluster ID已经包含在Cluster List中。于是RR1和RR2丢弃该更新路由,从而避免了路由环路。

2. 多集群路由反射器

一个AS中可以存在多个集群,各个集群的RR之间建立IBGP对等体。当RR所处的网络层不同时,可以将较低网络层次的RR配成客户机,形成分级RR。当RR所处的网络层相同时,可以将不同集群的RR全连接,形成同级RR。

1. 分级路由反射器

在实际的RR部署中,常用的是分级RR的场景。ISP为AS100提供Internet路由。AS100内部分为两个集群,其中Cluster1内的四台设备是核心路由器,采用备份RR的形式保证可靠性。
分级路由反射器

2. 同级路由反射器

同级路由反射器
一个骨干网被分成多个集群。各集群的RR互为非客户机关系,并建立全连接。此时虽然每个客户机只与所在集群的RR建立IBGP连接,但所有RR和客户机都能收到全部路由信息。

联盟

解决AS内部的IBGP网络连接激增问题,除了使用路由反射器之外,还可以使用联盟(Confederation)。联盟将一个AS划分为若干个子AS每个子AS内部建立IBGP全连接关系,子AS之间建立联盟EBGP连接关系(子AS之间通告路由不修改下一跳),但联盟外部AS仍认为联盟是一个AS。配置联盟后,原AS号将作为每个路由器的联盟ID。这样有两个好处

  1. 可以保留原有的IBGP属性,包括Local Preference属性、MED属性和NEXT_HOP属性等;
  2. 联盟相关的属性在传出联盟时会自动被删除,即管理员无需在联盟的出口处配置过滤子AS号等信息的操作。
    BGP联盟
    AS100使用联盟后被划分为3个子AS:AS65001、AS65002和AS65003,使用AS100作为联盟ID。此时IBGP的连接数量从10条减少到4条,不仅简化了设备的配置,也减轻了网络和CPU的负担。而AS100外的BGP设备因为仅知道AS100的存在,并不知道AS100内部的联盟关系,所以不会增加CPU的负担。

路由反射器和联盟的比较

在联盟中可以使用RR,但是在RR中无法使用联盟

路由反射器 联盟
不需要更改现有的网络拓扑,兼容性好 需要改变逻辑拓扑
配置方便,只需要对作为反射器的设备进行配置,客户机并不需要知道自己是客户机 所有设备需要重新进行配置
集群与集群之间仍然需要全连接 联盟的子AS之间是特殊的EBGP连接,不需要全连接
适用于中、大规模网络(对现有网络进行改造) 适用于大规模网络(新建大型网络)

无效路由场景(BGP路由条目在什么情况下不加表)

BGP无效路由是指可以收到路由,但是路由条目前面没有*号标记,表示是一条无效路由【即BGP表中有路由,但是此路由是不可用路由,不装进 IP 路由表】

1. BGP路由下一跳不可达

BGP路由下一跳不可达
R1上将1.1.1.1/32 路由通告进BGP,在R3上查看BGP路由表,可以收到 1.1.1.1/32 路由,但不是一条有效路由,因为其下一跳为12.1.1.1不可达。
解决方案:

  1. R2上设置下一跳自我
  2. R2上将12.1.1.1引入到IGP或者在R3上创建一条静态路由

2. 通过默认路由建立BGP邻居关系

通过默认路由建立BGP邻居关系
分别在R1和R2上配置到对方的默认路由,并通过lo0口建立IBGP邻居关系。在R1上将lo1的11.1.1.1/32路由宣告进BGP。在R2上可以收到11.1.1.1/32路由,但不是一条有效路由,因为BGP邻居是通过默认路由建立,为了防止环路问题从邻居收到的路由条目全部设置为无效
解决方案:
通过静态路由或者IGP路由建立BGP邻居关系

3. BGP路由同步(路由为有效,但是不会优选)

BGP路由同步
R1上将1.1.1.1/32宣告进 BGP,在AS200中的所有设备上开启BGP同步,R2可以收到1.1.1.1/32的EBGP路由并且优选,R2将路由通告给R3并且修改下一跳自我,在R3上查看BGP路由表,可以收到1.1.1.1/32的路由,但是为非优路由,R3不优选同时不会通告给其它的客户端。
BGP开启同步后,会检查从IBGP邻居(如果路由来自EBGP邻居,忽略同步检查)接收的BGP路由是否同时存在于IGP路由表中,如果IGP路由表中有同样的路由条目,优选该路由,如果没有则不优选,目的是避免因为通告而造成的路由黑洞问题
解决方案:
将BGP路由引入到IGP(不可行)

4. 将建立邻居的路由通告进BGP

将建立邻居的路由通告进BGP
R1和R2通过OSPF互通,并通过lo0口建立IBGP邻居关系。IBGP邻居关系建立后,分别在R1和R2上将lo0口路由在宣告进BGP。R1和R2上都可以看到对方通告的BGP路由,但是为无效路由。
由于IGP和BGP通告了同样的路由条目,并且BGP是通过此路由建立的邻居关系。如果现在将BGP路由设置为有效并且优选需要将BGP路由的优先级设置为9(小于ospf的优先级10就行)会带来IBGP邻居震荡的问题。
原因是用于建立IBGP邻居的路由优选了BGP,出现了自环即用于建立BGP邻居的路由来自BGP内部,导致路由不可达。造成180秒后IBGP邻居down,IBGP邻居down后在次优选IGP路由,路由可达。重新建立IBGP邻居并重复之前的流程,IBGP邻居会一直震荡下去。
华为针对这种场景做了优化,如果收到的BGP路由等于建立BGP邻居的路由,设置该路由为无效路由

5. EBGP路由惩罚(dampening)

EBGP路由惩罚
R1和R2建立EBGP邻居,R1将 1.1.1.1/32路由通告进BGP,在R2上配置BGP路由惩罚,配置完成后在R1上连续执行针对1.1.1.1/32路由的取消通告和通告操作,那么在R2上1.1.1.1/32路由被标记为D,设置为无效路由

6. MPLS VPN 场景(LSP不完整造成的无效路由)

MPLS VPN 场景
AS100内通过OSPF路由协议互联,PE1和PE2建立MP-IBGP邻居关系,并在PE1上将CE1路由引入到 MP-BGP,AS100内只开启MPLS,但是不配置LDP。
PE2上可以收到PE1通告的MP-IBGP路由,但是路由不是有效路由,因为到达私网路由的下一跳没有一条完整的LSP,从而造成VPNv4路由不是一条有效路由。
解决方案:
在AS100内的所有设备上开启LDP,通过LDP分配公网标签,建立一条到达下一跳的LSP

7. 其他场景

  1. 如果是VPNv4的路由,无法迭代到下一跳对应的隧道,或者隧道不是/32 位掩码,则此路由不进客户的实例路由或者不传给EBGP邻居
  2. bgp-rib-only命令用来禁止BGP路由下发到IP路由表只在BGP路由表中有,不进自身路由表
  3. active-route-advertise命令用来配置BGP仅发布在IP路由表中被优选的路由,那些在BGP中是最优但是在IP路由表中不是最优的路由则不通告给邻居

补充

IGP和BGP的区别

  1. IGP主要解决数据的转发,BGP主要解决路由的传递和控制
  2. IGP,运行于AS内部的路由协议,主要有RIP、OSPF、ISIS,着重于发现和计算路由;EGP,运行于AS之间的路由协议,现通常都是指BGP,着重于控制路由的传播和选择最优的路由。

BGP特点

  • BGP是外部路由协议,用来在AS之间传递路由信息
  • 是一种增强的距离矢量路由协议
    • 可靠的路由更新机制
      • 使用TCP承载,端口号为179
      • 无需周期性更新,路由更新时只发送增量路由触发更新和增量更新
      • 周期性发送KeepAlive报文检测TCP的连通性
    • 丰富的Metric度量方法
    • 从设计上避免了环路的发生
  • 为路由附带属性信息
  • 支持CIDR(无类别域间选路)
  • 丰富的路由过滤和路由策略

属性总结

根据属性主要作用,将其可大致分为5个方向:3个选路、3个防环、2个反射、2个汇总、1个团体
属性总结

3个选路(weight、local、med)

首先为什么要有三个选路属性?因为三个属性各司其职,作用均不相同

  1. preferred-value:只作用于自己,不可传递给其他人;适用于一个路由器在多条路径下的选路,无视邻居属性,默认情况下preferred-value=0
  2. local-pref:与preferred-value相比,最大的优点为公有且可作用于AS内其他路由器,用于本AS选择离开AS的出口路由器
  3. med:与前两者相比,最大的区别在于,可以作用于出口、影响其他AS,如果在本AS使用,和local差别不大;值得注意的是,med属性只能在两个as之间传递,不能传递给第三个as。

3个防环(origin、as_path、next_hop)

BGP协议利用3个公认必遵属性进行防环

  1. origin:起源属性,标识该路由的来源方式,i表示自己产生的、e表示EGP学到的、?表示其他手段得到的(重发布),优先顺序为i>e>?。这一属性,实为路由协议之间的较量,在自己内部传递是不会改变属性的;通过这一属性,来保证从自己发出的路由,经过其他协议处理之后,不会再流传给自己,从而防环。
  2. as_path:将经过的AS统统记下来,最近经过的的排前面,路由器拒绝接受携带自己AS号的路由,当然该属性也可以用来选路,as_path短的优先。
  3. next_hop:IBGP之间传递路由不会更新next_hop(只有next_hop为0.0.0.0的情况才会更新,自己为0,保证从自己发出去的不再回来);eBGP之间传递路由会更新next_hop为自己的更新源地址。

2个反射防环(originator-id、cluster-list)

非客户端之间不能相互反射,但在反射之后,就违背了BGP设计之初防环的作用,所以又诞生了两个反射防环属性。

  1. originator-id:反射路由器收到路由后,用起源者的rid标记,后面的路由器看到自己的rid,不收,从而起到防环的作用。originator-id只能标记一个路由器,若途经多个反射器,则无能为力,可能导致反射器之间出环,所以出现了cluster-list。
  2. cluster-list:反射路由器反射出去的路由,会生成列表,加入自己的rid,沿途反射的均加入自己的rid,等收到后,若列表中有自己的rid,则忽略,达到防环的目的。

2个汇总(Atomic-aggregate、aggregator)

由于路由协议庞大且复杂,那么避免不了需要对一些路由进行汇总,汇总本身就是消灭一些路由、产生一些路由,而在这个过程中必然会丢失很多属性。

  1. Atomic-aggregate:通过添加某些选项,来达到弥补丢失一些属性的作用。
    追加as-set,继承明细as-path属性,防环;加summary only 只显示汇总;加advertise-map 显示某些属性;加attribute-map 为聚合后的添加某些属性。
    而在其他路由器得到汇总路由之后,有可能需要知道是谁产生的汇总,那么就产生了aggregator属性。
  2. aggregator:通告汇总路由的汇总路由器BGP-ID ,寻找汇总者方便

1个团体(community)

团体属性主要有两大作用:1. 为了可读性好; 2. 规定和谁玩

  1. 可读性好:
    利用正则表达式X:Y 形式来标识,使得可读性大大提高。
  2. 规定和谁玩:
    利用四条子属性来规定和谁玩的问题。
    1. Internet:默认属性,可以给任何bgp发送,不对携带团体值的路由做任何限制
    2. no-advertise:不在ibgp,ebgp邻居间传递,禁止传递给其他邻居
    3. no-export:只能在一个as之内传递,可以在联盟内传递,该属性就是限制携带团体值的路由传递给ebgp邻居,联盟ebgp除外
    4. no-export-subconfed:不向任何ebgp邻居发送,包括联盟的ebgp邻居

追问

影响BGP邻居建立的因素

  1. 版本号:默认我4
  2. AS号:IBGP要求必须一致,EBGP邻居必须不一致
  3. RouterID:不能冲突
    1. 直连冲突:地址大的一方开启TCP连接,TCP连接建立成功后互发open消息并将状态转为opensent,但是由于open消息中的BGP ID(BGP标识符一样)导致建立不起来邻居,于是互相发送notification消息,type=2 (open消息) 3错误的BGP ID。互相收到后进入Idle状态,进入TCP重置。
    2. 非直连冲突:同上
  4. 179 端口被禁止:如果被禁止,则无法建立 TCP 连接,也就无法建立邻居
  5. peer可达性:peer地址必须可达
  6. 认证不通过
  7. 收到报文的源地址必须和peer的地址相同
  8. EBGP用环回口建邻居需要指多跳

BGP在传递IPV4、IPV6、VPNv4路由时为什么更加简单

  1. BGP是外部路由协议,用来在AS之间传递路由信息,是一种增强的距离矢量路由协议,具有丰富的Metric计算方法,并且支持CIDR
  2. Open报文中的Optional Parameters字段可协商传递何种路由,可通过AFI和SAFI协商具体携带何种路由信息
  3. Update报文是邻居之间用于交换路由信息的报文,由5个部分组成,其中包括撤销路由信息和可达路由信息及其各种路由属性,是一种TLV的报文结构,携带多种路由信息比较简单
  4. 拥有丰富的扩展属性传递路由
    MP_BGP是一种多协议的BGP,为了提供对多种网络层协议的支持,MP-BGP使用扩展属性和地址族来实现对IPv6、组播和VPN相关内容的支持,包含传递IPv4的BGPv4版本、传递IPv6的BGPv4+版本和传递组播的MBGP版本,所以可以传递多种路由条目,为支持VPNv4,增加了属性值为14(传递可达路由)和15(撤销不可达路由)的两种属性,但是BGP协议原有的报文机制和路由机制并没有改变。

IBGP与EBGP传递路由有什么区别

  1. next-hop:从IBGP邻居学到的路由向EBGP传递路由的时候,下一跳改为自己;从EBGP邻居学到的路由向IBGP传递路由的时候,下一跳不改变
  2. as-path:传递给EBGP邻居的时候会添加自己的AS号;传递给IBGP邻居的时候不加自己的AS号
  3. local-preference:EBGP传递路由的时候剥离LP属性;IBGP传递路由时携带LP属性
  4. med:从IBGP邻居收到的路由传递给EBGP路由时候MED默认剥离;从EBGP邻居收到路由传递给IBGP邻居的时候MED不变
  5. cluster-list和起源ID:向IBGP反射路由时候保留cluster-list和起源ID,向EBGP传递路由时剥离这两个属性