注:本文章参考《HCIE路由交换学习指南》
BGP(Border Gateway Protocol)边界网关协议,是一种在自治系统AS(Autonomous System)之间传递并选择最佳路由的高级矢量路由协议,现使用的版本是BGP-4。
BGP将每个AS作为一个节点计算,因此每一个节点都依靠下游邻居来将它的路由表中的路由传递下去,节点在路由的基础上进行路由计算并且将结果传递给上游邻居。不同的是IGP以路由器作为一个节点,而BGP以一个AS作为节点。BGP使用了AS-Path列表记录了数据包所经过的路径,因此将BGP称为路径向量路由协议,同时AS-Path属性也是BGP协议用来检测环路的重要手段,如果路由器收到一条路由中存在本地AS号,则说明存在环路。
BGP为了提供对等体连接的可靠性,使用TCP179端口单播建立邻居,这也说明BGP需要底层路由的支持,而底层路由部署不完善常常会导致BGP邻居建立失败、路由黑洞、路径不可达等问题。
BGP按照运行方式分为EBGP(external)和IBGP(internal)邻居关系
BGP的Router-ID是一个用于标识BGP设备的32位的值,通常是IPv4地址的形式,在Open报文中携带。对等体之间建立BGP会话时,每个BGP设备都必须有唯一的Router-ID,否则对等体之间不能建立BGP连接。
BGP的Router-ID在BGP网络中必须是唯一的,可以采用手动配置,也可以自动选取。缺省情况下,BGP选择回环接口中IP最大的作为Router-ID,如果没有配置回环接口,则选择物理接口中最大的IPv4地址作为Router-ID。一旦选出了Router-ID,除非进程重启或接口地址删除等事件,否则即使配置了更大的地址,也保持原来的Router-ID。
BGP状态机描述了BGP的邻居的建立和维护过程,共6种,分别是Idle、Connect、Active、OpenSent、OpenConfirm和Established。
BGP空闲状态,在Idle状态下BGP拒绝邻居发送的连接请求,此时在等待由BGP系统发出的Start事件。Start事件发生后,BGP会对自己的资源进行初始化、重置连接计时器(Connect Retry 缺省位32s),发起TCP连接请求,并且开始侦听远端对等体发起连接的端口,并转至Connect状态。
Start事件是由一个操作者配置一个BGP过程,或者充值一个已经存在的过程,或者路由器软件重置BGP过程引起的。
任何状态中收到Notification报文或TCP拆除链路通知等Error事件后,BGP都会转至Idle状态。
2)Connect状态
在Connect状态下,BGP启动连接重传定时器,等待TCP完成连接。
如果TCP连接成功,那么BGP向对等体发送Open报文,并转至OpenSent状态。
如果TCP连接失败,那么BGP转至Active状态。
如果连接重传定时器超时,BGP仍没有收到BGP对等体的响应,那么BGP继续尝试和其他BGP对等体进行TCP连接,停留在Connect状态。
如果发生其他事件(如BGP系统或者操作人员停止连接),则退回到Idle状态。
3)Active状态
在Active状态下,BGP总是在试图建立TCP连接。
如果TCP连接成功,那么BGP向对等体发送Open报文,关闭连接重传定时器,并转至OpenSent状态。
如果TCP连接失败,那么BGP停留在Active状态。
如果连接重传定时器超时,仍没有收到BGP对等体的响应,那么BGP转至Connect状态。
如果发生其他事件(如BGP系统或者操作人员停止连接),则退回到Idle状态。
注:一般情况下如果邻居状态在connect和active之间来回切换,有可能是TCP重传次数过多或者IP地址不可达所造成的。
4)OpenSent状态
在OpenSent状态下,BGP等待对等体的Open报文,并对收到的Open报文中的AS号、版本号、认证码进行检查。
如果收到的Open报文正确,那么BGP发送Keepalive报文,且终止Keepalive定时器,并转至OpenConfirm状态。
如果发现收到的Open报文有错误,那么BGP发送Notification报文给对等体,并转至Idle状态。
5)OpenConfirm状态
在OpenConfirm状态下,BGP等待Keepalive或Notification报文。如果收到Keepalive报文,则转至Established状态;如果收到Notification报文,则转至Idle状态。
6)Established状态
在Established状态下,BGP可以和对等体交换Update、Keepalive、Route-refresh报文和Notifiction报文。
如果收到正确的Update或Keepalive报文,那么BGP就认为对端处于正常运行状态,将保持BGP连接。
如果收到错误的Update或Keepalive,那么BGP发送Notification报文通知对端,并转至Idle状态。
Route-refresh报文不会改变BGP状态。
如果收到Notification报文,那么BGP转至Idle状态。
如果收到TCP拆除链接通知,那么BGP将断开连接,转至Idle状态。
BGP对等体之间无法建立邻居主要体现在邻居状态无法进入到Established状态,有可能处于Idle、Connect、Active状态,如果处于这三种状态,说明TCP会话没有建立成功,如果处于OpenSent、OpenConfirm则说明邻居协商出现问题。以下总结了邻居无法建立的一些因素。
BGP设备将最优路由加入BGP路由表,形成BGP路由。BGP设备与对等体建立邻居关系后,采取以下交互原则。
由于BGP是承载在TCP之上的协议,在建立一个BGP对等体之前必须建立标准的TCP三次握手,并且在目标端打开一个到端口为179的连接,TCP能够提供可靠的传输方式,可以进行重传、确认及排序功能。BGP不需要开发确认报文,因为所有的确认都由TCP层来提供,从而可以减少BGP的报文数量,BGP所有报文均采用单播的方式来发送,因此不能够自动地发现邻居。
BGP具有五种报文类型:
TCP会话建立起来以后,两个邻居都要发送一个Open报文,每个邻居都使用该报文来标识自己,并且规定自己运行BGP的参数,Open报文是由报文头部加上报文主体部分,报文头结构如图:
Marker(标记):16Byte,该标记字段用于检测BGP对等体之间地同步丢失情况,并且在支持验证功能地情况下进行消息验证。如果消息类型为Open或Open消息中未包含验证消息,标志字段将被设置为全1;否则,标志字段值通过某些计算得到(作为验证进程地一部分)。
Length(长度):2Byte无符号整数,指定了消息的全长,包括头部,BGP报文总长度在19~4096Byte之间。
Type(类型):1Byte,标识BGP的报文类型,有以下几种消息类型。
open报文结构:
注:如果BGP路由器支持能力协商,在向对等体发送Open消息的时候,在消息中可以包括能力参数,BGP将会检查其中的信息,以确保对等体所支持的能力,如果对等体支持,那么就可以使用该能力。如果对等体发送Notification消息,且错误子码种被设置为“不可支持的可选参数”,则说明对等体不支持该能力,此时BGP将尝试重建邻居,且不再发送能力参数。
Keepalive消息以Hold time的1/3的时间间隔进行交互,用于检测TCP连接是否正常,但是不能够低于1s,如果hold time协商为0,那么不会发送Keepalive消息。Keepalive消息只包含BGP消息头部,在发送消息的时间间隔内,如果BGP发送过Update消息,就会抑制Keepalive消息的发送。
通过Open消息告知BGP对等体本地支持路由刷新能力(Route-refresh capability)。在所有BGP路由器使能Route-refresh能力的情况下,如果BGP的入口路由策略发生了变化,本地BGP路由器可以通过手动触发,向对等体发布Route-refresh消息,收到此消息的对等体会将其路由信息重新发布给本地BGP路由器。这样,可以在不中断BGP连接的情况下,对BGP路由表进行动态刷新,并应用新的路由策略。
1)EBGP通过AS-Path属性,丢弃从EBGP对等体接收到的在AS-Path属性里包含自身AS号的任何更新信息。
2)IBGP路由器不会将任何从IBGP对等体接收到的更新信息传给其他IGBP对等体。
x*(x-1)/2
注:常用的可选属性中,MED、Originator_ID、Cluster_List是非过渡属性,但目前几乎没有厂商不识别该属性,所以所有BGP设备都传递该属性给邻居。
该属性为公认必遵属性,用来代表BGP路由的起源,还用来标记一条路由如何进入BGP中,有以下三种类型:
1)IGP:通过Network的方式注入到BGP中的路由或聚合路由,它们的起源属性的数值为IGP
2)EGP:通过EGP学习到的路由
3)incomplete:表面路径不完整,未知源,一般通过引入(import)路由表里的路由的方式到BGP的路由或者聚合路由,它们的起源属性为incomple
聚合路由的起源属性可以是IGP或incomplete,这依赖于聚合路由的成员路由的起源属性。如果成员路由的origin属性都是IGP,则聚合路由的起源属性为IGP。如果成员路由的origin属性是incomplete,则聚合路由的起源属性为incomplete。如果既有IGP又有incomplete,则生成的聚合路由的起源属性为incomplete。
origin的三个类型时间的优先顺序是:IGP>EGP>incomplete
该属性为公认必遵属性,用于记录路由沿途经过的AS,BGP对等体间传递的每条路有都会携带这份AS号列表。路由在AS内传递时,不会对AS_Path做任何的改动。路由在离开AS时,当前的AS号会自动添加在AS_Path序列的最前面(左边)。
当任何的BGP设备收到路由时,都要检查AS_Path属性的内容,如果在AS_Path中含有接收路由器所在AS号,则会丢弃此种路由,以避免环路。AS_Path除了能够防环外,还可以根据AS_Path的长度决定选择最优路由。
BGP的AS_Path属性内容是由segment构成的,有四种类型,见下表。后两种类型仅出现在BGP联邦中,每种segment类型在AS_Path属性中仅能出现一次。
AS_Path属性 | 说明 |
---|---|
AS_SET | 是AS号的无序列表 |
AS_SEQUENCE | 是AS号的有序列表 |
AS_CONFED_SET | 是联邦中成员AS号的无序集合 |
AS_CONFED_SEQUENCE | 是联邦中成员AS号的有序列表 |
1)在AS_Path中既可以含有一种segment类型,也可以同时含有多种segment类型,若存在多种,前后顺序一定是AS_CONFED_SEQUENCE、AS_CONFED_SET、AS_SEQUENCE、AS_SET。
2)AS_SET和AS_CONFED_SET一定是聚合路由的AS_Path才会包含的segment类型。
3)不论是何种类型的segment,若其中含有的AS号等于接收设备所在的AS号,则路由都将被丢弃。
4)AS_Path的长度是由AS_SEQUENCE这种segment的AS号的数量来决定的,其AS号越多,则代表长度越长。而AS_CONFED_XX和AS_SET的长度都不计入AS_Path长度计算。在BGP选路规则中,如果其他属性都一致,则AS_Path的长度越短的路由越好。
5)使用命令peer [ipv4-address] allow-as-loop
,可以接收BGP设备接收含有自己AS号的路由,打破BGP防环,主要适用场景是MPLS VPN。
1)在本AS内注入的路由,其AS_Path为空,仅当该路由离开本AS时,即通告给eBGP对等设备时,会在AS_Path列表的最左面(前面),加上自己的AS_Path号码。
2)在AS内的iBGP上通告路由时,其AS_Path不变化
3)一般不建议对AS_Path做任何删/改行为,这易于导致路由环路。但可以添加重复的AS号到AS_Path中,影响选路。
4)使用命令peer [ipv4-address] public-as-only
发送eBGP报文时,仅携带公有AS号。
5)在互联网中只有公有AS号可以直接在Internet上使用,私有AS号发布到公网上会造成环路。最好在发布的时候仅携带公有AS号。
6)在网络迁移或想要隐藏自身真实AS号的情况下,可以使用命令peer [ipv4-address] fake-as fake-as-number
配置eBGP对等体的伪AS号。
7)可以通过命令AS_PATH-limit
命令,接收路由时会检查AS_Path属性长度是否超限,如果超出则丢弃掉路由。缺省情况下AS_Path的长度为255,最大限制可以调整为2000。
该属性为公认必遵属性,Next_Hop属性记录了BGP路由的下一跳消息,BGP路由的下一跳往往都是非直连设备的IP地址。这可能导致数据包再按下一跳地址发给目标网络时,因为中间路由上没有BGP路由,而出现路由黑洞,导致丢包。
BGP设计的下一跳属性遵循如下规则:
BGP设备将本地始发路由发布给所有BGP对等体时,会把该路由信息的下一跳属性设置为本地对端建立BGP邻居关系的接口地址。
BGP设备在向eBGP对等体发布某条路由时,会把该路由信息的一跳属性设置为本地与对端建立BGP邻居关系的接口地址。
BGP设备在向iBGP对等体发布从eBGP对等体学来的路由时,并不改变该路由信息的下一跳属性。
1)缺省情况下,BGP在向eBGP对等体发布路由时和向iBGP对等体发布引入的IGP路由时会将下一跳改为自己的接口地址。这是由于默认使用的命令是peer next-hop-local
,但这个行为可以配置peer next-hop-invariable
**命令使下一跳地址不变化。
2)BGP在向iBGP对等体通告路由时,不改变下一跳属性。可以通过命令peer next-hop-local
修改。
下一跳可达作为BGP选路规则中第0条规,如果BGP路由的下一跳IP地址不可达,那么该BGP路由将不会参与路由。
路由黑洞问题
从数据平面分析,如果数据流访问目标BGP网络,R5根据下一跳,发给R2,但中间IGP路由器R3和R4没有对应的BGP路由,所以会出现路由黑洞。
方法1:在R2和R5间为下一跳地址所对应的路由创建LSP隧道。
方法2:在AS200中,将R3和R4也配置为BGP路由器。
方法3:重新设计拓扑,把R2和R5直连
方法4:在R2上将BGP路由引入到IGP路由中,保证路由全网可达,不推荐使用,会加重IGP路由器的负荷。可以根据需要引入少量路由或对引入的路由做必要的汇总。
团体属性分为标准团体属性(Community)和扩展团体属性(Extended Community)
团体属性是BGP的私有属性,在BGP对等体之间传播,且不受AS的限制。利用团体属性可以使用多个AS中的一组BGP设备共享相同的策略,从而简化路由策略的应用和降低维护管理的难度。
BGP设备可以在发布路由时(或者针对邻居更新以及收取时、或者引入路由时),新增或者改变路由的团体属性。
是在BGP中一种给路由条目打上标记,用于确保路由过滤和选择的连续性,BGP路由器可以过滤进出路由更新或者优选某条路由。
注:BGP邻居之间默认不会传递团体属性,可以通过命令:peer x.x.x.x advertise-community
向邻居传递团体属性
当开启了向邻居传递团体属性之后,在可传播范围内这条路由信息中都是会包含团体属性的,也就是会传递的
community团体为==可选过渡属性==,用于标识具有相同特征的BGP路由,使路由策略的应用更加灵活,同时降低了维护管理的难度。一个目标地址作为一个目的地团体的成员,这些目的地共享着一个或多个特性,Community属性有4个byte,可自定义其中的数值,RFC1997中定义了前面2个Byte为自治系统号,后面2个Byte是管理上的表示符,格式为AA:NN,可以用十进制或十六进制来表示该属性。在团体属性值当中,0(0x00000000)65535(0x0000FFFF)和从4294901760(0xFFFF0000)4294967295(0xFFFFFFFF)是被保留的,在此预留之外定义了几种公认团体属性:
更新范围由小到大:no-advertise—>no-export-subconfed—>no-export—>internet(默认)
有两种使用方式:
1)在发布路由时应用no-export团体属性;
这种方式在发布之后,这条bgp路由已经携带了no-export团体属性,所以它是不会更新给EBGP邻居的,但是更新给IBGP邻居时,邻居收到的这条路有不会携带no-export团体属性的,如果你想要邻居收到的路由更新也携带这个团体属性,就要使用命令peer x.x.x.x advertise-community
;
[R1]ip as-path-filter 1 permit ^$ //命中AS-PATH为空的路由,这代表是本As产生的路由
route-policy Comm permit node 10
if-match as-path-filter 1 //如果命中As-path属性中仅仅包含As100的
apply community no-export //那么应用团体属性“不更新给其他的EBGP邻居”
route-policy Comm permit node 20
!
bgp 100
network 1.1.1.1 255.255.255.255 route-policy Comm //产生该条路由的时候应用
peer 22.1.1.1 advertise-community
peer 33.1.1.1 advertise-community
peer 44.1.1.1 advertise-community //必须针对邻居应用,邻居才能拥有该属性
2)针对邻居应用no-export团体属性
这种方式发布之后,必须要使用命令peer x.x.x.x advertise-community
,且原路由器发布的这条路由器不会携带属性,它只有发布给特定的邻居才会有属性,且会在AS中传递。
R3:
route-policy Comm permit node 10
apply community no-export
[R3-bgp]peer 11.1.1.1 route-policy Comm export //R3向R1通告路由策略,修改团体属性,应用在出方向
[R3-bgp]peer 11.1.1.1 advertise-community //R3向R1通告团体属性
[R1]dis bgp routing-table 3.3.3.3
BGP local router ID : 10.1.15.1
Local AS number : 100
Paths: 1 available, 1 best, 1 select
BGP routing table entry information of 3.3.3.3/32:
From: 33.1.1.1 (10.1.23.3)
Route Duration: 00h00m02s
Relay IP Nexthop: 10.1.13.3
Relay IP Out-Interface: GigabitEthernet0/0/1
Original nexthop: 33.1.1.1
Qos information : 0x0
Community:no-export
AS-path Nil, origin igp, MED 0, localpref 100, pref-val 0, valid, internal, best, select, pre 255, IGP cost 1
Not advertised to any peer yet
有两种使用方式:
1)在发布路由时应用no-export团体属性;
[R3-bgp]network 3.3.3.3 32 route-policy Comm //自身在产生路由的时候应用no-advertise属性。自宫!不公告给任何邻居
2)针对邻居应用no-export团体属性
R3:
route-policy Comm permit node 10
apply community no-advertise
[R3-bgp]peer 11.1.1.1 route-policy Comm export //R3向R1通告路由策略,修改团体属性,应用在出方向
[R3-bgp]peer 11.1.1.1 advertise-community //R3向R1通告团体属性
[R3-bgp]peer 22.1.1.1 advertise-community
有两种使用方式:
1)在发布路由时应用no-export团体属性;
R5
route-policy Comm permit node 10
apply community no-export-subconfed
[R5]bgp 2005
[R5-bgp]network 5.5.5.5 32 route-policy Comm
2)针对邻居应用no-export团体属性
R7
route-policy Comm permit node 10
apply community no-export-subconfed
[R7-bgp]peer 55.1.1.1 route-policy Comm export
[R7-bgp]peer 66.1.1.1 route-policy Comm export
[R7-bgp]peer 55.1.1.1 advertise-community
[R7-bgp]peer 66.1.1.1 advertise-community
总结:凡是针对邻居应用的团体属性都必须要使用命令peer x.x.x.x advertise-community
传递给邻居,通过network方式的视情况而论,如果你想要邻居传递的路由也继承你的团体属性那也使用命令peer x.x.x.x advertise-community
。
控制BGP路由时,可以利用团体属性的前2个字节作为AS号,用后2个字节定义与该AS相关的数值,比如服务提供商的AS号为100,这个提供商可以用100:1来表示,100表示该团体的特点服务提供商,而1表示一组对等路由器的地址。多条路由可以拥有相同的团体属性,路由器需要对这些路由实施策略时可以对该团体属性进行匹配,实际上就是对拥有该团体属性的路由进行策略修改。一条路由也可以拥有多个团体属性,如果发现携带了多个团体属性的路由,BGP路由器可以根据其中的一部分或者全部属性采取相应的策略动作,传递给其他对等体的时候,BGP也可以添加或者修改团体属性。
1)命中路由
ACL(华为不支持高级ACL去命中路由)、前缀列表、AS-Path-filter、团体属性列表等
2)在route-policy中修改属性,绑定列表
3)在BGP协议下应用route-policy(针对邻居应用、全局应用-使用的较少)
AS_Path属性按矢量顺序记录了某条路由从本地到目的地址所要经过的所有AS编号。如下图所示,某条BGP路由的AS_Path属性实际上可以看作是一个包含空格的字符串,所以可以通过正则表达式来进行匹配。
AS-Path-filter主要是定义AS-Path正则表达式,然后通过它去匹配BGP路由的AS-Path属性信息,从而实现对BGP路由纤细的过滤及控制。
AS-Path-filter是一个工具,被调用才会生效,在不同的场景下调用,可以视为匹配工具或是过滤器。
1)在BGP进程下通过peer命令直接调用AS-Path-filter
#
ip as-path-filter s1 permit ^100$
#
bgp 65100
peer 10.1.1.2 as-path-filter s1 import
#
2)在route-policy调用AS-Path-filter
#
ip as-path-filter s1 permit ^100$
#
route-policy huawei permit node 10
if-match as-path-filter s1
apply local-preference 100
#
bgp 65100
peer 10.1.1.2 route-policy huawei import
#
元字符 | 含义 | 示例 |
---|---|---|
. | 匹配除“\n”之外任何单个字符,包括空格。 | .*表示匹配任意字符串,即AS_Path为任意,可以用来匹配所有路由。说明:通常定义了多个deny模式的ip as-path-filter子句之后,会定义一个ip as-path-filter as-path-filter-name permit .*子句,用于允许其他路由通过。 |
* | 之前的字符在目标对象中出现0次或连续多次。 | 参考上例。 |
+ | 之前的字符在目标对象中出现1次或连续多次。 | 65+表示6在AS_Path的首位,而5在AS_Path中出现一次或多次,那么:如下字符串都符合这个特征:65,655,6559,65259,65529等。如下字符串不符合这个特征:56,556,5669,55269,56259等。 |
| | 竖线左边和右边的字符为“或”的关系。 | 100|65002|65003表示匹配100、65002或65003。 |
^ | 之后的字符串必须出现在目标对象的开始。 | ^65表示匹配以65开头的字符串,那么:如下字符串都符合这个特征:65,651,6501,65001等。如下字符串不符合这个特征:165,1650,6650,60065等。 |
$ | 之前的字符串必须出现在目标对象的结束。 | 65KaTeX parse error: Expected group after '^' at position 103: …,65001等。**说明:**^̲表示匹配空字符串,即AS_Path为空,通常用来匹配本地始发路由。 |
(xyz) | 一对圆括号内的正则表达式作为一个子正则表达式,匹配子表达式并获取这一匹配。圆括号内也可以为空。 | 100(200)+可以匹配100200、100200200、…… |
[xyz] | 匹配方括号内列出的任意字符。 | [896]表示匹配含有8、9或6中任意一个字符。 |
[^xyz] | 匹配除了方括号内列出的字符外的任意字符(^号在字符前)。 | [^896]表示匹配含有8、9或6这几个字符之外的任意一个字符。 |
[a-z] | 匹配指定范围内的任意字符。 | [2-4]表示匹配2,3,4;[0-9]表示匹配数字0~9。**说明:**方括号内“[]”只能填写数字0到9。例如,如果需要匹配735~907,则需要写成(73[5-9]|7[4-9][0-9]|8[0-9][0-9]|90[0-7])。 |
[^a-z] | 匹配不在指定范围内的任意字符。 | [2-4]表示匹配除2,3,4外的其他字符;[0-9]表示匹配除数字0~9外的其他字符。 |
_ | 匹配一个符号,包括逗号、左大括号、右大括号、左括号、右括号和空格,在表达式的开头或结尾时还可作起始符、结束符(同^ ,$)。 | ^65001_表示匹配字符串的开始为65001,字符串的后面为符号,也即AS_Path最左边AS(最后一个AS)为65001,可以用来匹配AS 65001邻居发送的路由, _65001_表示匹配字符串里有65001,即AS_Path中有65001,可以用来匹配经过AS 65001的路由。 _65001$表示匹配字符串的最后为65001,字符串前面是符号,即AS_Path最右边AS(起始AS)为65001,可以用来匹配AS 65001始发的路由。 |
\ | 转义字符。 | AS_Confed_Sequence是用“(” 、“)”表示的,“(” 、“)”在正则表达式中是特殊字符,有特殊用处,所以对于这种特殊字符,可以使用“\”来去除其特殊意义进行匹配。例如:(65002_表示匹配字符串为(65002,字符串的后面为符号,也即AS_Confed_Sequence最左边AS(最后一个AS)为65002,可以用来匹配联盟AS 65002邻居发送的路由。(.65003.) 表示AS_Confed_Sequence中间有65003,可以用来匹配经过联盟AS 65003的路由。_65004)表示匹配字符串最后为65004),字符串的前面为符号,也即AS_Confed_Sequence最右边AS(起始AS)为65004,可以用来匹配联盟AS 65004始发的路由,还可以用来匹配联盟AS 65004直接发布的路由。_65004)与65004)作用相同。同理,AS_Confed_Set使用的“[”、“]”,AS_Set使用的“{”、“}”也都可以使用“\”符号来去除这些特殊符号的特殊意义。 |
团体属性可以看作IGP中的TAG,匹配该条件之后修改选路属性,用于影响路由选路。
注:如果你需要邻居收到的路由也携带指定的团体属性,则需要使用命令peer x.x.x.x advertise-community
每跳都需要。
实验
R7
route-policy Comm permit node 10
apply community 2067:7
[R7-bgp]network 7.7.7.7 32 route-policy Comm //产生路由时候应用,该路由携带2067:7的团体属性
peer 55.1.1.1 advertise-community
peer 66.1.1.1 advertise-community
[R7-bgp]dis bgp routing-table 7.7.7.7
BGP local router ID : 7.7.7.7
Local AS number : 2067
Paths: 1 available, 1 best, 1 select
BGP routing table entry information of 7.7.7.7/32:
Network route.
From: 0.0.0.0 (0.0.0.0)
Route Duration: 00h01m05s
Direct Out-interface: InLoopBack0
Original nexthop: 127.0.0.1
Qos information : 0x0
Community:<2067:7>
!
[R6]bgp 2067
[R6-bgp]peer 10.1.26.2 advertise-community //使得团体属性连续
R2的选路修改
route-policy Select permit node 10
if-match community-filter 99
apply as-path 200 200 additive
#
route-policy Select permit node 20
[R2-bgp]peer 10.1.26.6 route-policy Select import
dis bgp routing-table
BGP Local router ID is 10.1.23.2
Status codes: * - valid, > - best, d - damped,
h - history, i - internal, s - suppressed, S - Stale
Origin : i - IGP, e - EGP, ? - incomplete
Total Number of Routes: 10
Network NextHop MED LocPrf PrefVal Path/Ogn
*>i 1.1.1.1/32 11.1.1.1 0 100 0 i
*> 2.2.2.2/32 0.0.0.0 0 0 i
*>i 3.3.3.3/32 33.1.1.1 0 100 0 i
*>i 4.4.4.4/32 44.1.1.1 0 100 0 i
*> 5.5.5.5/32 10.1.26.6 0 200i
i 10.1.15.5 0 100 0 200i
*> 6.6.6.6/32 10.1.26.6 0 0 200i
i 10.1.15.5 100 0 200i
*> 7.7.7.7/32 10.1.26.6 0 200 200 200i
i 10.1.15.5 100 0 200i
转发:
tracert -a 2.2.2.2 7.7.7.7
traceroute to 7.7.7.7(7.7.7.7), max hops: 30 ,packet length: 40,press CTRL_C to break
1 10.1.12.1 20 ms 10 ms 10 ms
2 10.1.15.5 20 ms 40 ms 20 ms
3 10.1.57.7 30 ms 30 ms 30 ms
大型的网络中,一个AS内有可能超过百台设备,由于iBGP的水平分割原则,每台设备都需要建立全互联的iBGP邻居关系。而路由反射器可以解决以上问题,多台路由器可以只与一台路由反射器建立邻居关系,不需要建立全互联的邻居关系。路由反射器机制允许路由被反射出去,打破了ibgp水平分割的限制。
RR通过Originator_ID(集群内)属性和Clister_List(集群间)属性防环
1)Originator_ID:可选非过渡属性,该属性由RR产生,封装在Update消息中,使用始发路由器的Route_ID作为Originator_ID,用于防止集群内产生路由环路。
当一条路由第一次被RR反射的时候,RR将Originator ID属性加入到这条路由,标识这条路由的始发路由器。如果一条路由中已经存在了Originator ID属性,则RR将不会创建新的Originator ID
2)Cluster_List:可选非过渡属性,该属性是集群ID(Cluster_ID)的列表,AS内的每个集群都由唯一的Cluster_ID来表示(可以在BGP进程中使用Cluster_ID命令来修改,默认为BGP的Route_ID)。路由反射器使用Cluster_List属性记录路由经过的每个集群的Cluster_ID(类似AS_PATH属性),用来在集群间避免环路。当一条路由第一次被RR反射的时候,RR会把本地的Cluster_ID添加到Cluster_List的前面,如果没有则创建。当RR接收到一条更新路由时,RR会检查这条路由的Cluster_List。如果Cluster_List中已经有本地Cluster_ID,则丢弃该路由;如果没有则添加并反射。
总结:在集群内始发路由器通过RR发来的路由信息中的Originator_ID防止环路;在集群间RR之间通过Cluster_list防止环路;这两者之间并没有冲突,即使Cluster_ID不一致,路由信息依旧返回到了始发路由器,还是可以通过Originator_ID来避免环路的。
联邦(Confederation)是解决全互联iBGP会话数量多和水平分割的方式之一。联邦就是将一个AS划分为若干个子AS。每个子AS内部建立iBGP全互联关系(联邦iBGP邻居),子AS之间建立eBGP连接关系(联邦eBGP邻居),但联邦外部AS仍认为联邦是一个AS。
1)BGP选路规则中,规则4根据AS-Path属性的长度选择最佳路由。在联邦中,BGP成员AS号不计算在AS_Path长度中。例:(65001 65002)300和(65002)400长度相同,都为1。
2)BGP选路规则中,规则7根据通告路由的BGP对等体的类型来选择最佳路由,eBGP由于iBGP邻居。在联邦中,联邦的eBGP和联邦的iBGP邻居都被看做iBGP类型邻居,不存在联邦eBGP优于联邦iBGP。
3)当路由来自于外部AS,且其中一条路由通过联邦的eBGP或iBGP收到,另外一条通过eBGP邻居收到,此时首先比较AS-path长度,越短越优;(在其他规则一致的情况下)如果AS-Path等长,则根据规则7选择外部AS(eBGP邻居)。原因在于联邦的eBGP与联邦的iBGP都被视为iBGP邻居,而eBGP优于iBGP。
注意:
路由信息在联邦内转递时,AS-Path属性没有记录联邦ID号,而在括号中包含了联邦子AS号,并且MED、Next-Hop、Local-pref属性回忆起携带,在整个联邦内传递。
当路由信息传递出联邦,联邦内的子AS号将会丢失,只记录联邦ID号,并且其他属性将会一起就是。
bestroute med-confederation
在联邦中随意划分连接子AS可能会导致问题,由于联邦内的AS通往外部时,有可能跨越联邦eBGP,容易形成次优路径,因此在部署联邦时使用集中化的联邦体系架构可以带来最优路径的选择行为。设计思想为:所有子AS彼此之间都通过一个中心骨干子AS交互路由(OSPF架构)。
参考因素 | 比较 |
---|---|
多层次 | 两种方法都支持多层次来进一步增强扩展性。路由反射器支持多级路由反射结构。联邦允许在成员AS内使用路由反射。 |
策略控制 | 两者都提供路由策略控制,不过联邦可以提供更大的灵活性。 |
常规IBGP迁移的复杂性 | 路由反射的迁移复杂性非常低,因为总体网络配置几乎很少发生改变。然而,从IBGP到联邦的迁移需要对配置和网络架构做很大的改变。 |
能力支持 | 联邦内的所有路由器必须支持联邦配置能力,因为所有路由器需要支持联邦AS-Path属性。在路由反射的架构中,只需要反射器支持路由反射能力。然而,在新的分簇设计中,客户也必须支持反射器属性。 |
IGP扩展 | 路由反射在AS内需要单一的IGP,而联邦支持单一的或分开的IGP。这可能是联邦比路由反射所具有的最明显的优势。如果IGP达到了其扩展性限制,或者是因为范围太大而难于处理管理任务,那么可以使用联邦来减小IGP路由表的大小。 |
部署经验 | 由于更多的服务提供商已经部署了路由反射而非联邦,因此从路由反射中已经获得了更多的经验。 |
AS合并 | 实际上AS合并与IBGP扩展性是无关的,但在这里讨论是因为它是联邦的特点之一。一个AS可以和一个已存的联邦合并,这是通过把新的AS作为联邦的一个子AS对待来完成的。 |
为什么需要对等体组?
在大型BGP网络中,对等体的数目众多,配置和维护极为不便。对于存在相同配置的BGP对等体,可以把他们创建为一个BGP对等体组。使用对等体组进行批量配置,可以简化管理的难度,还可以提高路由发布效率。
对等体组是什么?
一些具有相同策略的对等体的集合。当一个对等体加入对等体组中时,此对等体将获得与所在对等体组的配置。当对等体组的配置改变时,组内成员的配置也相应改变。
单个对等体和对等体组同时配置了某个功能时,单个对等体的配置生效(更优)。加入对等体组之后,如果某个BGP对等体有特殊的配置需求,还可以进行单独的配置,单个对等体的配置将覆盖从对等体组继承的配置。
对等体组的分类
创建对等体组的三个步骤
1)创建对等体组,默认是IBGP类型,==在IBGP类型下不需要指定AS-number==。
2)在对等体组中应用所需要的命令。
3)将对等体加入到对等体组。
配置举例
group gugujun internal ###创建对等体组
peer gugujun connect-interface LoopBack0 ###对等体组中应用需要的命令,
peer 22.1.1.1 group gugujun ### 将对等体加入到组
可以通过命令display bgp goup
查看对等体组的详细信息。
PrefVal是Prefrred-Value的简写,区别于前面介绍的其他属性,首选权值是华为设备内部分配给路由的权值,它并不是在路由更新中可传递的BGP标准属性。
任何出现在华为BGP表中的路由都会被分配PrefVal,它只在一台路由器内部使用,不会传递给其他的路由器,这个值为0-65535,值越大越优先,缺省情况下所有路由的首选权值为0.可以为独立的路由或从一个特定的邻居学习到的路由设置该值,用来影响路由器的选路。该属性在本地有意义,作用效果也仅影响本路由器的选路,无法影响其他路由器的选路。
[R7-bgp]peer 66.1.1.1 preferred-value 101 //粗线条的方式
!
route-policy PreV permit node 10
if-match ip-prefix 7
apply preferred-value 102
#
route-policy PreV permit node 20
[R7-bgp]peer 66.1.1.1 route-policy PreV import
验证
display ip ip-prefix
Prefix-list 7
Permitted 6
Denied 9
index: 10 permit 2.2.2.2/32
index: 20 permit 4.4.4.4/32
dis bgp routing-table
BGP Local router ID is 7.7.7.7
Status codes: * - valid, > - best, d - damped,
h - history, i - internal, s - suppressed, S - Stale
Origin : i - IGP, e - EGP, ? - incomplete
Total Number of Routes: 11
Network NextHop MED LocPrf PrefVal Path/Ogn
*>i 1.1.1.1/32 55.1.1.1 0 100 0 (2005) 100i
* i 66.1.1.1 100 0 100i
*>i 2.2.2.2/32 66.1.1.1 0 100 102 100i
* i 55.1.1.1 100 0 (2005) 100i
*>i 3.3.3.3/32 55.1.1.1 100 0 (2005) 100i
* i 66.1.1.1 100 0 100i
*>i 4.4.4.4/32 66.1.1.1 100 102 100i
* i 55.1.1.1 100 0 (2005) 100i
*>i 5.5.5.5/32 55.1.1.1 0 100 0 (2005)i
*>i 6.6.6.6/32 66.1.1.1 0 100 0 i
*> 7.7.7.7/32 0.0.0.0 0 0 i
公认可选属性,数值越大越优先。通常用于ASBR来影响内部的IBGP对等体如何把数据发出到其他AS。
本地路由器始发的BGP路由,本地优先级为空。通过BGP对等体学到的路由缺省值100,默认值越大优先级越高。
该属性只可以传递给IBGP邻居,但可以从EBGP和IBGP邻居接收的路由修改本地优先级值然后加载到BGP路由表,修改之后该路由的本地优先级值同样只能继续传递给IBGP邻居。
备注:BGP优先级的默认值是可以修改,例如华为使用 default local-preference(并不重要)
R5:
[R5]ip ip-prefix 13 permit 1.1.1.1 32
[R5]ip ip-prefix 13 permit 3.3.3.3 32
route-policy LocalPre permit node 10
if-match ip-prefix 13
apply local-preference 600
#
route-policy LocalPre permit node 20
[R5-bgp]peer 10.1.15.1 route-policy LocalPre import
R6:
[R6]ip ip-prefix 24 permit 2.2.2.2 32
[R6]ip ip-prefix 24 permit 4.4.4.4 32
route-policy LocalPre permit node 10
if-match ip-prefix 13
apply local-preference 600
#
route-policy LocalPre permit node 20
[R6-bgp]peer 10.1.26.2 route-policy LocalPre import
查看路由
display bgp routing-table
BGP Local router ID is 7.7.7.7
Status codes: * - valid, > - best, d - damped,
h - history, i - internal, s - suppressed, S - Stale
Origin : i - IGP, e - EGP, ? - incomplete
Total Number of Routes: 7
Network NextHop MED LocPrf PrefVal Path/Ogn
*>i 1.1.1.1/32 55.1.1.1 0 600 0 (2005) 100i
*>i 2.2.2.2/32 66.1.1.1 0 600 0 100i
*>i 3.3.3.3/32 55.1.1.1 600 0 (2005) 100i
*>i 4.4.4.4/32 66.1.1.1 600 0 100i
*>i 5.5.5.5/32 55.1.1.1 0 100 0 (2005)i
*>i 6.6.6.6/32 66.1.1.1 0 100 0 i
*> 7.7.7.7/32 0.0.0.0 0 0 i
数据测试:
tracert -a 7.7.7.7 3.3.3.3
traceroute to 3.3.3.3(3.3.3.3), max hops: 30 ,packet length: 40,press CTRL_C to break
1 10.1.57.5 20 ms 10 ms 10 ms
2 10.1.15.1 20 ms 30 ms 20 ms
3 10.1.13.3 30 ms 20 ms 20 ms
tracert -a 7.7.7.7 4.4.4.4
traceroute to 4.4.4.4(4.4.4.4), max hops: 30 ,packet length: 40,press CTRL_C to break
1 10.1.67.6 30 ms 20 ms 20 ms
2 10.1.26.2 30 ms 20 ms 20 ms
3 10.1.23.3 20 ms 30 ms 20 ms
4 10.1.34.4 40 ms 30 ms 30 ms
本地生成的BGP路由优于BGP邻居学到的路由,同为本地始发路由:手动聚合>自动聚合>network>import
AS_Path属性越短越优先
IGP优于EGP,EGP优于Incomplete
公认必遵属性,igp>egp>incomplete(指的都是其源代码)
incomplete:引入路由;egp几乎不使用;igp:newtork
多出口分离,约等于开销值。默认情况下值为0,越小越优先。若把igp路由宣告进bgp,会继承igp路由的cost作为med值
med属性仅在相邻两个AS之间传递,收到此属性的AS不会再通告给任何其他第三方AS
med值用于影响从相邻AS到本AS的路由选择,即用于影响邻居AS到本AS的流量从哪个接口进来,这是用过向相邻AS的EBGP邻居发送具有不同MED值的路由条目来实现的
注意:Med值比较的前提是这两条路由经过的第一个AS-Path必须一致
R1:
ip ip-prefix 13 index 10 permit 1.1.1.1 32
ip ip-prefix 13 index 20 permit 3.3.3.3 32
ip ip-prefix 24 index 10 permit 2.2.2.2 32
ip ip-prefix 24 index 20 permit 4.4.4.4 32
route-policy R1 permit node 10
if-match ip-prefix 13
apply cost 100 //数值较小则优选
#
route-policy R1 permit node 20
if-match ip-prefix 24
apply cost 200 //数值较大则次选
#
route-policy R1 permit node 30
[R1-bgp]peer 10.1.15.5 route-policy R1 export
R2
ip ip-prefix 13 index 10 permit 1.1.1.1 32
ip ip-prefix 13 index 20 permit 3.3.3.3 32
ip ip-prefix 24 index 10 permit 2.2.2.2 32
ip ip-prefix 24 index 20 permit 4.4.4.4 32
route-policy R2 permit node 10
if-match ip-prefix 13
apply cost 200
#
route-policy R2 permit node 20
if-match ip-prefix 24
apply cost 100
#
route-policy R2 permit node 30
[R2-bgp]peer 10.1.26.6 route-policy R2 export
数据测试:
tracert -a 7.7.7.7 4.4.4.4
traceroute to 4.4.4.4(4.4.4.4), max hops: 30 ,packet length: 40,press CTRL_C to break
1 10.1.67.6 20 ms 20 ms 20 ms
2 10.1.26.2 30 ms 30 ms 40 ms
3 10.1.23.3 30 ms 30 ms 30 ms
4 10.1.34.4 50 ms 30 ms 40 ms
tracert -a 7.7.7.7 2.2.2.2
traceroute to 2.2.2.2(2.2.2.2), max hops: 30 ,packet length: 40,press CTRL_C to break
1 10.1.67.6 30 ms 20 ms 20 ms
2 10.1.26.2 30 ms 30 ms 40 ms
tracert -a 7.7.7.7 1.1.1.1
traceroute to 1.1.1.1(1.1.1.1), max hops: 30 ,packet length: 40,press CTRL_C to break
1 10.1.57.5 30 ms 10 ms 10 ms
2 10.1.15.1 30 ms 20 ms 20 ms
tracert -a 7.7.7.7 3.3.3.3
traceroute to 3.3.3.3(3.3.3.3), max hops: 30 ,packet length: 40,press CTRL_C to break
1 10.1.57.5 20 ms 20 ms 10 ms
2 10.1.15.1 20 ms 20 ms 30 ms
3 10.1.13.3 30 ms 40 ms 20 ms