网络学习笔记(6)- BGP基础
BGP概述
边界网关协议BGP(Border Gateway Protocol)是一种实现自治系统AS(Autonomous System)之间的路由可达,并选择最佳路由的 高级路径矢量路由协议。
相较于传统的IGP协议:
- BGP基于TCP,只要能够建立TCP连接即可建立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 版本号:如果两端版本号不一致,则协调至相同为止,版本号高的服从版本号低的。假设一端是 BGP3 ,另一端是BGP 4,则最后协商的结果为 BGP3。
BGP的特点
(1) 特征一
- BGP使用TCP为传输层协议,TCP端口号179。路由器之间的BGP会话基于TCP连接而建立。
- 运行BGP的路由器被称为BGP发言者(BGP Speaker),或BGP路由器。
- 两个建立BGP会话的路由器互为对等体(Peer),BGP对等体之间交换BGP路由表。
- BGP路由器只发送增量的BGP路由更新,或进行触发式更新(不会周期性更新)。
- BGP能够承载大批量的路由前缀,可在大规模网络中应用。
(2) 特征二
- BGP通常被称为路径矢量路由协议(Path-Vector Routing Protocol)。
- 每条BGP路由都携带多种路径属性(Path attribute),BGP可以通过这些路径属性控制路径选择,而不像IS-IS、OSPF只能通过Cost控制路径选择,因此在路径选择上,BGP具有丰富的可操作性,可以在不同场景下选择最合适的路径控制方式。
BGP对等体关系
与OSPF、IS-IS等协议不同,BGP的会话是基于TCP建立的。建立BGP对等体关系的两台路由器并不要求必须直连。
BGP按照运行方式分为EBGP(External/Exterior BGP)
和IBGP(Internal/Interior BGP)
。
1、EBGP:
运行于不同AS之间的BGP称为EBGP。为了防止AS间产生环路,当BGP设备接收EBGP对等体发送的路由时,会将带有本地AS号的路由丢弃。
2、IBGP:
运行于同一AS内部的BGP称为IBGP。为了防止AS内产生环路,BGP设备不将从IBGP对等体学到的路由通告给其他IBGP对等体,并与所有IBGP对等体建立全连接。为了解决IBGP对等体的连接数量太多的问题,BGP设计了路由反射器和BGP联盟(详情见后面)。
如果在AS内一台BGP设备收到EBGP邻居发送的路由后,需要通过另一台BGP设备将该路由传输给其他AS,此时推荐使用IBGP。
同步规则 BGP synchronization
当一台路由器从自己的 IBGP 对等体学习到一条BGP 路由时,它将不能使用该条路由或把这条路由通告给自己的 EBGP 对等体,除非它又从IGP 协议学习到这条路由,也就是要求 IBGP 路由与 IGP 路由同步。
同步规则主要用于规避 BGP 路由黑洞。
解决方法:
1、所有设备都运行 BGP
2、IGP与BGP 进行引入
3、采用 MPLS
华为默认BGP 同步是被关闭的
BGP对等体关系建立
- 先启动BGP的一端先发起TCP连接,如下图所示,R1先启动BGP,R1使用随机端口号向R2的179端口发起TCP连接,完成TCP连接的建立。
- 三次握手建立完成之后,R1、R2之间相互发送Open报文,携带参数用于对等体建立,参数协商正常之后双方相互发送Keepalive报文,收到对端发送的Keepalive报文之后对等体建立成功,同时双方定期发送Keepalive报文用于保持连接。
- 其中Open报文中携带:
- My Autonomous System:自身AS号
- Hold Time:用于协商后续Keepalive报文发送时间
- BGP Identifier:自身Router ID
BGP对等体关系建立之后,BGP路由器发送BGP Update(更新)报文通告路由到对等体。
TCP连接源地址
- 缺省情况下,BGP使用报文出接口作为TCP连接的本地接口。
- 在部署IBGP对等体关系时,建议使用Loopback地址作为更新源地址。Loopback接口非常稳定,而且可以借助AS内的IGP和冗余拓扑来保证可靠性。
- 在部署EBGP对等体关系时,通常使用直连接口的IP地址作为源地址,如若使用Loopback接口建立EBGP对等体关系,则应注意EBGP多跳问题。
一般而言在AS内部,网络具备一定的冗余性。在R1与R3之间,如果采用直连接口建IBGP邻居关系,那么一旦接口或者直连链路发生故障,BGP会话也就断了,但是事实上,由于冗余链路的存在,R1与R3之间的IP连通性其实并没有DOWN(仍然可以通过R4到达彼此)。
报文及状态机
BGP对等体间通过以下5种报文进行交互,其中Keepalive报文为周期性发送,其余报文为触发式发送:
1、Open报文:
用于建立BGP对等体连接。
2、Update报文:
用于在对等体之间交换路由信息。需要在BGP中network才会有Update报文
3、Notification(通告)报文:
用于中断BGP连接。
4、Keepalive报文:
用于保持BGP连接。
5、Route-refresh(刷新)报文:
用于在改变路由策略后请求对等体重新发送路由信息。只有支持路由刷新(Route-refresh)能力的BGP设备会发送和响应此报文。
可以抓取到 route-refresh 报文
<>refresh bgp all import
报文头格式
BGP五种报文都拥有相同的报文头,格式如左侧所示,主要字段解释如下:
- Marker:16Byte,用于标明BGP报文边界,所有bit均为“1”。
- Length:2Byte,BGP报文总长度(包括报文头在内),以Byte为单位。
- Type:1Byte,BGP报文的类型。其取值从1到5,分别表示Open、Update、Notification、Keepalive和Route-refresh 报文。
Open报文
Open报文是TCP连接建立之后发送的第一个报文,用于建立BGP对等体之间的连接关系,报文格式如左侧所示,主要字段解释如下:
- Version:BGP的版本号。对于BGP 4来说,其值为4。
- My AS(autonomous system):本地AS号。通过比较两端的AS号可以判断对端是否和本端处于相同AS。
- Hold Time:保持时间。在建立对等体关系时两端要协商Hold Time,并保持一致。如果在这个时间内未收到对端发来的Keepalive报文或Update报文,则认为BGP连接中断。
- BGP Identifier:BGP标识符,以IP地址的形式表示,用来识别BGP路由器。
- Opt Parm Len:Optional parameters的长度。
- Optional parameters:宣告自身对于一些可选功能的支持,比如认证、多协议支持。
- 除了IPv4单播路由信息,BGP4+还支持多种网络层协议(如IPv6、组播),在协商时BGP对等体之间会通过Optional parameters字段协商对网络层协议的支持能力。
Router ID
BGP的Router ID是一个用于标识BGP设备的32位值,通常是IPv4地址的形式,在BGP会话建立时发送的Open报文中携带。
对等体之间建立BGP会话时,每个BGP设备都必须有唯一的Router ID,否则对等体之间不能建立BGP连接。
BGP的Router ID在BGP网络中必须是唯一的,可以采用手工配置,也可以让设备自动选取。
缺省情况下,BGP选择设备上的Loopback接口的IPv4地址作为BGP的Router ID。如果设备上没有配置Loopback接口,系统会选择接口中最大的IPv4地址作为BGP的Router ID
Update报文
- Update报文用于在对等体之间传递路由信息,可以用于发布、撤销路由。
- 一个Update报文可以通告具有相同路径属性的多条路由,这些路由保存在NLRI(Network Layer Reachable Information,网络层可达信息)中。同时Update还可以携带多条不可达路由,用于告知对方撤销路由,这些保存在Withdrawn Routes字段中。
- 报文格式如左侧所示,主要字段解释如下:
- Withdrawn routes:不可达路由的列表。
- Path attributes:与NLRI相关的所有路径属性列表,每个路径属性由一个TLV(Type-Length-Value)三元组构成。
- NLRI:可达路由的前缀和前缀长度二元组。
- Unfeasible routes length:不可达路由字段的长度,以Byte为单位。如果为0则说明没有Withdrawn Routes 字段。
- Withdrawn Routes Length:标明Withdrawn Routes部分的长度。其值为零时,表示没有撤销的路由。
- Total path attribute length:路径属性字段的长度,以Byte为单位。如果为0则说明没有Path Attributes 字段。
Notification报文
当BGP检测到错误状态时(对等体关系建立时、建立之后都可能发生),就会向对等体发送Notification,告知对端错误原因。之后BGP连接将会立即中断。
- Error Code、Error subcode:差错码、差错子码,用于告知对端具体的错误类型。
- Data:用于辅助描述详细的错误内容,长度并不固定。
Keepalive报文
BGP路由器收到对端发送的Keepalive报文,将对等体状态置为已建立,同时后续定期发送keepalive报文用于保持连接。
Keepalive报文格式中只包含报文头,没有附加其他任何字段。
Route-refresh报文
Route-refresh报文用来要求对等体重新发送指定地址族的路由信息,一般为本端修改了相关路由策略之后让对方重新发送Update报文,本端执行新的路由策略重新计算BGP路由。
相关字段内容如下:
- AFI:Address Family Identifier,地址族标识,如IPv4。
- Res.:保留,8个bit必须置0。
- SAFI:Subsequent Address Family Identifier,子地址族标识。
BGP状态机
BGP的五种状态机
idle: 初始状态
connect: BGP等待TCP连接的建立
active: TCP连接失败,重新建立TCP连接
open sent:TCP建立成功,发送open报文
open confirm: 收到正确的OPEN报文
established: BGP邻居建立成功
1、Idle状态是BGP初始状态。
在Idle状态下,BGP拒绝邻居发送的连接请求。只有在收到本设备的Start事件后,BGP才开始尝试和其它BGP对等体进行TCP连接,并转至Connect(连接)状态。
- Start事件是由一个操作者配置一个BGP过程,或者重置一个已经存在的过程或者路由器软件重置BGP过程引起的。
- 任何状态中收到Notification(通告)报文或TCP拆链通知等Error事件后,BGP都会转至Idle状态。
2、在Connect(连接)状态下,BGP启动连接重传定时器(Connect Retry),等待TCP完成连接。
- 如果TCP连接成功,那么BGP向对等体发送Open报文,并转至OpenSent状态。
- 如果TCP连接失败,那么BGP转至Active(活跃)状态。
- 如果连接重传定时器超时,BGP仍没有收到BGP对等体的响应,那么BGP继续尝试和其它BGP对等体进行TCP连接,停留在Connect状态。
3、在Active状态下,BGP总是在试图建立TCP连接。
- 如果TCP连接成功,那么BGP向对等体发送Open报文,关闭重传定时器,并转至OpenSent状态。
- 如果TCP连接失败,那么BGP停留在Active状态。
- 如果连接重传定时器超时,BGP仍没有收到BGP对等体的响应,那么BGP转至Connect状态。
4、在OpenSent状态下,BGP等待对等体的Open报文,并对收到的Open报文中的AS号、版本号、认证码等进行检查。
- 如果收到的Open报文正确,那么BGP发送Keepalive报文,并转至OpenConfirm状态。
- 如果发现收到的Open报文有错误,那么BGP发送Notification报文给对等体,并转至Idle状态。
5、在OpenConfirm状态下,BGP等待Keepalive或Notification报文。
- 如果收到Keepalive报文,则转至Established状态,
- 如果收到Notification报文,则转至Idle状态。
6、在Established状态下,BGP可以和对等体交换Update、Keepalive、Route-refresh报文和Notification报文。
- 如果收到正确的Update或Keepalive报文,BGP就认为对端处于正常运行状态,将保持BGP连接。
- 如果收到错误的Update或Keepalive报文,BGP发送Notification报文通知对端,并转至Idle状态。
- Route-refresh报文不会改变BGP状态。
- 如果收到Notification报文,那么BGP转至Idle状态。
- 如果收到TCP拆链通知,那么BGP断开连接,转至Idle状态。
状态机详解
常见的三种状态 Idle, Active,Established
Idle状态
缺乏去往BGP对等体的路由是导致BGP路由器其状态机一直处于idle状态的常见原因。
Connect、Active
配置完BGP对等体并成功查找到去往对等体地址的路由之后,会发起TCP三次握手,TCP三次握手建立过程中处于Connect状态,如果TCP连接长期无法建立则进入Active状态。
Open Sent、Open Confirm
TCP三次握手建立完成之后,发送Open报文建立对等体关系,此时进入Open Sent状态,当收到对端回应的Open报文,并且参数检查无误,在发送keepalive报文之后进入Open Confirm状态。
Established
进入Open Confirm状态之后,BGP路由器如果收到了对端发送的Keeaplive报文,则进入Established状态,对等体关系建立过程就此完成。
BGP对等体表
<R1>display bgp peer
BGP local router ID : 10.0.1.1
Local AS number : 100
Total number of peers : 1 Peers in established state : 1
Peer V AS MsgRcvd MsgSent OutQ Up/Down State PrefRcv
10.0.12.2 4 100 25719 25714 0 0428h32m Established 1
BGP对等体表的作用为列出本设备的BGP对等体,以及对等体的状态等信息。在设备上通过display bgp peer命令查看BGP对等体表,其中主要参数含义:
- Peer:对等体地址
- V:version,版本号
- AS:对等体AS号
- Up/Down:该对等体已经存在up或者down的时间
- State:对等体状态,这里显示的为BGP状态机的状态
- PrefRcv:prefix received,从该对等体收到的路由前缀数目
- MsgRcvd 、MsgSent:从对等体收到的报文个数,向对等体发送的报文个数。
- OutQ:out queue,对外发送报文队列中排队的个数,一般为0。
BGP路由表
在设备上通过display bgp routing-table
查看BGP路由表:
- Network:路由的目的网络地址以及网络掩码
- NextHop:下一跳地址
如果想要查看某条路由更加详细的信息,可以通过display bgp routing-table ipv4-address { mask | mask-length}
查看,该命令会将匹配的BGP路由信息详细展示。
BGP路由的生成
不同于IGP路由协议,BGP自身并不会发现并计算产生路由,BGP将IGP路由表中的路由注入到BGP路由表中,并通过Update报文传递给BGP对等体。
BGP注入路由的方式有两种:
- Network
- import-route
与IGP协议相同,BGP支持根据已有的路由条目进行聚合,生成聚合路由。
Network注入路由
AS200内的BGP路由器已经通过IGP协议OSPF学习到了两条路由:10.1.0.0/24和10.2.0.0/24,在BGP进程内通过network命令注入这两条路由,这两条路由将会出现在本地的BGP路由表中。
AS200内的BGP路由器通过Update报文将路由传递给AS300内的BGP路由器。AS300内的BGP路由器收到路由后,将这两条路由加入到本地的BGP路由表中。
import-route方式注入路由
Network方式注入路由虽然是精确注入,但是只能一条条配置逐条注入IP路由表中的路由,如果注入的路由条目很多配置命令将会非常复杂,为此可以使用import-route方式,将:
- 直连路由
- 静态路由
- OSPF路由
- IS-IS路由
等协议的路由注入到BGP路由表中。
BGP聚合路由
与众多IGP协议相同,BGP同样支持路由的手工聚合,在BGP配置视图中使用aggregate命令可以执行BGP路由手工聚合,在BGP已经学习到相应的明细路由情况下,设备会向BGP注入指定的聚合路由。
- 执行聚合之后,在本地的BGP路由表中除了原本的明细路由条目之外,还会多出一条聚合的路由条目。
- 如果在执行聚合时指定了detail-suppressed,则BGP只会向对等体通告聚合后的路由,而不通告聚合前的明细路由。
- 在聚合时配置了抑制明细路由的参数,R3上查看路由表,将只能看到BGP路由:10.1.0.0/22,无法看到聚合前的明细路由。
BGP通告原则
BGP通过network
、import-route
、aggregate
聚合方式生成BGP路由后,通过Update报文将BGP路由传递给对等体。
BGP通告遵循以下原则:
- 只发布最优且有效路由。
- 从EBGP对等体获取的路由,会发布给所有对等体。
- IBGP水平分割:从IBGP对等体获取的路由,不会发送给IBGP对等体。
- BGP同步规则指的是:当一台路由器从自己的IBGP对等体学习到一条BGP路由时(这类路由被称为IBGP路由),它将不能使用该条路由或把这条路由通告给自己的EBGP对等体,除非它又从IGP协议(例如OSPF等,此处也包含静态路由)学习到这条路由,也就是要求IBGP路由与IGP路由同步。同步规则主要用于规避BGP路由黑洞问题。
通告原则一
第一条原则:只发布最优且有效(即下一跳地址可达)路由。
通过display bgp routing-table
命令可以查看BGP路由表。
Total Number of Routes: 2
Network NextHop MED LocPrf PrefVal Path/Ogn
*>i 10.1.0.0/24 11.1.0.1 0 100 0 ?
*i 11.1.0.2 0 100
在BGP路由表中同时存在以下两个标志的路由为最优、有效:
- * : 代表有效
- > : 代表最优
通告原则二
第二条原则:从EBGP对等体获取的路由,会发布给所有对等体。
R2从EBGP对等体获取的BGP路由,会发布给所有EBGP、IBGP对等体。
通告原则三
-
第三条原则:从IBGP对等体获取的BGP路由,不会再发送给其他IBGP对等体。
-
该条原则也被称为IBGP水平分割。
-
如图所示,如果IBGP对等体学习到的路由会继续传递给其他的IBGP对等体:
- R2将一条路由传递给了IBGP对等体R3
- R3收到路由之后传递给IBGP对等体R1
- R1继续传递给IBGP对等体R2
路由环路形成。
第三条原则可能会带来新的问题,如下图所示,当BGP路由器R2将路由传递给BGP路由器R1时,由于第三条原则限制,R1无法将BGP路由传递给R3,R3将无法学习到路由。
为解决该问题可以采用AS内IBGP全互联的方式,即:R2、R3之间建立非直连的IBGP对等体关系,以此让BGP路由器R2将路由传递给BGP路由器 R3。
通告原则四
第四条原则:当一台路由器从自己的IBGP对等体学习到一条BGP路由时(这类路由被称为IBGP路由),它将不能使用该条路由或把这条路由通告给自己的EBGP对等体,除非它又从IGP协议(例如OSPF等,此处也包含静态路由)学习到这条路由,该条规则也被称为BGP同步原则。
如下图所示:
- BGP路由器R4上存在一条路由10.0.4.0/24,R4将其传递给了R2。
- R2将路由传递给非直连IBGP对等体R3。
- R3将路由传递给R5。
- 之后R5向10.0.4.4发起访问。
R5访问10.0.4.4:
- R5查找路由表,将报文发送给R3。
- R3收到报文后查找路由表,匹配到一条BGP路由,其下一跳为R2,但是R2为非直连下一跳,需要进行路由迭代,通过IGP学习到的路由迭代出下一跳为R1。R3将报文发送给R1。
- R1收到报文后查找路由表,因为R1并非BGP路由器,未与R2建立IBGP对等体关系,因此R1上并无BGP路由10.0.4.0/24,路由查找失败,R1将报文丢弃。
产生该问题根本原因为AS200域内未运行BGP的路由器并无从BGP学习到的路由条目,查找路由失败,导致R1丢弃报文。为此制定了BGP同步原则:当BGP的路由条目也存在于IGP路由表时才对外发送,以图中场景为例,当R3查看IGP路由表,OSPF路由表中并无路由10.0.4.0/24,因此并不会向R5发送该路由,自然也不会产生后续的访问失败问题。
解决该问题的方式有:
- 将BGP路由重分发到IGP中,基本不会使用该方式。
- 建立全互联的IBGP对等体关系,让全网所有路由器都拥有BGP路由。
总结图
作者:废权
链接:https://blog.yjscloud.com/archives/320
声明:如无特别声明本文即为原创文章仅代表个人观点,版权归《废权的博客》所有,欢迎转载,转载请保留原文链接。
共有 0 条评论