Network系列:BGP通告原则、路径属性、路由反射器(三)
6. BGP的通告原则
BGP通告遵循以下原则:
- 只发布最优路由。
- 从EBGP对等体获取的路由,会发布给所有对等体。
- IBGP水平分割:从IBGP对等体获取的路由,不会发送给IBGP对等体。
- BGP同步规则指的是:当一台路由器从自己的IBGP对等体学习到一条BGP路由时(这类路由被称为IBGP路由),它将不能使用该条路由或把这条路由通告给自己的EBGP对等体,除非它又从IGP协议(例如OSPF等,此处也包含静态路由)学习到这条路由,也就是要求IBGP路由与IGP路由同步。同步规则主要用于规避BGP路由黑洞问题。
BGP同步规则华为默认关闭!
6.1 第一条原则
只发布最优且有效(即下一跳地址可达)路由。
6.2 第二条原则
从EBGP对等体获取的路由,会发布给所有对等体。
6.3 第三条原则
从IBGP对等体获取的BGP路由,不会再发送给其他IBGP对等体,该条原则也被称为”IBGP水平分割“。
可能会带来新的问题,如下图所示,当BGP路由器R2将路由传递给BGP路由器R1时,由于第三条原则限制,R1无法将BGP路由传递给R3,R3将无法学习到路由。
6.4 第四条原则(默认不启用)
当一台路由器从自己的IBGP对等体学习到一条BGP路由时(这类路由被称为IBGP路由),它将不能使用该条路由或把这条路由通告给自己的EBGP对等体,除非它又从IGP协议(例如OSPF等,此处也包含静态路由)学习到这条路由,该条规则也被称为BGP同步原则。
产生该问题根本原因为AS200域内未运行BGP的路由器并无从BGP学习到的路由条目,查找路由失败,导致R1丢弃报文。为此制定了BGP同步原则:
当BGP的路由条目也存在于IGP路由表时才对外发送,以图中场景为例,当R3查看IGP路由表,OSPF路由表中并无路由10.0.4.0/24,因此并不会向R5发送该路由,自然也不会产生后续的访问失败问题。
解决该问题的方式有:
- 将BGP路由重分发到IGP中,基本不会使用该方式。
- 建立全互联的IBGP对等体关系,让全网所有路由器都拥有BGP路由。
7. 路径属性
- 任何一条BGP路由都拥有多个路径属性。
- 当路由器将BGP路由通告给它的对等体时,一并被通告的还有路由所携带的各个路径属性。
- BGP的路径属性将影响路由优选。
7.1 路径属性分类
公认属性是所有BGP路由器都必须能够识别的属性。
公认属性可以分为两类:
- 公认必遵(Well-known Mandatory):必须包括在每个Update消息里。
- 公认任意(Well-known Discretionary):可能包括在某些Update消息里。
可选属性不需要都被BGP路由器所识别。
可选属性可以分为两类:
- 可选过渡(Optional Transitive):BGP设备不识别此类属性依然会接受该类属性并通告给其他对等体。
- 可选非过渡(Optional Non-transitive):BGP设备不识别此类属性会忽略该属性,且不会通告给其他对等体。
7.2 AS_Path
- 该属性为公认必遵属性,是前往目标网络的路由经过的AS号列表。
- 作用:确保路由在EBGP对等体之间传递无环;另外也作为路由优选的衡量标准之一;
- 路由在被通告给EBGP对等体时,路由器会在该路由的AS_Path中追加上本地的AS号;路由被通告给IBGP对等体时,AS_Path不会发生改变。
R1从R4收到的BGP路由更新中AS_Path属性数值为:400 300 200 100,存在自身AS号,不接收该路由,从而防止了路由环路的产生。
AS_Path的重要作用之一便是影响BGP路由的优选,在上图中,R5同时从R2及R4学习到去往10.0.1.0/24网段的BGP路由,在其他条件相同的情况下,R5会优选R2通告的路由,因为该条路由的AS_Path属性值较短,也即AS号的个数更少。
- 路由聚合解决了两类问题,一是减轻了设备的负担,二是隐藏了明细的路由信息,减少了路由震荡的影响。但是路由聚合后,AS_Path属性丢失,存在产生环路的风险,为此可以通过AS_SET类型的AS_Path属性携带聚合前的AS路径信息。
- 当发生路由聚合后,如果需要聚合路由携带所有明细路由中AS_Path属性携带的AS号防止环路,则在配置聚合的命令中增加as-set参数。
- 在AS_SET的示例中AS 300内发生了路由聚合并配置了as-set参数,则聚合路由会将明细路由的AS_Path信息用一个AS-Set集表示(放在中括号{}里的AS号信息,该集合内的AS号没有先后顺序),在聚合路由中携带用以防止环路。
7.3 Origin
- 该属性为公认必遵属性,它标识了BGP路由的起源。如上表所示,根据路由被引入BGP的方式不同,存在三种类型的Origin。
- 当去往同一个目的地存在多条不同Origin属性的路由时,在其他条件都相同的情况下,BGP将按如Origin的下顺序优选路由:IGP > EGP > Incomplete。
7.4 Next_Hop
- 该属性是一个公认必遵属性,用于指定到达目标网络的下一跳地址。
- 当路由器学习到BGP路由后,需对BGP路由的Next_Hop属性值进行检查,该属性值(IP地址)必须在本地路由可达,如果不可达,则这条BGP路由不可用。
在不同的场景中,设备对BGP路由的缺省Next_Hop属性值的设置规则如下:
-
BGP路由器在向EBGP对等体发布某条路由时,会把该路由信息的下一跳属性设置为本地与对端建立BGP邻居关系的接口地址。
-
BGP路由器将本地始发路由发布给IBGP对等体时,会把该路由信息的下一跳属性设置为本地与对端建立BGP邻居关系的接口地址。
-
路由器在收到EBGP对等体所通告的BGP路由后,在将路由传递给自己的IBGP对等体时,会保持路由的Next_Hop属性值不变。
-
如果路由器收到某条BGP路由,该路由的Next_Hop属性值与EBGP对等体(更新对象)同属一个网段,那么该条路由的Next_Hop地址将保持不变并传递给它的BGP对等体。
修改Next_hop属性
使用peer x.x.x.x next-hop-local命令可以在设置向IBGP对等体(组)通告路由时,把下一跳属性设为自身的TCP连接源地址。
缺省情况下,R2通告给R3的BGP路由10.0.1.0/24的NextHop属性值为10.0.12.1,若R2未将到达10.0.12.0/24的路由发布到AS 200的IGP协议中,那么R3将无法获知到达10.0.12.1的路由,此时BGP路由10.0.1.0/24的NextHop不可达,该路由将被视为无效。
7.5 Local_Preference
- Local_Preference即本地优先级属性,是公认任意属性,可以用于告诉AS中的路由器,哪条路径是离开本AS的首选路径。
- Local_Preference属性值越大则BGP路由越优。缺省的Local_Preference值为100。
- 该属性只能被传递给IBGP对等体,而不能传递给EBGP对等体。
- Local_Preference属性只能在IBGP对等体间传递(除非做了策略否则Local_Preference值在IBGP对等体间传递过程中不会丢失),而不能在EBGP对等体间传递,如果在EBGP对等体间收到的路由的路径属性中携带了Local_Preference,则会进行错误处理。
- 但是可以在AS边界路由器上使用Import方向的策略来修改Local_Preference属性值。也就是在收到路由之后,在本地为路由赋予Local_Preference。
- 使用bgp default local-preference命令修改缺省Local_Preference值,该值缺省为100。
- 路由器在向其EBGP对等体发送路由更新时,不能携带Local_Preference属性,但是对方接收路由之后,会在本地为这条路由赋一个缺省Local_Preference值(100),然后再将路由传递给自己的IBGP对等体。
- 本地使用network命令及import-route命令引入的路由, Local_Preference为缺省值100,并能在AS内向其他IBGP对等体传递,传递过程中除非受路由策略影响,否则Local_Preference不变。
7.6 Community
技术背景
- Community(团体)属性为可选过渡属性,是一种路由标记,用于简化路由策略的执行。
- 可以将某些路由分配一个特定的Community属性值,之后就可以基于Community值而不是网络前缀/掩码信息来匹配路由并执行相应的策略了。
Community属性格式
Community属性值长度为32bit,也就是4Byte。可使用两种形式呈现:
- 十进制整数格式。
- AA:NN格式,其中AA表示AS号,NN是自定义的编号。
公认Community属性
No_Export_Subconfed团体属性涉及到BGP联邦的概念。
7.7 MED
- MED(Multi-Exit Discriminator,多出口鉴别器)是可选非过渡属性,是一种度量值,用于向外部对等体指出进入本AS的首选路径,即当进入本AS的入口有多个时,AS可以使用MED动态地影响其他AS选择进入的路径。
- MED属性值越小则BGP路由越优。
- MED主要用于在AS之间影响BGP的选路。MED被传递给EBGP对等体后,对等体在其AS内传递路由时,携带该MED值,但将路由再次传递给其EBGP对等体时,缺省不会携带MED属性。
关于MED的一些注意事项
缺省情况下,路由器只比较来自同一相邻AS的BGP路由的MED值,也就是说如果去往同一个目的地的两条路由来自不同的相邻AS,则不进行MED值的比较。
一台BGP路由器将路由通告给EBGP对等体时,是否携带MED属性,需要根据以下条件进行判断(不对EBGP对等体使用策略的情况下):
- 如果该BGP路由是本地始发(本地通过network或import-route命令引入)的,则缺省携带MED属性发送给EBGP对等体。
- 如果该BGP路由为从BGP对等体学习到,那么该路由传递给EBGP对等体时缺省不会携带MED属性。
- 在IBGP对等体之间传递路由时,MED值会被保留并传递,除非部署了策略,否则MED值在传递过程中不发生改变也不会丢失。
MED的默认操作
- 如果路由器通过IGP学习到一条路由,并通过network或import-route的方式将路由引入BGP,产生的BGP路由的MED值继承路由在IGP中的metric。例如上图中如果R2通过OSPF学习到了10.0.1.0/24路由,并且该路由在R2的全局路由表中OSPF Cost=100,那么当R2将路由network进BGP后,产生的BGP路由的MED值为100。
- 如果路由器将本地直连、静态路由通过network或import-route的方式引入BGP,那么这条BGP路由的MED为0,因为直连、静态路由cost为0。
7.8 Atomic_Aggregate及Aggregator
- R3上通过aggregate命令将BGP路由10.0.1.0/24、10.0.2.0/24、10.0.3.0/24、10.0.4.0/24聚合成了10.0.0.0/16,并使用detail-suppressed抑制了明细路由的对外发布,R3只会将聚合后的BGP路由传递给R4,而不传递聚合前的明细路由。
- Atomic_Aggregate是一个公认自由决定属性,它只相当于一种预警标记,而并不承载任何信息。当路由器收到一条BGP路由更新且发现该条路由携带Atomic_Aggregate属性时,它便知道该条路由可能出现了路径属性的丢失,此时该路由器把这条路由再通告给其他对等体时,需保留路由的Atomic_Aggregate属性。另外,收到该路由更新的路由器不能将这条路由再度明细化。
- 另一个重要的属性是Aggregator,这是一个可选传递属性,当路由聚合被执行时,执行路由聚合操作的路由器可以为该聚合路由添加Aggregator属性,并在该属性中记录本地AS号及自己的Router-ID,因此Aggregator属性用于标记路由聚合行为发生在哪个AS及哪台BGP路由器上。
查看聚合之后的路由
在BGP路由详细信息中可与看到Aggregator属性记录了聚合设备的AS号、Router ID,同时通过Atomic-Aggregate属性标明该路由为聚合路由。
8. BGP路由反射器
8.1 技术背景
中转AS中的IBGP问题
由于水平分割的原因,为了保证中转AS 200所有的BGP路由器都能学习到完整的BGP路由,就必须在AS内实现IBGP全互联。然而实现IBGP全互联存在诸多短板:
- 路由器需维护大量的TCP及BGP连接,尤其在路由器数量较多时;
- AS内BGP网络的可扩展性较差。
为此可以采用路由反射器技术
8.2 路由反射器角色
引入路由反射器之后存在两种角色:
- RR(Route Reflector):路由反射器
- Client:RR客户端
RR会将学习的路由反射出去,从而使得IBGP路由在AS内传播无需建立IBGP全互联。将一台BGP路由器指定为RR的同时,还需要指定其Client。至于Client本身,无需做任何配置,它并不知晓网络中存在RR。
8.2 反射规则
注意此处“反射”和“发送”的区别。“发送”指的是传统情况下(相当于RR不存在的场景下)的BGP路由传递行为,而“反射”指的是遵循路由反射规则的情况下,RR执行的路由传递动作,被反射出去的路由会被RR插入特殊的路径属性。
RR将路由反射时不会修改以下的BGP路径属性:Next_Hop、AS_Path、 Local_Preference、MED,如果反射器修改这几个路径属性的值则有可能产生路由环路。
8.3 RR场景下的路由防环
BGP路由反射行为引入了路由环路的隐患,RR的设定使得IBGP水平分割原则失效,这就可能导致环路的产生,为此RR会为BGP路由添加两个特殊的路径属性来避免出现环路:
- Originator_ID
- Cluster_List
Originator_ID防环
- RR将一条BGP路由进行反射时会在反射出去的路由中增加Originator_ID,其值为本地AS中通告该路由的BGP路由器Router ID。
- 若AS内存在多个RR,则Originator_ID属性由第一个RR创建,并且不被后续的RR(若有)所更改。
- 当BGP路由器收到一条携带Originator_ID属性的IBGP路由,并且Originator_ID属性值与自身的Router ID相同,则它会忽略关于该条路由的更新。
例子
R3收到来自R2的BGP路由10.0.2.0/24,在反射给R1时会添加上Originator_ID:10.0.2.2,R1收到之后再次反射给其客户端R2时携带Originator_ID属性,R2收到之后查看Originator_ID属性值存在自身的Router ID,忽略该路由更新。
8.4 路由反射簇 (Cluster)防环
- 路由反射簇包括反射器RR及其Client。一个AS内允许存在多个路由反射簇(如上图)。
- 每一个簇都有唯一的簇ID(Cluster_ID,缺省时为RR的BGP Router ID )。
- 当一条路由被反射器反射后,该RR(该簇)的Cluster_ID就会被添加至路由的Cluster_list属性中。
- 当RR收到一条携带Cluster_list属性的BGP路由,且该属性值中包含该簇的Cluster_ID时,RR认为该条路由存在环路,因此将忽略关于该条路由的更新。
Cluster_List
- R2发送给R1的路由,经过R1反射给R3时除了添加Originator_ID之外还会添加Cluster_List:10.0.1.1。
- R3再次反射给R4时, Cluster_List值为:10.0.3.3 10.0.1.1,R4再次反射给R1时Cluster_List值为:10.0.4.4 10.0.3.3 10.0.1.1。
- 当R4将路由反射给R1时,R1发现Cluster_List包含了自身Cluster_ID,判断存在环路,从而忽略该路由更新。
8.5 RR应用举例
- R1向BGP发布了10.0.1.0/24路由,R2会从R1学习到该路由并且将其通告给R3。
- 但是R3从R2学习到的这条IBGP路由由于水平分割规则的存在故而不能够再被通告给R4及R。
- 为此可以将R3设置为RR,R4、R5作为其客户端,这样R4、R5即可正常学习到BGP路由10.0.1.0/24。