目录
🕒 1. 概述
BGP(Border Gateway Protocol),边界网关协议。
- 一种自治系统间的选路协议,在 AS 之间交换网络的可达性信息。
- 根据可达性信息,路由器能够构造 AS 之间的连接关系图,从而计算出到达目的网络的路由。
- 在计算路由时,管理员可以在 AS 层面上应用一些路由控制策略。 - 例如,控制到某网络的路由不经过某些 AS。
- 因此,BGP尽力寻找一条能够到达目的网络且比较好的路由(不兜圈子),而并非找最佳路由。
- BGP属于距离矢量路由算法的增强协议,在原有路由信息的基础上加入路径信息,防止了路由环路的出现。
- 在配置BGP时,每个自治系统的管理员要选择至少一个路由器作为该自治系统的“BGP发言人”
- 当BGP发言人互相交换了网络可达性的信息后,各BGP发言人就根据所采用的路由控制策略从收到的路由信息中找出到达各自治系统的较好的路由。也就是构造出树形结构、不存在回路的自治系统连通图。
标准:
- RFC 4271:BGP4,支持 CIDR 和路由聚集,用于 IPv4 网络的 AS 间路由。
- RFC 4760:扩展了 BGP4,支持不同网络层协议的 AS 间路由。
🕒 2. BGP 发言人
自治系统中,运行 BGP 协议的路由器称为 BGP 发言人(BGP speaker)。
- 每个 BGP 发言人都有一个
4
字节的 BGP 标识符(BGP identifier); - 标识符在 BGP 发言人启动过程中确定,通常是其某个接口的 IP 地址。
BGP 发言人通过与其他自治系统的 BGP 发言人交换路径信息来学习路由。
建立连接的两个 BGP 发言人互称为对等发言人(peer)。
- 内部对等发言人(internal peer;IBGP):位于同一个 AS。如R1和R2。
- 外部对等发言人(external peer;EBGP):位于不同 AS。如R1和R3。
🕒 3. 工作原理
- 不同自治系统的BGP发言人要交换路由信息,首先必须建立TCP连接,端口号为
179
两个 BGP 发言人建立 TCP 连接后:
- 发送打开报文,协商路由信息交换参数;
- 发送更新报文,交换各自的 BGP 路由表。
- BGP 发言人并不周期性交换路由表,而采用增量式路由更新方法: - 只在路由表发生改变时,才向对等发言人通知改变的路由,包括增加新路由,或撤销失效路由。- 只交换管理策略允许的路由。
使用TCP连接交换路由信息的两个BGP发言人,彼此称为对方的邻站(neighbor)或对等站(peer)
- BGP 发言人之间周期性交换保活报文,以检测对方是否活跃。
- 若一段时间内接收不到对方的保活报文,就认为对方不再活跃,关闭与对方的连接。
- 协议运行过程中若发生错误,BGP 发言人向对方发送通知报文,并关闭与对方的连接。
- 连接关闭后,BGP 发言人撤销对方通知的所有路由。
如果一个 AS 与多个 AS 连接,该 AS 往往会有多个 BGP 发言人。
必须确保自治系统内部路由的一致性:需要在所有 BGP 发言人之间建立对等关系。
为防止在 AS 内部出现环路路由,BGP 发言人不会将从 IBGP 学习到的路由再通告给其他 IBGP (称为“水平分割”)。
🕒 4. 报文格式
BGP4 定义了 4 种报文:
类型报文名称1打开(OPEN)报文2更新(UPDATE)报文3通知(NOTIFICATION)报文4保活(KEEPALIVE)报文
🕘 4.1 报文首部
- 固定首部分为三个字段,占19字节。
- “标记”,占
16
字节,必须设置为0
,用于检查BGP对等体的同步信息是否完整,以及用于BGP验证的计算。不使用验证时所有比特均为1
。 - 用于在TCP字节流中定位BGP报文的开始位置。 - “长度”,占
2
字节,指明了报文(包括固定首部)的长度,即报文的结束位置,以字节为单位。 - “类型”,占
1
字节,指明了BGP报文的类型。
🕘 4.2 打开报文
BGP 发言人与对等 BGP 发言人建立 TCP 连接后,首先向对方发送一个打开报文 ,协商路由信息交换参数。
接收到打开报文后,BGP 发言人用保活报文响应。
1
字节的“版本”字段,指明BGP协议的版本号,对BGP4协议设置为4
。2
字节的“自治系统号”,是发送方所属自治系统的编号。2
字节的“保持时间”,是发送方建议的连接保持时间,以秒为单位。接收方将以自己配置的保持时间和发送方建议的保持时间中的较小者作为实际的连接保持时间。保持时间指明了从对方接收到下一个BGP报文的最长等待时间。若超过保持时间后还没有从对方接收到任何报文,就认为对方不可达,关闭与对方的TCP连接。4
字节的“BGP标识符”,即发送方的BGP标识符。BGP发言人在与所有对等发言人通信时必须使用相同的标识符。1
字节的“选项参数长度”,指明了报文中包含的所有选项参数的总长度,以字节为单位。若为 0,表明报文中没有选项参数。剩余数据则是选项参数。
打开报文可包含多个选项参数,每个参数用一个三元组(TLV结构)表示:
- “参数类型”, 占
1
个字节,指明参数的数据类型,如整型、字符串等。 - “参数长度”, 占
1
个字节,指明“参数值”字段的长度,以字节为单位
🕘 4.3 更新报文
BGP 发言人通过发送更新报文通知对等发言人路由信息。
BGP4 中路由被定义为:一组目的地址以及到达这些目的地址的一条路径;路径用一系列属性描述。
- 路径属性包括:经过的 AS 列表(路径)、路由来源、下一跳地址、路由是否被聚集等;
- 到达这组目的地址的路径相同。
一个 BGP 更新报文中可以包含一条增加的新路由,以及多条要撤销的失效路由。
撤销路由用“撤销路由长度”和“撤销路由”两个字段指明。
- “撤销路由长度”字段,占
2
字节,指明“撤销路由”字段的长度,以字节为单位。为 0 表示没有要撤销的路由,报文中也不包含撤销路由字段。 - “撤销路由”字段长度可变,列出了一组要撤销路由的目的网络地址。BGP4采用了一种压缩表示法,即采用二元组 <前缀长度,前缀>表示网络地址,其中“前缀长度”占1字节,指明32位的IP地址中网络前缀所占的位数;而“前缀”只有IP地址中包含网络前缀的字节,即前缀长度小于等于8时,前缀只包含地址的第一个字节;前缀长度在9到16之间时,包含前两个字节;前缀长度在17到24之间时,包含前三个字节;当前缀长度大于等于25时则包含所有四个字节。特别地,若前缀长度为0,表示是默认路由。
新增的路由“路径属性总长度”、“路径属性”和“网络层可达性信息”三个字段共同描述。
- “路径属性总长度”,占
2
字节,是紧接着的“路径属性”字段的总长度,单位是字节。如果是 0 表示报文中不包含新增路由,也不存在“路径属性”和“网络层可达性信息”字段。 - “路径属性”字段,长度可变,描述了新增的路由,是新路由的一组属性值。每个属性为TLV结构。其中“类型”占
2
个字节,第一个字节是“属性类型标志”,第二个字节是“属性类型代码”;“长度”指明了属性值所占的字节数,依赖于属性类型标志中“扩展长度位”是否置位,占1
个字节或2
个字节。一个更新报文中,一种路径属性只能出现一次。 - “网络层可达性信息”字段长度可变,列出了一组通过“路径属性”字段指明的路径可到达的目的地址。目的地址的编码方式与“撤销路由”字段中相同。
BGP 发言人根据接收的更新报文构造自治系统之间的连接关系图,计算出到达目的网络的下一跳地址。
🕘 4.4 保活报文
BGP 发言人周期性向对等发言人发送保活报文,以维持与对方的连接。
保活报文发送间隔不能小于
1
秒,通常设置为保持时间的
1/3
。
- 如果保持时间是 0,不发送保活报文。
保活报文只有标准的报文首部(19字节)而不包含其他数据。
🕘 4.5 通知报文
当协议运行发生错误时,BGP 发言人向对等发言人发送通知报文,并立即关闭相关的 TCP 连接。
- “错误代码”和“错误子代码”字段各占
1
个字节,指明了具体的错误类型。 - “数据”字段长度可变,内容依赖于错误代码和错误子代码,用于错误原因的诊断。结束位置由报文首部中的长度字段指明。
错误代码含义1报文首部错误2OPEN 报文错误3UPDATE 报文错误4保持时间超时5BGP 有限状态机错误6停止🕒 5. BGP 的路径属性
BGP结合丰富的路径属性,很好地控制路由信息的传递,实现路由的选择。
BGP路径属性是一组描述BGP前缀特性的参数
BGP路径属性可以被分为四大类:
- 公认必遵(Well-known mandatory)
- 公认任意(Well-known discretionary)
- 可选过渡(Optional transitive)
- 可选非过渡(Optional non-transitive)
BGP 必须识别所有公认属性。可选属性不要求所有BGP路由器都必须能识别。
公认属性包括强制和任意两大类:
- 其中强制属性必须包含在每一个UPDATE 消息里,即公认必遵属性。
- 其他任意属性则可能会被包含在某些具体UPDATE 消息中。
可选属性包括过渡和非过渡两大类:
- 其中对于过渡属性,如果BGP路由器不能识别该属性,也要接收携带该属性的路由更新,而且将该路由通告给其他对等体,也必须携带该属性。
- 对于非过渡属性,如果BGP路由器不能识别该属性,该路由器会忽略携带该属性的路由信息,也不通告给其他对等体。
常见BGP路由属性:
1、Origin
2、AS_PATH
3、Next hop
4、MED(Multi-Exit-DISC)
5、Local-Preference
6、Atomic-Aggregate
7、Aggregator
8、Community
9、Originator-ID
10、Cluster-List
11、MP_Reach_NLRI
12、MP_Unreach_NLRI
13、Extended_Communities
以下列出几种常用的属性:
- Origin:起源属性。定义路由信息的来源,标记一条路由是怎样成为BGP路由的。
- As_PATH:AS路径属性。是路由经过的AS的序列,即列出此路由在传递过程中经过了哪些AS。它可以防止路由循环,并用于路由的过滤和选择。
- Next hop:下一跳属性。包含到达更新消息所列网络的下一跳边界路由器的IP地址。
- MED属性:当某个AS有多个入口时,可以用MED属性来帮助其外部的AS选择一个较好的入口路径。一条路由的MED值越小,其优先级越高。
- Local-Preference:本地优先级属性。用于在AS内优选到达某一目的地的路由。反映了BGP Speaker对每条BGP路由的偏好程度。属性值越大越优。
- Community:团体属性。团体属性标识了一组具有相同特征的路由信息,与它所在的IP子网或自治系统无关。
属性名公认/可选必遵/任意过渡/非过渡Origin公认必遵—As_PATH公认必遵—Next hop公认必遵—Local-Preference公认任意—MED可选—非过渡Community可选—过渡🕘 5.1 origin 属性
该属性定义了BGP 路径信息源头,实际上也就是BGP Speaker 产生BGP 路由的方式。
有3 种起源属性值:IGP、EGP和Incomplete(不确定来源)。
某条路由是直接而具体的注入到BGP路由表中的,则origin属性为IGP
- 通过network命令注入BGP的路由
- 这些路由是有选择性地通过network 命令转换为BGP路由,所以称为“半动态”。
<RT2>
Total Number of Routes: 2
BGP Local router ID is 1.1.1.1
Status codes: * - valid, > - best, d - damped,
h - history, i - internal, s - suppressed, S - Stale
Origin : i - IGP, e - EGP, ? - incomplete
Network NextHop MED LocPrf PrefVal Path/Ogn
*> 18.0.0.1/32 0.0.0.0 1 0 i
*> 18.0.0.2/32 0.0.0.0 1 0 i
通过EGP学到的路由,则origin属性为EGP
- 这个属性在现实网络中将很难遇到,因为EGP 基本上已经退出了历史舞台。
其他情形下,Origin属性都为 Incomplete
- 通过import命令注入BGP的路由
<RT2>
BGP Local router ID is 1.1.1.1
Status codes: * - valid, > - best, d - damped, x - best external,
h - history, i - internal, s - suppressed, S - Stale
Origin : i - IGP, e - EGP, ? – incomplete
Total Number of Routes: 4
Network NextHop MED LocPrf PrefVal Path/Ogn
*> 18.0.0.1/32 0.0.0.0 1 0 ?
*> 18.0.0.2/32 0.0.0.0 1 0 ?
Origin属性值默认情况下不被任何路由器修改
IGP:在BGP 路由表中(用display bgp routing-table 查看)将会看到“i”的标识,通过network 命令宣告的路由,起点属性为IGP,此种方式也称为BGP 信息的半动态注入,network 命令所宣告的网络来自于IGP 协议(包括静态路由),这些路由是有选择性地通过network 命令转换为BGP路由,所以称为“半动态”。
EGP:在BGP 路由表中将会看到“E”的标识,通过将EGP 转化(import)成的BGP 路由将具备此属性,这个属性在现实网络中将很难遇到,因为EGP 基本上已经退出了历史舞台。
Incomplete:在BGP 路由表中将会有一个“?”标识,具备这种属性的路由是通过一些别的方式学到的,属于未知的不明确的状态,一般来说,是通过将IGP 或者静态路由引入(import)以后产生的。因为无条件地把IGP 路由信息引入到BGP 路由表可能会造成副作用,比如不要的或者错误的信息会漏(leak)进BGP 中,比如IGP 路由表中可能会包含很多仅仅用于AS 内部的专用地址或者未经注册的地址。除此以外,这样做还有可能造成BGP 路由表的动荡(因为BGP 的路由依赖于IGP 路由),对此问题BGP 提供了一个解决方案路由衰减(ROUTE DAMPENING),此处将不再讨论。
🕘 5.2 AS_PATH 属性
- 所谓AS_PATH,是指BGP 路由在传输的路径中所经历的AS 的列表
- AS200 内的关于网络18.0.0.0/8 的BGP 路由经AS200、AS300、AS400 到达AS100的AS_PATH 为(400 300 200)
- 经AS200、AS500 到达AS100 的AS_PATH 为(500 200)
- 这时BGP优先选择有较短AS_PATH 的BGP 路由(500 200)
- 如果在路由更新消息中发现自己所在的AS 号已经被包含在AS_PATH 属性中,将此路由信息丢弃。
- BGP 不会接收AS_PATH 属性中包含本AS Number 的路由,从而避免了AS 间产生环路的可能。
🕘 5.3 Next Hop 属性
- BGP 在向EBGP 邻居通告路由时,或者将本地发布的BGP 路由通告给IBGP 邻居时,下一跳属性是本地BGP 与对端连接的端口地址。
- 对于多路访问的网络(广播网或NBMA 网络),下一跳情况有所不同。
- BGP 在向IBGP 邻居通告从其他EBGP 得到的路由时,不改变路由的下一跳属性,而直接传递给IBGP 邻居。
🕘 5.4 Local-Preference 属性
假设Internet 上有这样两条路由:
- 210.52.83.0/24和210.52.82.0/24,而需求是使到网络83 的流量分布在到ISP1 的链路上,而到网络82 的流量分布在到ISP2 的链路上。
- RT5 分别有两个来源获得82 和83 路由,这样只需要在RT3 和RT4 上适当地对来源的属性进行修改,就可以达到目的。
- BGP 可以给路由附加一种称为本地优先级的属性,路由器接收到去往同一目的地的多条路由,可以根据本地优先级属性值的高低进行路由选举。
🕘 5.5 MED 属性
- MED是可选非过渡属性,是用于控制数据流怎样进入本AS
- MED值越小,链路越优先
- 这时候AS200 的管理者想达到以下目的,从AS100 来的到82 的数据流通过RT2 路由器到达,而从AS100 来的到83 的数据流通过RT1 到达。
- 在AS200 的边界路由器RT1 上,当向RT3 发布路由82 和83 时,给83 打上标记50,而给82 打上标记100。
- 在AS200 的边界路由器RT2 上,当向RT3 发布路由82 和83 时,给82 打上标记50,而给83 打上标记100。
🕘 5.6 Community 属性
- 团体是一组有相同性质的目的地址路由。目的就是将路由信息编组,通过组的标识决定路由传递的策略。
- 每个AS 的管理员都可以自己定义目的地址所属的团体
- 团体属性由一系列以32 位长度(4字节)为单位的数值所组成 - 保留的团体属性: - 0x00000000—0x0000FFFF- 0xFFFF0000—0xFFFFFFFF- 私有团体属性: - AS(2B):Number(2B)- 公认团体属性: - NO_EXPORT (0xFFFFFF01) - 路由器收到带有这一团体值的路由后,不应把该路由通告给一个联盟之外的对等体。- NO_ADVERTISE (0xFFFFFF02) - 路由器收到带有这一团体值的路由后,不应把该路由通告给任何的BGP 对等体。- NO_EXPORT_SUBCONFED (0xFFFFFF03) - 路由器收到带有这一团体值的路由后,可以把该路由通告给它的IBGP 对等体,但不应通告给任何的EBGP 对等体。
🕘 5.7 BGP路径选择过程
1.如果此路由的下一跳不可达,忽略此路由
2.评估Preferred-Value值,数值高的优先 (VRP5增加的新参数,指定对等体的首选值,数值越高越好 )
3.Local-Preference值最高的路由优先
4.聚合路由优先于非聚合路由
5.本地手动聚合路由的优先级高于本地自动聚合的路由
6.本地通过network命令引入的路由的优先级高于本地通过import-route命令引入的路由
7.评估AS路径的长度,最短的路径优先
8.比较Origin属性, IGP优于EGP,EGP优于Incomplete
9.选择MED较小的路由
10. EBGP路由优于IBGP路由
11. EBGP优先选择到BGP下一跳的IGP度量最低的路径
当以上全部相同,则为等价路由,可以负载分担
注:AS_PATH必须完全一致
当负载分担时,以下3条原则无效
13. 比较Cluster-List长度,短者优先
14. 比较Originator_ID(如果没有Originator_ID,则用Router ID比较),选择数值较小的路径
15. 比较对等体的IP地址,选择IP地址数值最小的路径
🕒 6. 路由重分布
- 在同一网络中,存在多协议并存的情况
- 为了有效地支持多种路由协议,在不同路由协议之间共享路由
路由重分布:将一种路由选择协议获悉的路由信息告知另一种路由选择协议
特点:
- 路由重分布既可以是单向也可以双向
- 通常只有自治系统边界路由器才能实现路由重分布
- 路由分布只能在同一种第三层协议的路由选择进程之间进行
存在问题:
- 路由回环
- 管理距离不同(次优路由)
- 路由信息不兼容(度量值不同)
- 收敛时间不一致
注意事项:
- 不要在同一网络重叠使用路由协议
- 多个边界路由器:使用单向重分布
- 单边界路由器:双向重分布
Router(config-router)#redistribute protocol [process-id] [metric metric-value] [metric-type type-value] [match {internal | external 1 | external 2}] [tag tag-value] [route-map map-tag] [weight weight] [subnet]
- protocol:源路由协议
- process-id:进程号
- metric:度量值
- metric-type: 一般用于ospf,默认type-2外部路由;如果type-value为1,即type-1外部路由
- match {internal | external 1 | external 2}]:只用在重分布到其他路由协议的OSPF中
- weight:重分布到BGP的路由中定义权重(0-65535)
- subnet:主要用于重分布到OSPF
🕘 6.1 实例
将ospf、静态、直连重分配到rip:
R(config)#router rip
R(config-router)#redistribute ospf 1 metric 1
R(config-router)# redistribute static metric 1
R(config-router)# redistribute connected metric 1
注:rip 以跳数作度量,最大为15 跳
将rip 、静态、直连重分配到ospf:
R(config)#router ospf 1
R(config-router)#redistribute rip metric 30 subnets
R(config-router)# redistribute static metric 100 subnets
R(config-router)# redistribute connected metric 100 subnets
注:subnets 参数为重分配子网,不加即只重分配主类地址
🕘 6.2 选择最佳路由
- 多路由协议的使用,产生两个或多个达到目的地的不同路由
- 选择最佳路由:管理距离、默认度量值
- 接受重分布的路由协议要将这些路由协议与自己的度量关联起来,让执行路由重分布的路由器被重分布的路由指定度量值/改变默认度量值
- 也可以改变路由协议的管理距离,改变最佳路由
🕤 6.2.1 改变管理距离
- 管理距离可以看做是一个可信度的度量
- 管理距离越小,协议的可信度越高
- 通过distance命令改变管理距离
路由选择协议管理距离路由选择协议管理距离直连接口0OSPF110静态接口1RIP120EIGRP90BGP20
可信度:直连路由>静态路由>BGP>EIGRP>OSPF>RIP
Distance命令:
distance weight [address mask [access-list-number | name]][ip]
- weight:实际的管理距离(10-255)
- address、mask:指定匹配的网络
- Access-list-number | name:入站更新报文的访问列表的编号/标准IP访问列表的名称
- ip:用于IS-IS协议
实例:
R(config)# router ospf 1
R(config-router)# network 172.16.0.0
R(config-router)# distance 255
R(config-router)# distance 110 192.168.31.0 0.0.0.255
🕤 6.2.2 改变默认度量值
默认度量值(种子度量值):路由重分布中,从外部重分布进来的路由的初始度量值
路由协议默认种子度量值RIP16(无穷大)EIGRP225(无穷大)OSPFBGP为1,其他为20IS-IS0BGPIGP的度量值
default-metric 指令实例:
R(config)# router rip
R(config-router)# default-metric 4
R(config-router)# redistribute ospf 100 //当OSPF路由重分布到RIP中,默认度量值为4
R(config)# router ospf 100
R(config-router)# default-metirc 10
R(config-router)# redistribute rip //当RIP路由重分布到OSPF中,默认度量值为10
🕒 7. 实验
设备名 端口 ip地址 掩码 AS ID R1f0/1 192.168.2.1255.255.255.065101f0/0 192.168.3.1255.255.255.0loopback0 1.1.1.1255.255.255.0R2f0/1192.168.3.2255.255.255.065101f0/0192.168.4.2255.255.255.0loopback0 2.2.2.2255.255.255.0R3f0/1192.168.1.3255.255.255.065100f0/0192.168.2.3255.255.255.0R4f0/1192.168.1.4255.255.255.065100R5f0/1192.168.4.5255.255.255.065102
注:R1和R2由于其位置的特殊性(既是IBGP对等体,又是EBGP对等体),因此都配置环回口,作为IBGP的对等体ID。
实验步骤:
一、基本配置
(1)配置所有路由器的接口IP
(2)打开接口
二、 配置RIP(以R1为例)
R1(config)#router rip
R1(config-router)#version 2
R1(config-router)#no auto-summary
R1(config-router)#network 192.168.2.0
R1(config-router)#network 192.168.3.0
R1(config-router)#network 1.1.1.0
R1(config-router)#passive-interface f0/1
注:RIP只作用在所在区域内,不得跨区域应用(这是BGP的功能),因此在边界处(如R1的f0/1、R2的f0/0)设置被动端口。
三、在R1和R2之间、R1和R3之间开启抓包
根据拓扑图,我们选出的IBGP有R1、R2、R3、R5,EBGP有R1、R2
四、在R1上配置BGP
# 启用 BGP路由协议
R1(config)#router bgp 65101# 配置BGP邻居,其中R2为IBGP对等体
R1(config-router)#neighbor 2.2.2.2 remote-as 65101
R1(config-router)#neighbor 2.2.2.2 update-source loopback0# 配置R3为EBGP对等体
R1(config-router)#neighbor 192.168.2.3 remote-as 65100# 路由重分布
R1(config-router)#redistribute rip
注:用loopback接口地址作为IBGP邻居标识时,必须指定邻居的更新源接口。
五、在R2上配置BGP
R2(config)#router bgp 65101
R2(config-router)#neighbor 1.1.1.1 remote-as 65101
R2(config-router)#neighbor 1.1.1.1 update-source loopback0
R2(config-router)#neighbor 192.168.4.5 remote-as 65102
R2(config-router)#redistribute rip
六、在R3上配置BGP
R3(config)#router bgp 65100
R3(config-router)#neighbor 192.168.2.1 remote-as 65101
R3(config-router)#redistribute rip
七、在R5上配置BGP
R5(config)#router bgp 65102
R5(config-router)#neighbor 192.168.4.2 remote-as 65101
R5(config-router)#redistribute rip
八、抓包分析
在wireshark的显示过滤器设置过滤条件:bgp,通过观察数据包分析BGP的工作机制
九、查看路由表、BGP路由表、BGP邻居路由器
R1#show ip route
R1#show ip bgp
R1#show ip bgp neighbors
❗ 转载请注明出处
作者:HinsCoder
博客链接:🔎 作者博客主页
版权归原作者 HinsCoder 所有, 如有侵权,请联系我们删除。