BGP笔记
边界网关协议BGP(Border Gateway Protocol)是一种实现自治系统AS(Autonomous System)之间的路由可达,并选择最佳路由的距离矢量路由协议。
MP-BGP是对BGP-4进行了扩展,来达到在不同网络中应用的目的,BGP-4原有的消息机制和路由机制并没有改变。MP-BGP在IPv6单播网络上的应用称为BGP4+,在IPv4组播网络上的应用称为MBGP(Multicast BGP)
BGP笔记
BGP分类
BGP按照运行方式分为EBGP(External/Exterior BGP)和IBGP(Internal/Interior BGP)。
EBGP:
运行于不同AS之间的BGP称为EBGP。为了防止AS间产生环路,当BGP设备接收EBGP对等体发送的路由时,会将带有本地AS号的路由丢弃。从EBGP对等体获得的路由会向它的所有BGP对等体通告
IBGP:
运行于同一AS内部的BGP称为IBGP。为了防止AS内产生环路,BGP设备不将从IBGP对等体学到的路由通告给其他IBGP对等体,并与所有IBGP对等体建立全连接。从IBGP获得的路由是否通告给它的EBGP对等体要依IGP和BGP同步的情况来决定。为了解决IBGP对等体的连接数量太多的问题,BGP设计了路由反射器和BGP联盟。
BGP报文作用
报文名称 | 作用 | 什么时候发 |
---|---|---|
OPEN | 协商BGP邻居参数,建立邻居关系 | 通过TCP建立BGP连接,发送open报文 |
UPDATE | 进行路由信息交换 | 连接建立后,有路由需要发送或路由变化时,发送UPDATE通告对端路由信息 |
NOTIFICATION | 报告错误,中断邻居关系 | 当BGP在运行中发现错误时,要发送NOTIFICATION报文通告BGP对端 |
KEEPALIVE | 保活,维持邻居关系 | 定时发送KEEPALIVE报文以保持BGP邻居关系的有效性 |
ROUTE-REFRESH | 保证网络稳定,触发更新路由的机制 | 当路由策略发生变化时,触发请求邻居重新通告路由 |
BGP邻居状态机
状态名称 | 发什么包 | 在做什么 |
---|---|---|
Idle | 尝试建立TCP连接 | 开始准备TCP的连接并监视远程peer启动TCP连接,启用BGP时,要准备足够的资源 |
Connect | TCP包 | 正在进行TCP连接,等待完成中,认证都是在TCP建立期间完成的。如果TCP连接不上则进入Active状态,反复尝试连接 |
Active | TCP包 | 反复尝试和对方建立TCP连接 |
OpenSent | Open包 | TCP连接建立已经成功,开始发送Open包,Open包携带参数协商对等体的建立 |
OpenConfirm | KeepAlive包 | 参数、能力特性协商成功,自己开始发送Keepalive包,等待对方的Keepalive包 |
Established | Update包 | 已经收到对方的Keepalive包,双方能力特性一致,开始使用Update通告路由信息 |
BGP路径选择
BGP路径选择
步骤一 优选权重最高的路由 weight(Cisco私有)
步骤二 如果多条路由拥有相同权重。优选本地优先级最高的路由(Local Preference 用在一个AS内部)
步骤三 如果多条路由拥有相同本地优先级。优选本地路由器初始的路由(本地初始路由在BGP表中下一跳为0.0.0.0)
步骤四 如果没有本地路由器初始路由。优选AS-PATH最短的路由
步骤五 如果多条路由拥有相同长短的AS-PATH。优选源代码最小的路由(Origin Code:IGP<EGP<Incomplete)
步骤六 如果多条路由拥有相同源代码。优选MED最低的路由(路由器在AS之间交换MED)
步骤七 如果多条路由拥有相同MED。优选外部路由(eBGP)而不是内部路由(iBGP)
步骤八 如果只剩内部路由,优选穿越最近IGP邻居的路径(去往BGP下一跳的最短路径)
步骤九 对于eBGP路径,优选最老的路由(减少路由反复启动和禁用的风险)
步骤十 优选邻居BGP路由器ID值最低的路由
步骤十一 如果BGP路由器ID都相同。优选邻居IP地址最小的路由
实例
通过十一个步骤,最终只有一条路径会被放入路由表并传播给路由器的其他BGP邻居。如果没有修改路由的话,最常见的路由选择因素是路由选择中的步骤四:优选最短的AS-PATH。
步骤一 对比权重,非源于本地路由器的路由,默认权重为0
步骤二 对比本地优先级,所有网络的本地优先级默认为100。只有当网络管理员手动配置过,步骤一和步骤二才会生效
步骤三 查看这个AS拥有的网络。如果其中一条是由本地路由器注入到BGP表中的,那么优选本地路由器提供的路由,而不是通过其他BGP路由器收到的路由
步骤四 优选跨越最少AS的路径。这是BGP中路径选择最常见的结果
步骤五 查看的是网络进入BGP的方式。通常网络是由命令network(源代码为i)或者通过重分布(源代码为?)进入BGP的
步骤六 通过查看MED,判断邻居AS希望本地AS向哪里发送指定网络的数据包
步骤七 这是BGP路径选择第二常见的最终结果。从eBGP邻居学到的外部路径优于从iBGP邻居学到的内部路径。一个AS内的路由器会优选使用ISP(网络服务商)的带宽资源,来去往某个网络,而不是优选本地AS中另一台iBGP邻居并占用内部带宽资源
如果AS路径长度相等,并且这个AS中只有iBGP提供了路径,BGP就会选择去往最近出口的路径。步骤八就会查找最近的iBGP邻居(“最近”决定于IGP中的度量,比如RIP条数,OSPF最小开销等)
如果AS路径长度相等,穿越所有iBGP邻居的开销也相等,或者所有去往这个网络的邻居都是eBGP邻居,那么下一步就是选择最老路径(步骤九),因为它建立时间最长,可以
认为它最稳定
如果上述都相等,优选BGP路由ID最低的路由(步骤十)
如果BGP路由器ID也相同(比如所有路径都去往同一台BGP路由器),那么选择邻居IP地址最小的路由(步骤十一)
BGP属性
类型名 | 含义 |
---|---|
公认必须遵循(Well-known mandatory) | 所有BGP设备都可以识别此类属性,且必须存在于Update报文中。如果缺少这类属性,路由信息就会出错。 |
公认自决(Well-known discretionary) | 所有BGP设备都可以识别此类属性,但不要求必须存在于Update报文中,即就算缺少这类属性,路由信息也不会出错。 |
可选传递(Optional transitive) | BGP设备可以不识别此类属性,如果BGP设备不识别此类属性,但它仍然会接收这类属性,并通告给其他对等体。 |
可选非传递(Optional non-transitive) | BGP设备可以不识别此类属性,如果BGP设备不识别此类属性,则会被忽略该属性,且不会通告给其他对等体。 |
属性名 | 类型 |
---|---|
Origin属性 | 公认必遵 |
AS_Path属性 | 公认必遵 |
Next_Hop属性 | 公认必遵 |
Local_Pref属性 | 公认自决 |
Atomic Aggregate路由聚合 | 公认自决 |
Community 团体 | 可选传递 |
Aggregator 聚合器 | 可选传递 |
MED属性 | 可选非传递 |
Originator_ID属性 | 可选非传递 |
Cluster_List属性 | 可选非传递 |
一条BGP路由缺省携带的属性是 origin next-hop as-path以及 local-pref=100 MED=0属性
Origin属性:
Origin属性用来定义路径信息的来源,标记一条路由是怎么成为BGP路由的。它有以下3种类型:
IGP:具有最高的优先级。通过network命令注入到BGP路由表的路由,其Origin属性为IGP。
EGP:优先级次之。通过EGP得到的路由信息,其Origin属性为EGP。
Incomplete:优先级最低。通过其他方式学习到的路由信息。比如BGP通过import-route命令引入的路由,其Origin属性为Incomplete。
AS_Path属性:
AS_Path属性按矢量顺序记录了某条路由从本地到目的地址所要经过的所有AS编号。在接收路由时,设备如果发现AS_Path列表中有本AS号,则不接收该路由,从而避免了AS间的路由环路。
当BGP Speaker传播自身引入的路由时:
当BGP Speaker将这条路由通告到EBGP对等体时,便会在Update报文中创建一个携带本地AS号的AS_Path列表。
当BGP Speaker将这条路由通告给IBGP对等体时,便会在Update报文中创建一个空的AS_Path列表。
当BGP Speaker传播从其他BGP Speaker的Update报文中学习到的路由时:
当BGP Speaker将这条路由通告给EBGP对等体时,便会把本地AS编号添加在AS_Path列表的最前面(最左面)。收到此路由的BGP设备根据AS_Path属性就可以知道去目的地址所要经过的AS。离本地AS最近的相邻AS号排在前面,其他AS号按顺序依次排列。
当BGP Speaker将这条路由通告给IBGP对等体时,不会改变这条路由相关的AS_Path属性。
Next_hop属性:
Next_Hop属性记录了路由的下一跳信息。BGP的下一跳属性和IGP的有所不同,不一定就是邻居设备的IP地址。通常情况下,Next_Hop属性遵循下面的规则:
BGP Speaker在向EBGP对等体发布某条路由时,会把该路由信息的下一跳属性设置为本地与对端建立BGP邻居关系的接口地址。
BGP Speaker将本地始发路由发布给IBGP对等体时,会把该路由信息的下一跳属性设置为本地与对端建立BGP邻居关系的接口地址。
BGP Speaker在向IBGP对等体发布从EBGP对等体学来的路由时,并不改变该路由信息的下一跳属性。
Next-Hop-Self
eBGP使用对等体作为自己的下一跳
iBGP缺省情况下不改变下一跳,导致iBGP学到的是eBGP对接的其他AS的接口地址,而这个地址只有eBGP自己知道(eBGP并不会通告iBGP怎么去它的邻居eBGP),导致没有这个路由,导致学来的路由是下一跳不可达,导致不加入路由表
在iBGP之间启用next-hop-self特性,这样内部AS的BGP路由学来的其他AS的路由下一跳就会指向自己AS内部BGP的边界BGP路由器,这个地址在IGP内是可达的。
Local_pref属性:
Local_Pref属性表明路由器的BGP优先级,用于判断流量离开AS时的最佳路由。当BGP的设备通过不同的IBGP对等体得到目的地址相同但下一跳不同的多条路由时,将优先选择Local_Pref属性值较高的路由。Local_Pref属性仅在IBGP对等体之间有效,不通告给其他AS。Local_Pref属性可以手动配置,如果路由没有配置Local_Pref属性,BGP选路时将该路由的Local_Pref值按缺省值100来处理。
MED属性:
MED(Multi-Exit Discriminator)属性用于判断流量进入AS时的最佳路由,当一个运行BGP的设备通过不同的EBGP对等体得到目的地址相同但下一跳不同的多条路由时,在其它条件相同的情况下,将优先选择MED值较小者作为最佳路由。
MED属性仅在相邻两个AS之间传递,收到此属性的AS一方不会再将其通告给任何其他第三方AS。MED属性可以手动配置,如果路由没有配置MED属性,BGP选路时将该路由的MED值按缺省值0来处理。
团体属性:
团体属性(Community)用于标识具有相同特征的BGP路由,使路由策略的应用更加灵活,同时降低了维护管理的难度。
团体属性分为自定义团体属性和公认团体属性。公认团体属性如下所示:
属性名 | 含义 |
---|---|
No_advertise | 不通告给任何BGP对等体 |
No_export | 不通告给EBGP对等体 |
Internet | 可以通告给所有其他BGP对等体 |
Local-AS | 表示本路径不发布到本AS外部 |
Originator_ID属性和Cluster_List属性:
Originator_ID属性和Cluster_List属性用于解决路由反射器场景中的环路问题。
路由反射器
为保证IBGP对等体之间的连通性,需要在IBGP对等体之间建立全连接关系。假设在一个AS内部有n台设备,那么建立的IBGP连接数就为n(n-1)/2。当设备数目很多时,设备配置将十分复杂,而且配置后网络资源和CPU资源的消耗都很大。在IBGP对等体间使用路由反射器可以解决以上问题。
路由反射器相关角色:
在一个AS内部关于路由反射器有以下几种角色:
路由反射器RR(Route Reflector):
允许把从IBGP对等体学到的路由反射到其他IBGP对等体的BGP设备,类似OSPF网络中的DR。
客户机(Client):
与RR形成反射邻居关系的IBGP设备。在AS内部客户机只需要与RR直连。
非客户机(Non-Client):
既不是RR也不是客户机的IBGP设备。在AS内部非客户机与RR之间,以及所有的非客户机之间仍然必须建立全连接关系。
始发者(Originator):
在AS内部始发路由的设备。Originator_ID属性用于防止集群内产生路由环路。
集群(Cluster):
路由反射器及其客户机的集合。Cluster_List属性用于防止集群间产生路由环路。
路由反射器原理:
同一集群内的客户机只需要与该集群的RR直接交换路由信息,因此客户机只需要与RR之间建立IBGP连接,不需要与其他客户机建立IBGP连接,从而减少了IBGP连接数量。
RR突破了“从IBGP对等体获得的BGP路由,BGP设备只发布给它的EBGP对等体。”的限制,并采用独有的Cluster_List属性和Originator_ID属性防止路由环路。RR向IBGP邻居发布路由规则如下:
从非客户机学到的路由,发布给所有客户机。
从客户机学到的路由,发布给所有非客户机和客户机(发起此路由的客户机除外)。
从EBGP对等体学到的路由,发布给所有的非客户机和客户机。
Cluster_List属性:
路由反射器和它的客户机组成一个集群(Cluster),使用AS内唯一的Cluster ID作为标识。为了防止集群间产生路由环路,路由反射器使用Cluster_List属性,记录路由经过的所有集群的Cluster ID。
当一条路由第一次被RR反射的时候,RR会把本地Cluster ID添加到Cluster List的前面。如果没有Cluster_List属性,RR就创建一个。
当RR接收到一条更新路由时,RR会检查Cluster List。如果Cluster List中已经有本地Cluster ID,丢弃该路由;如果没有本地Cluster ID,将其加入Cluster List,然后反射该更新路由。
Originator_ID属性:
Originator ID由RR产生,使用的Router ID的值标识路由的始发者,用于防止集群内产生路由环路。
当一条路由第一次被RR反射的时候,RR将Originator_ID属性加入这条路由,标识这条路由的发起设备。如果一条路由中已经存在了Originator_ID属性,则RR将不会创建新的Originator_ID属性。
当设备接收到这条路由的时候,将比较收到的Originator ID和本地的Router ID,如果两个ID相同,则不接收此路由。
BGP联盟
解决AS内部的IBGP网络连接激增问题,除了使用路由反射器之外,还可以使用联盟(Confederation)。联盟将一个AS划分为若干个子AS。每个子AS内部建立IBGP全连接关系,子AS之间建立联盟EBGP连接关系,但联盟外部AS仍认为联盟是一个AS。配置联盟后,原AS号将作为每个路由器的联盟ID。
这样有两个好处:
一是可以保留原有的IBGP属性,包括Local Preference属性、MED属性和NEXT_HOP属性等;
二是联盟相关的属性在传出联盟时会自动被删除,即管理员无需在联盟的出口处配置过滤子AS号等信息的操作。
路由反射器 | 联盟 |
---|---|
不需要更改现有的网络拓扑,兼容性好。 | 需要改变逻辑拓扑。 |
配置方便,只需要对作为反射器的设备进行配置,客户机并不需要知道自己是客户机。 | 所有设备需要重新进行配置。 |
集群与集群之间仍然需要全连接。 | 联盟的子AS之间是特殊的EBGP连接,不需要全连接。 |
适用于中、大规模网络。 | 适用于大规模网络。 |
参考
CCNP ROUTE
BGP原理与配置(锐捷)