为方便管理规模不断扩大的网络,网络被分成了不同的AS(Autonomous System,自治系统)。早期,EGP(Exterior Gateway Protocol,外部网关协议)被用于实现在AS之间动态交换路由信息。但是EGP设计得比较简单,只发布网络可达的路由信息,而不对路由信息进行优选,同时也没有考虑环路避免等问题,很快就无法满足网络管理的要求,BGP是为取代最初的EGP而设计的另一种外部网关协议。不同于最初的EGP,BGP能够进行路由优选、避免路由环路、更高效率的传递路由和维护大量的路由信息。
1.1.1 AS(Autonomous System,自治系统)
OSPF、IS-IS等IGP路由协议在组织机构网络内部广泛应用,随着网络规模扩大,网络中路由数量不断增长,IGP已无法管理大规模网络,AS的概念由此诞生。
AS指的是在同一个组织管理下,使用统一选路策略的设备集合,不同AS通过AS号区分,AS号存在16bit、32bit两种表示方式。IANA负责AS号的分发,当不同AS之间需要进行通信时,在AS之间应使用何种路由协议进行路由的传递?
提示:
1.1.2 使用IGP传递路由
VPN(virtual private network,虚拟专用网):使用虚拟专业网络技术可以从逻辑上建立一个直接连接的网络。
1.1.3 使用BGP传递路由
为此在AS之间专门使用BGP(Border Gateway Protocol,边界网关协议)协议进行路由传递,相较于传统的IGP协议:
1.1.4 BGP的发展史
目前关于BGP-4最新的RFC是4271,相比较于RFC1771,对于一些细节进行了进一步说明,如事件、状态机以及BGP路由决策流程等。
1.1.5 BGP在企业中的应用
1.2.1 BGP概述
BGP是一种实现自治系统AS之间的路由可达,并选择最佳路由的矢量性协议。早期发布的三个版本分别是BGP-1(RFC1105)、BGP-2(RFC1163)和BGP-3(RFC1267),1994年开始使用BGP-4(RFC1771),2006年之后单播IPv4网络使用的版本是BGP-4(RFC4271),其他网络(如IPv6等)使用的版本是MP-BGP(RFC4760)。
BGP的特点:
1.2.2 BGP特征
BGP特征1:
BGP特征2:
1.2.3 BGP对等体关系
与OSPF、IS-IS等协议不同,BGP的会话是基于TCP建立的。建立BGP对等体关系的两台路由器并不要求必须直连,BGP存在两种对等体关系类型---EBGP及IBGP。
EBGP(External BGP):位于不同自治系统的BGP路由器之间的BGP对等体关系。两台路由器之间要建立EBGP对等体关系,必须满足两个条件:
IBGP(Internal BGP):位于相同自治系统的BGP路由器之间的BGP邻接关系。
BGP对等体关系建立 1:
BGP建立对等体的对等体都会发起TCP三次握手,所以会建立两个TCP连接,但是实际BGP只会保留其中一个TCP连接,从Open报文中获取对端BGP Identifier之后BGP对等体会比较本端的Router ID和对端的Router ID大小,如果本端Router ID小于对端Router ID,则会关闭本地建立的TCP连接,使用由对端主动发起创建的TCP连接进行后续的BGP报文交互。
BGP对等体关系建立 2:
BGP对等体关系建立之后,BGP路由器发送BGP Update(更新)报文通告路由到对等体。
1.2.4 TCP连接源地址
一般而言在AS内部,网络具备一定的冗余性。在R1与R3之间,如果采用直连接口建IBGP邻居关系,那么一旦接口或者直连链路发生故障,BGP会话也就断了,但是事实上,由于冗余链路的存在,R1与R3之间的IP连通性其实并没有DOWN(仍然可以通过R4到达彼此)。
1.2.5 BGP报文类型
BGP存在5种类型的报文,不同类型的报文拥有相同的头部(header):
不同于常见的IGP协议,BGP使用TCP作为传输层协议,端口号179,这使得BGP支持在非直连的路由器之间建立对等体关系。
1.2.6 BGP报文格式
BGP五种报文都拥有相同的报文头,格式如下图所示:
Open报文是TCP连接建立之后发送的第一个报文,用于建立BGP对等体之间的连接关系,报文格式如下图所示,主要字段解释如下:
Update报文用于在对等体之间传递路由信息,可以用于发布、撤销路由,一个Update报文可以通告具有相同路径属性的多条路由,这些路由保存在NLRI(Network Layer Reachable Information,网络层可达信息)中。同时Update还可以携带多条不可达路由,用于告知对方撤销路由,这些保存在Withdrawn Routes字段中。
3. BGP报文格式 - Notification
当BGP检测到错误状态时(对等体关系建立时、建立之后都可能发生),就会向对等体发送Notification,告知对端错误原因。之后BGP连接将会立即中断。
4. BGP报文格式 -Keepalive
BGP路由器收到对端发送的Keepalive报文,将对等体状态置为已建立,同时后续定期发送keepalive报文用于保持连接,Keepalive报文格式中只包含报文头,没有附加其他任何字段。
5. BGP报文格式 - Route-refresh
Route-refresh报文用来要求对等体重新发送指定地址族的路由信息,一般为本端修改了相关路由策略之后让对方重新发送Update报文,本端执行新的路由策略重新计算BGP路由。
在Open报文协商时会协商是否支持Route-refresh,如果对等体支持Route-refresh能力,则可以通过refresh bgp命令手工对BGP连接进行软复位,BGP软复位可以在不中断BGP连接的情况下重新刷新BGP路由表,并应用新的策略。
对于不支持Route-Refresh能力的BGP对等体,可以配置keep-all-routes命令,保留该对等体的所有原始路由,这样不需要复位BGP连接即可完成路由表的刷新。
缺省情况下未开启keep-all-routes。
1.2.7 BGP状态机
BGP状态机汇总表:
BGP状态机迁移:
Idle状态是BGP初始状态。在Idle状态下,BGP拒绝对等体发送的连接请求。只有在收到本设备的Start事件后,BGP才开始尝试和其它BGP对等体进行TCP连接,并转至Connect状态。
在Connect状态下,BGP启动连接重传定时器(Connect Retry),等待TCP完成连接。
在Active状态下,BGP总是在试图建立TCP连接。
在OpenSent状态下,BGP等待对等体的Open报文,并对收到的Open报文中的AS号、版本号、认证码等进行检查。
在OpenConfirm状态下,BGP等待Keepalive或Notification报文。如果收到Keepalive报文,则转至Established状态,如果收到Notification报文,则转至Idle状态。
在Established状态下,BGP可以和对等体交换Update、Keepalive、Route-refresh报文和Notification报文。
BGP状态机详解
1.2.8 BGP对等体表
在设备上通过display bgp peer命令查看BGP对等体表:
BGP对等体表的作用为列出本设备的BGP对等体,以及对等体的状态等信息。
1.2.9 BGP路由表
在设备上通过display bgp routing-table查看BGP路由表:
如果想要查看某条路由更加详细的信息,可以通过display bgp routing-table ipv4-address { mask | mask-length} 查看,该命令会将匹配的BGP路由信息详细展示:
通过display bgp routing-table ipv4-address { mask | mask-length } 可以显示指定IP地址/掩码长度的路由信息,在其中有关于该BGP路由的详细信息,如:路由始发者、下一跳地址、路由的路径属性等。
1.2.10 BGP路由表生成
不同于IGP路由协议,BGP自身并不会发现并计算产生路由,BGP将IGP路由表中的路由注入到BGP路由表中,并通过Update报文传递给BGP对等体。
BGP注入路由的方式有两种:
与IGP协议相同,BGP支持根据已有的路由条目进行聚合,生成聚合路由。
Network注入路由
AS200内的BGP路由器已经通过IGP协议OSPF学习到了两条路由:10.1.0.0/24和10.2.0.0/24,在BGP进程内通过network命令注入这两条路由,这两条路由将会出现在本地的BGP路由表中。 /* Network方式注入的路由必须是已经存在于IP路由表中的路由条目,否则不会被成功注入到BGP路由表中*/
AS200内的BGP路由器通过Update报文将路由传递给AS300内的BGP路由器。
AS300内的BGP路由器收到路由后,将这两条路由加入到本地的BGP路由表中。
import-route方式注入路由
Network方式注入路由虽然是精确注入,但是只能一条条配置逐条注入IP路由表中的路由,如果注入的路由条目很多配置命令将会非常复杂,为此可以使用import-route方式,将:
等协议的路由注入到BGP路由表中。
1.2.11 BGP路由聚合
与众多IGP协议相同,BGP同样支持路由的手工聚合,在BGP配置视图中使用aggregate命令可以执行BGP路由手工聚合,在BGP已经学习到相应的明细路由情况下,设备会向BGP注入指定的聚合路由。
执行聚合之后,在本地的BGP路由表中除了原本的明细路由条目之外,还会多出一条聚合的路由条目。如果在执行聚合时指定了detail-suppressed,则BGP只会向对等体通告聚合后的路由,而不通告聚合前的明细路由,如上图:在聚合时配置了抑制明细路由的参数,R3上查看路由表,将只能看到BGP路由:10.1.0.0/22,无法看到聚合前的明细路由。
1.2.12 通告原则
BGP通过network、import-route、aggregate聚合方式生成BGP路由后,通过Update报文将BGP路由传递给对等体。
BGP通告遵循以下原则:
1. 只发布最优路由。
通过display bgp routing-table命令可以查看BGP路由表,在BGP路由表中同时存在以下两个标志的路由为最优、有效:
2. 从EBGP对等体获取的路由,会发布给所有对等体。
3. IBGP水平分割:从IBGP对等体获取的路由,不会发送给IBGP对等体。
如下图所示,如果IBGP对等体学习到的路由会继续传递给其他的IBGP对等体:
路由环路形成。
第三条原则可能会带来新的问题,如左侧所示,当BGP路由器R2将路由传递给BGP路由器R1时,由于第三条原则限制,R1无法将BGP路由传递给R3,R3将无法学习到路由。
为解决该问题可以采用AS内IBGP全互联的方式,即:R2、R3之间建立非直连的IBGP对等体关系,以此让BGP路由器R2将路由传递给BGP路由器 R3。
4. 当一台路由器从自己的IBGP对等体学习到一条BGP路由时(这类路由被称为IBGP路由),它将不能使用该条路由或把这条路由通告给自己的EBGP对等体,除非它又从IGP协议(例如OSPF等,此处也包含静态路由)学习到这条路由,也就是要求IBGP路由与IGP路由同步。同步规则主要用于规避BGP路由黑洞问题,如图所示:
R5访问10.0.4.4:
产生该问题根本原因为AS200域内未运行BGP的路由器并无从BGP学习到的路由条目,查找路由失败,导致R1丢弃报文。为此制定了BGP同步原则:
当BGP的路由条目也存在于IGP路由表时才对外发送,以图中场景为例,当R3查看IGP路由表,OSPF路由表中并无路由10.0.4.0/24,因此并不会向R5发送该路由,自然也不会产生后续的访问失败问题。
解决该问题的方式有: