华为 RS BGP协议原理与配置学习笔记

BGP   Border Gateway Protocol,边界网关协议

AS内部使用IGP来计算和发现路由,如OSPFISISRIP等。

AS之间使用BGP来传递和控制路由。

 如上图所示,BGP可以跨越多跳路由器建立邻居关系。为实现路由按需求进行控制和优选,BGP设计了诸多属性携带在路由中。BGP协议被设计运行在AS之间传递路由,AS之间是广域网链路,数据包在广域网上传递是可能出现不可预测的链路拥塞或丢失等情况,因此BGP使用TCP作为其承载协议来保证可靠性。

BGP使用TCP封装建立邻居关系,端口号为179,TCP采用单播建立连接,因此BGP协议并不像RIPOSPF一样使用组播发现邻居。单播建立连接也使BGP只能手动指定邻居。

 

先启动BGP的一端先发起TCP连接,如图所示,RTB先启动BGP协议,RTB使用随机端口号向RTA179端口发起TCP连接。 

如果两台路由器同时启动BGP协议,同时向179端口建立连接,会选择 router id大的路由器建立起的连接。

BGP通过报文的交互完成邻居建立、路由更新等操作,共有Open、Update、Notification、Keepalive和Route-refresh5种报文类型,如下图所示,
Open报文:是TCP连接建立后发送的第一个报文,用于建立BGP邻居之间的连接关系。BGP邻居在接收到Open报文并协商成功后,将发送Keepalive报文确认并保持连接的有效性。确认后,BGP邻居间可以进行UpdateNotificationKeepaliveRoute-refresh报文的交换。
Update报文:用于在BGP邻居之间交换路由信息Update报文可以发布多条属性相同的可达路由信息,也可以撤销多条不可达路由信息。
一条Update报文可以发布多条具有相同路由属性的可达路由,这些路由可共享一组路由属性。所有包含在一个给定的Update报文里的路由属性适用于该Update报文中的NLRINetwork Layer Reachability Information)字段里的所有目的地(用IP前缀表示)。
一条Update报文可以撤销多条不可达路由。每一个路由通过目的地(用IP前缀表示),清楚地定义了BGP路由器之间先前通告过的路由。
一条Update报文可以只用于撤销路由,这样就不需要包括路径属性或者NLRI。相反,也可以只用于通告可达路由,就不需要携带撤销路由信息了。
Notification报文:当BGP路由器检测到错误状态时,就向邻居发出Notification报文,之后BGP连接会立即中断。
Keepalive报文:BGP路由器会周期性的向邻居发出Keepalive报文,用来保持连接的有效性
Route-refresh报文:Route-refresh用于在改变路由策略后请求对等体重新发送路由信息
 
BGP路由器报文交互过程:Idle状态BGP初始状态。在Idle状态下,BGP路由器拒绝邻居发送的连接请求。只有在收到本设备的Start事件后,BGP路由器才开始尝试与其邻居进行TCP连接,并转至Connect状态

在Connect状态下,BGP路由器启动连接重传定时器Connect Retry),等待TCP完成连接。如果TCP连接成功,那么BGP路由器向邻居发送Open报文,并转至OpenSent状态。 如果TCP连接失败,那么BGP路由器转至Active状态。 如果连接重传定时器超时,BGP路由器仍没有收到邻居的响应,那么BGP路由器继续尝试与其邻居进行TCP连接,停留在Connect状态。在Active状态下,BGP路由器总是在试图建立TCP连接。如果TCP连接成功,那么BGP路由器向邻居发送Open报文,关闭连接重传定时器,并转至OpenSent状态。 如果TCP连接失败,那么BGP路由器停留在Active状态。 如果连接重传定时器超时,BGP路由器仍没有收到邻居的响应,那么BGP路由器转至Connect状态。在OpenSent状态下,BGP路由器等待邻居的Open报文,并对收到的Open报文中的AS号、版本号、认证码等进行检查。如果收到的Open报文正确,那么BGP路由器发送Keepalive报文,并转至OpenConfirm状态。 如果发现收到的Open报文有错误,那么BGP路由器发送Notification报文给邻居,并转至Idle状态。在OpenConfirm状态下,BGP路由器等待KeepaliveNotification报文。如果收到Keepalive报文,则转至Established状态,如果收到Notification报文,则转至Idle状态。

在Established状态下,BGP路由器可以和邻居交换Update、Keepalive、Route-refresh报文和Notification报文。

生成BGP路由的方式有两种:第一种是使用配置命令network,第二种是使用配置命令import。如图所示,RTA上存在100.0.0.0/24100.0.1.0/24的两个用户网段,RTB上通过静态路由指定去往100.0.0.0/24网段的路由,通过OSPF学到去往100.0.1.0/24的路由。RTBRTC建立EBGP的邻居关系,RTB通过network命令宣告100.0.0.0/24,100.0.1.0/2410.1.12.0/24的路由,使对端EBGP邻居RTC学习到RTB路由表里的路由。

 

 

通过display命令在RTC上查看是否学到 BGP发布的路由条目。 

 

 BGP本身并不会产生新的路由,不会自动去学习到路由,BGP就像一个大卡车,通过network或者是import的方式将IGP产生的路由装载出去,进行传递。

lImport命令是根据运行的路由协议(RIPOSPFISIS等)将路由引入到BGP路由表中,同时import命令还可以引入直连和静态路由。

 

 RTA上存在100.0.0.0/24100.0.1.0/24的两个用户网段,RTB上通过静态路由指定去往100.0.0.0/24网段的路由,通过OSPF学到去往100.0.1.0/24的路由。RTBRTC建立EBGP的邻居关系,RTB通过import命令宣告100.0.0.0/24,100.0.1.0/2410.1.12.0/24的路由,使对端EBGP邻居学习到本AS内的路由。为了防止其他路由被引入到BGP中,需要配置ip-prefix进行精确匹配,调用route-policyBGP引入路由时进行控制。

BGP通告原则之一 : 仅将自己最优的路由发布给邻居,当存在多条有效路由时,BGP路由器只将自己最优的路由发布给邻居。

BGP通告原则之二 : 通过EBGP获得的最优路由发布给所有BGP邻居 

BGP通告原则之三 : 通过IBGP获得的最优路由不会发布给其他的IBGP邻居 ,在某种程度上,有一定的防环作用

BGP通告原则之四 : BGPIGP同步(华为的设备已经将这个功能关闭了,开启不了

如上图所示,RTA上存在一个100.0.0.0/24的用户网段,通过EBGP发布给RTBRTBRTD建立了IBGP邻居关系,RTD通过IBGP学习到该BGP路由,并将该路由发布给EBGP邻居RTE。当RTE访问100.0.0.0/24的路由时,查找路由表,发现到达100.0.0.0/24路由的下一跳是RTDRTE查找出接口后,将数据包发送给RTDRTD收到数据包后,查找路由表,发现到达100.0.0.0/24路由的下一跳是RTB,出接口是RTD上与RTC相连的接口,于是将数据包发给RTCRTC查找路由表,发现没有到达100.0.0.0/24的路由,于是将数据丢弃,形成“路由黑洞”。
BGP的通告原则:一条从IBGP邻居学来的路由在发布给一个BGP邻居之前,通过IGP必须知道该路由,即BGPIGP同步。如图所示,RTD在收到RTB发来的IBGP路由之后,如果要发布给BGP邻居RTE,则在发布之前先检查IGP协议(即OSPF协议)能否学到该条路由。如果能,则将IBGP路由发布给RTE。在华为路由器上,默认是将BGPIGP的同步检查关闭的,原因是为了实现IBGP路由的正常通告。但关闭了BGPIGP的同步检查后会出现“路由黑洞”的问题。因此,有两种解决方案解决上述问题:将BGP路由引入到IGP,从而保证IGPBGP的同步。但是,因为Internet上的BGP路由数量十分庞大,一旦引入到IGP,会给IGP路由器带来巨大的处理和存储负担,如果路由器负担过重,则可能瘫痪。
解决方案:IBGP路由器必须是全互联,确保所有的路由器都能学习到通告的路由。这样可以解决关闭同步后导致的“路由黑洞”问题
 
BGP的丰富属性
 
公认属性:所有BGP路由器都必须识别并支持的属性。所有厂商都需要支持的属性
公认必遵:BGPUpdate消息中必须包含的属性。
公认任意:不必存在于BGPUpdate消息中,可以根据需求自由选择的属性。
可选属性:不要求所有的BGP路由器都能够识别的属性。
可选过渡:BGP不能识别该属性,但可以接收该属性并将其发布给它的邻居的属性。

            可选非过渡:BGP可以忽略包含该属性的消息并且不向它的邻居发布。

 

 

如图所示,AS 200内运行OSPF协议,200.0.0.0/24网段宣告到OSPF中。RTB通过network方式将200.0.0.0/24的路由变为BGP路由通告给RTARTC通过import方式将200.0.0.0/24的路由变为BGP路由通告给RTA
BGPAS之间传递信息,承载大量的路由。如果到达同一目的IP有多条路径,且BGP学到这些路由通过不同的方式,则Origin属性是决定最优路径的一个因素,用于标明路由的起源。
Origin3种属性:
i表明BGP路由通过network命令注入;
e表明BGP路由是从EGP学来的,EGP协议在现网中很难见到,但可以通过路由策略将路由的Origin属性修改为e
? 即Incomplete表明BGP路由通过其它方式学到路由信息,如使用import命令引入的路由。
3Origin属性的优先级为:i>e>Incomplete(?)
 
 
BGP针对环路以及选择路径的问题,设计了AS_Path属性,该属性记录了路由经过的所有AS的编号:
如上图中RTARTB收到100.0.0.0/24的路由时,AS_Path为(24),RTARTC收到100.0.0.0/24的路由时,AS_Path为(354)。规定AS_Path越短(记录的AS编号越少),路径越优,因此RTA会优选从RTB收到的100.0.0.0/24的路由。
pRTE为例,通过BGP发布100.0.0.0/24的路由,路由可能通过RTE->RTB->RTC->RTD->RTE形成环路。为了防止环路的产生,RTE在收到RTD发来的路由时会检查AS_Path(该路由携带的)属性,如果发现该路由的AS_Path中包含自己的AS号,则丢弃该路由。
AS_Path4种类型:
AS_Sequence(有序的);
AS_Set(无序的);
AS_Confed_Sequence(应用于联盟);
AS_Confed_Set(应用于联盟)。
 
 

 

BGP路由器将本端始发路由发布给IBGP邻居时,会把该路由信息的Next_hop设为本端建立邻居关系所使用的接口IP
如上图所示,RTA100.0.0.0/24的网段发布给RTB时,如果RTARTB使用直连接口建立IBGP邻居,则Next_hopRTA上与RTB直连的接口IP;如果RTARTB使用Loopback接口建立IBGP邻居,则Next_hopRTALoopback接口IP
BGP路由器在向EBGP邻居发布路由时,会把路由信息的Next_hop设置为本端与对端建立BGP邻居关系的接口IP
如上图所示,RTB100.0.0.0/24的网段发布给RTC时,Next_hopRTB上与RTC直连的接口IP
BGP路由器在向IBGP邻居通告从EBGP学来的路由时,不改变该路由下一跳属性。
特例:如上图所示,RTA从RTB学到RTC发布的200.0.0.0/24的网段时,Next_hop为RTD的出接口IP,因为RTB与RTD在同一网段,RTC通告给RTB的Next_hop为RTD的出接口IP。
对于上述三种情况的解释:
EBGP邻居之间一般采用直连接口建立邻居关系,EBGP邻居在相互通告路由时会修改Next_hop为自己的出接口IP
IBGP邻居通常采用Loopback接口建立邻居,当路由是本路由器起源的,在发送给邻居之后Next_hop改为自己的更新源地址,这样即使网络中出现链路故障,只要Next_hop可达,同样可以访问目的网段,提高网络稳定性;
相对于IGP,如RIP在发布路由时,每经过一个路由器都会修 改下一跳,发布路由的路由器都宣称自己能够到达目标地址,并采用逐跳传递的方式将数据包发送给目标网络,但网络中的路由器并不知道谁是真正的始发路由器,因此会造成环路。BGPEBGP之间传递时才修改Next_hopIBGP发送从EBGP学来的路由给IBGP邻居时并不修改下一跳,在一定程度上起到了防环作用

 如果在EBGP环境下,使用环回口(逻辑接口loopback)来建立BGP邻居关系,则需要在通告路由的时候,需要修改下一跳。

 

Local_Pref属性仅在IBGP邻居之间有效,不通告给其他AS。它表明路由器的BGP优先级,用于判断流量离开AS时的最佳路由。

MED(Multi-Exit-Discriminator)属性仅在相邻两个AS之间传递,收到此属性的AS不会再将其通告给任何其他第三方AS,用于判断流量进入AS时的最佳路由。 

BGP的Community属性的两个作用:

1.限定路由的传播范围。

2.打标记,便于对符合相同条件的路由进行统一处理。

Community属性分为两类:一类是公认团体属性,另一类是扩展的团体属性。

公认团体属性分为4类:

Internet:缺省属性,所有路由都属于Internet,此属性的路由可以通告给所有BGP邻居;

No_Export:收到此属性的路由后,不将该路由发布到其他AS。如图,RTB上希望10.1.11.0/24的路由发布给AS 12之后,不再发布给其他AS,则可将10.1.11.0/24Community属性设置为No_Export

No_Advertise:收到此属性的路由后,不将该路由通告给任何其他的BGP邻居。如图,RTB上希望只将10.1.11.0/24的路由发布给RTC,并且不再通告给任何其他的BGP邻居,则可将10.1.11.0/24Community属性设置为No_AdvertiseNo_Export_Subconfed:在联盟中使用

扩展的团体属性用一组4字节为单位的列表来表示,路由器中扩展的团体属性格式为aa:nn或团体号:aa:nn中,aa通常为AS编号,nn是管理员定义的团体属性标识;团体号范围为0-4294967295,在RFC1997中,0-655354294901760-4294967295为预留值。

BGP路由器将路由通告给邻居后,每个BGP邻居都会进行路由优选,路由选择有三种情况:

该路由是到达目的地的唯一路由,直接优选。
对到达同一目的地的多条路由,优选优先级最高的。
对到达同一目的地且具有相同优先级的多条路由,必须用更细的原则去选择一条最优的。
 
一般来说,BGP计算路由优先级的规则如下:
丢弃下一跳不可达的路由。
优选Preference_Value值最高的路由(私有属性,仅本地有效)。
优选本地优先级(Local_Preference)最高的路由。
优选手动聚合>自动聚合>network>import>从对等体学到的。
优选AS_Path短的路由。
起源类型IGP>EGP>Incomplete
对于来自同一AS的路由,优选MED值小的。
优选从EBGP学来的路由(EBGP>IBGP)。
优选AS内部IGP的Metric最小的路由。
优选Cluster_List最短的路由。
优选Orginator_ID最小的路由。
优选Router_ID最小的路由器发布的路由。
优选具有较小IP地址的邻居学来的路由。

 

使用静态路由配置路由聚合的思路:
使用静态路由将明细路由聚合成10.1.8.0/22,下一跳指向NULL 0,因为聚合路由并不是具体的地址,发送给AS 200时只是明细路由的替代,为了防止路由环路,所以将下一跳指向Null 0
由于使用静态路由,路由表中产生了一条10.1.8.0/22的路由,下一跳为Null 0。使用network命令将IP路由表中的10.1.8.0/22路由变为BGP路由,并通告给对端BGP邻居,达到聚合的目的。

 

自动聚合方式,在bgp的视图下,通过  summary automatic命令进行自动聚合路由信息 

手动聚合方式:在bgp的视图下,通过配置aggregate 10.1.8.0 255.255.252.0  detail-suppressed

detail-suppressed用来抑制明细路由的优先级

BGP路由聚合带来的问题 - 潜在环路 ,如下图所示,被聚合的路由丢失了原来的属性,会有环路的风险,

 

路由聚合解决了两类问题,一是减轻了设备传输和计算路由所需资源的负担,二是隐藏了具体的路由信息,减少了路由震荡的影响。但是路由聚合后,AS_Path属性丢失,存在产生环路的风险。 

为了解决BGP路由聚合带来的问题,设置了两个AS_Path属性:
Atomic-Aggregate:公认任意属性,用于警告下游路由器出现了信息丢失,如图所示,AS 200内设置了路由聚合的路由器在聚合后发生了路径丢失的现象,此时该路由器通过Update报文携带该属性通知自己的邻居发生了路径丢失。
Aggregator:可选过度属性,该属性包含发起聚合的路由器的AS号和Router-ID,表明发生聚合的位置。
AS_Path属性有两种类型:
AS_Sequence:表示AS_Path内的AS号是一个有序的列表。
AS_Set:表示AS_Path内的AS号是一个无序的列表。
AS_Path本身是一个有序的列表,因为AS_Path每经过一个AS都会将AS号添加到AS_Path中,并且按经过的顺序从左到右排列。
如上图所示,AS 400AS 300通告聚合路由时,AS_Path属性(大括号的除外)表示该聚合路由依次经过了AS 200AS 400
当发生聚合后,如果需要聚合路由携带所有明细路由经过的AS号来防止环路,则在配置聚合的命令后添加as-set参数。
如上图所示,AS 200内发生了聚合并配置了as-set参数,则聚合路由会将明细路由的AS_Path信息用一个AS-Set集表示(放在中括号里的AS号信息,该集合的AS号没有先后顺序),携带在聚合路由后用以防止环路。
 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章