BGP------BGP工作原理、BGP属性及选路原则
BGP工作原理
一、BGP报文
1.open报文
作用:建立邻居、协商参数
open报文只在邻居建立时发送,不会周期发送
内容:
- version:BGP版本
- My AS:自身的AS号
- hold time:超时时间
- 180S,取最小的数值
- BGP Identifier:BGP的router id
- 拓展能力参数
- 多协议能力支持(Multiprotocol extensions capability)
- IPv4(主地址簇/AFI)
- 单播(子地址簇/sub AFI) 默认支持:ipv4-family unicast
- 组播(子地址簇/sub AFI)
- VPNV4(子地址簇/sub AFI)ipv4-family vpnv4 需要配置mpls vpn后会出现
- IPV6(主地址簇)
- 单播(子地址簇/sub AFI)
- IPv4(主地址簇/AFI)
- 路由刷新能力(Route refresh capability) 默认支持
- 是否支持4字节AS号(Support for 4-octet AS number capbility) 华为设备默认支持
- ORF出方向路由过滤 (需要手工配置)
- 多协议能力支持(Multiprotocol extensions capability)
影响BGP邻居建立的因素
1.version需一致
2.My AS:收到报文中的My AS与在BGP进程下配置的该peer的as-number一致
3.BGP Identifier不能一致
4.扩展能力参数
- IPv4(主地址簇/AFI)需一致
- 路由刷新能力不影响
- 4字节AS号不影响
5.认证
2.keepalive报文
作用: 维护邻居关系,用于对open报文的确认
发送间隔:60S 超时时间:180S
HOLD TIME时间决定keepalive报文的存活时间
3.update报文
作用:BGP路由更新报文,用以更新BGP路由信息 或者 撤销BGP路由信息
携带丰富的路径属性描述路由(origin、AS path等)
发送方式:
-
邻居建立成功后
-
触发更新:network、import路由进入BGP
-
收到路由刷新报文(router refresh报文)
携带:
- 更新路由时,使用NLRI(网络层可达信息)字段携带路由
- 携带路径属性
- 撤销路由时,使用 withdraw routes携带撤销的路由
- 撤销路由时不携带任何路径属性
5.route-refresh报文
作用:用于请求邻居再次发送update报文
路由刷新报文用在当改变路由策略后请求邻居重新发送相关路由信息
refresh bgp all export/import
##export:发送update报文
##import:发送router refresh报文,请求邻居的update报文
route-refresh报文只有在输入以上命令后,才会发送
6.notification报文
作用:用于告警,断开邻居关系、TCP连接
当BGP路由器检测错误信息,会向邻居发出notification,立即中断TCP连接
组成:
- 错误代码 + 错误子代码组成
- 错误代码2:open报文错误
- 错误子代码2:peer as号错误
二、BGP状态机
1.idle
-
初始状态
-
拒绝所有TCP连接
-
等待start事件(配置peer命令)
- start事件:peer x.x.x.x as-number x
- 由开始start事件路由器先发起TCP连接,进入下一个状态connect状态
2.connect
- 启动连接重传定时器,等待TCP完成连接
- 如果连接成功,向对等体发送open报文,转至opensent状态
- 如果连接失败,进入active状态
- 如果连接重传定时器超时(32s),对等体没有回应,继续尝试。停留在connect状态
3.active
- 重新发起TCP连接,启动连接重传定时器
- 如果连接成功,像对等体发送open报文,转至opensent状态
- 如果连接失败,停留在active状态
- 如果连接重传定时器超时,对等体没有回应,转至connect状态
4.opensent
- 发出open报文后进入该状态
- 收到open报文,进行open报文参数的协商
- 参数协商正常,向对等体发送keepalive报文,转至openconfirm状态
- 参数协商失败,向对等体发送notification报文,转至idle状态
5.openconfirm
- 发出keepalive报文后进入该状态,对邻居的open报文进行确认
- 等待邻居的keepalive报文,需要在5s内收到
- 收到keepalive报文,转至established状态
- 收到notification报文,转至idle状态
6.established
- 邻居建立成功
- 发送update报文
- 可以和对等体交换update、keepalive、route-refresh、notification报文
- 收到正确的update或keepalive报文。运行正常、保持TCP连接
- 收到错误的update或keepalive报文。发出notification报文通知对等体,进入idle状态
- 收到notification报文,将进入idle状态
- 收到TCP拆链通知。断开TCP连接 。进入idle状态
- route-refresh报文不会改变BGP状态
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-oy7sivn9-1616912237027)(E:\HCIE R&S\HCIE\2020.2.1 BGP基础\bgp状态机.png)]
- 常见状态机
- idle
- active
- established
三、BGP路由产生方式
1.network
是逐条将IP路由表中已经存在的路由引入到BGP路由表中
注意:
-
被network的路由必须是路由表中存在的
-
转换时,必须与路由表的 前缀+掩码 完全匹配
bgp 100
network 5.5.5.5 32
2.import
根据运行的路由协议(RIP,OSPF,ISIS等)将路由引入到BGP路由表中,同时import命令还可以引入直连和静态路由
bgp 100
import-route direct
如果一条路由同时被network方式和import方式引入,优选network方式
BGP的路由标识
- “*”:标识为有效路由
- “>":标识为最优路由
- i:表示为通过network的方式产生
- ?:表示为通过import的方式产生
- BGP的路由优先级为255
- network的路由只要存在在路由表中即可转换,并非要求是设备本身的路由
四、BGP数据库
1.IP路由表(IP-RIB)
全局路由信息库,包括所有IP路由信息
display ip routing-table
2.BGP路由表(Loc-RIB)
BGP路由信息库,存放从所有邻居收到的以及本路由器产生的BGP路由,包含最优和非最优
display bgp routing-table ##查看IPV4的单播路由
display bgp vpnv4 all routing-table ##查看IPV4的VPN路由
display bgp ipv6 routing-table ##查看IPV6的单播路由
3.邻居表
BGP对等体邻居清单列表以及显示邻居的状态机
display bgp peer ##查看IPV4的单播邻居
display bgp vpnv4 all peer ##查看IPV4的VPN邻居
display bgp ipv6 peer ##查看IPV6的单播邻居
4.Adj-RIB-In
对等体宣告给本地BGP Speaker的未处理的路由信息库,未经入方向的策略
##查看来自邻居x.x.x.x的路由信息
display bgp routing-table peer X.X.X.X received-routes
##用于in方向路由策略发生变化时,刷新本路由器的路由
refresh bgp all import
5.Adj-RIB-Out
本地BGP Speaker宣告给指定对等体的路由信息库,已经经过出方向路由策略
##查看要发完邻居x.x.x.x的路由信息
display bgp routing-table peer X.X.X.X advertised-routes
##用于出方向路由策略发生变化时,刷新宣告给邻居的路由
refresh bgp all export
BGP路由信息处理
1.接收来自对等体的更新路由信息,存储到路由选择信息库(Routing Information Base, RIB)中,并指明是来自哪个对等体的(Adj-RIB-In)。
2.这些更新数据包被输入策略引擎过滤后,路由器将会执行路径选择算法,来为每一条前缀确定最佳路径
3.得出的最佳路径被存储到本地BGP RIB (Loc-RIB)中,然后被提交给本地IP路由选择表(IP-RIB)
除了从对等体接收来的最佳路径外,Loc-RIB也会包含当前路由器注入的(被称为本地发起的路由),并被选择为最佳路径的BGP前缀
4.Loc-RIB中的内容在被通告给其他对等体之前,必须通过输出策略引擎过滤。只有那些成功通过输出策略引擎的路由,才会被安装到输出RIB (Adj-RIB-Out)中
输入策略引擎、输出策略引擎通过配置route-policy然后在peer相应邻居时调用
五、BGP通告原则
四条通告原则
1.只将最优路由传递给邻居
最优路由标识符:*、>
*:有效路由
- 成为有效路由的条件
- 下一跳地址可达
- 如果开启同步,必须满足同步条件
- 路由的前缀和路由的下一跳地址不能一致
“>”:最优路由
BGP默认情况下不会存在负载,如果收到多条相同路由,只会选出最优的一条
- 成为最优路由的前提:
- 路由必须有效
- 如果存在多条来自不同BGP邻居的相同路由,根据选路规则进行比较、选出最优路由
路由必须是 有效路由(*) + 最优路由(>) 才能传递
2.通过EBGP学习的最优路由发送给所有BGP邻居
发送给EBGP邻居,改变路由下一跳为自身与对等体建立邻居关系的更新源地址
发送给IBGP邻居,下一跳不变
-
为什么不改变下一跳
- 将每个AS都看成一个大的路由器
- 避免次优路径
-
可能会出现下一跳不可达,成为无效路由,无法传递
-
解决方案
-
使用IGP或者静态路由使下一跳可达(该路由器的路由表中存在相关下一跳的路由信息)
-
修改下一跳(在源主机上)
-
bgp 200 peer 4.4.4.4 next-hop-local ##修改路由为本地更新源地址(针对特定邻居) ##将EBGP路由发送给邻居4.4.4.4时改变更新源地址为自身
-
-
-
3.通过IBGP学习的最优路由不发布给其他IBGP邻居
主要为了避免AS内环路现象(水平分割)
- 水平分割:不将从对等体学习到的路由再发送回对等体
- 百度百科上的解释是:水平分割法的规则和原理是,路由器从某个接口接收到的更新信息不允许再从这个接口发回去
- 水平分割防止了控制层面的环路
带来的问题
- AS内某些路由器无法学习路由
解决方法
1.全互联建立IBGP邻居关系(不推荐)
2.配置反射器(RR)
-
反射器(打破水平分割)
-
将R3配置为反射器,R2、R4分别与R3建立邻居关系,并且R3上配置反射器
-
peer 2.2.2.2 reflect-client
-
-
反射规则:非非不传
- 从EBGP邻居得到的路由,路由反射器会反射给所有的客户机和非客户机
- 从路由反射器得到的路由,路由反射器会反射给所有客户机和非客户机
- 从客户机得到的路由,路由反射器会反射给所有的客户机和非客户机
- 从非客户机的达到的路由,路由反射器会反射给所有客户机
3.配置联盟
4.BGP与IGP的同步
从IBGP邻居学习到的路由,在IGP中也要学习到,否则路由无效
同步规则是用以解决路由黑洞的
R1、R2建立EBGP邻居,R2、R4建立IBGP,R4、R5建立EBGP
没有开启BGP与IGP同步的情况下
R1身上的10.0.0.0/24路由信息成为BGP路由后,传递给R2、R4、R5,路由信息传递无问题
当R5要访问R1 10.0.0.0/24网段时,数据经过R4到达到达R3,在R3身上会出现问题,因为R3身上并没有10.0.0.0/24网段的路由信息,会丢弃该数据包
- 路由黑洞
- 设备路由表存在最优有效路由,但是无法访问
同步规则默认不开启,同步规则影响路由传递出现
- 如果要满足同步的条件,往往需要将大量的BGP路由引入到IGP协议,会对AS内部的路由器造成很大的负担
没有同步规则的情况下该如何解决路由黑洞
-
在数据所经设备都开启BGP协议
-
将部分的BGP路由引入到IGP(通过路由控制)
- 默认情况下IBGP路由不允许引入到IGP中,主要是为了避免环路现象
-
使用MPLS,即使中间路由器没有路由,数据包也根据标签转发
-
Route recursive-lookup tunnel ##下一跳迭代进隧道
-
六、BGP的路径属性
作用:选择最优路由、防环
四大属性
属性 | 特性 | 对应的BGP属性 |
---|---|---|
公认必遵 | 所有BGP路由器都可以识别这一属性,在更新路由条目时update报文一定携带 | origin、as-path、net-hop |
公认任意 | 所有BGP路由器都可以识别这一属性,在更新路由条目时update报文不一定携带 | local_pref、atomic_aggregate |
可选过渡 | 所有BGP路由器不一定能识别这一属性,不识别也能将这一属性通告出去 | community、aggregator |
可选非过渡 | 所有BGP路由器不一定能识别这一属性,不识别就不会将这一属性通告出去 | MED、cluster_list、orginator_ID |
介绍几种常用的属性
1.Origin:
起源属性,表示一条路由如何成为BGP路由
-
用于控制选路(i>e>?)
- i:network
- ?:import
- e:早期EGP路由
-
###配置举例 ##1匹配路由 ip ip-prefix ori index 10 permit 40.1.1.1 32 ##2配置路由策略 route-policy ori permit node 10 if-match ip-prefix ori apply origin incomplete ##后缀改为? # route-policy ori permit node 20 ##放通所有,默认为拒绝所有 ##3针对邻居调用 BGP 100 peer 1.1.1.1 route-policy ori export
2.AS_Path
用来标识BGP路由所经过的AS号,BGP路由表AS列表最左的为相邻的AS号,最右边为起始AS号
①AS_Sequence:默认,按矢量顺序记录路由所经过的所有AS编号;
②AS_Set:BGP路由聚合时,无序还原路由所经过的所有AS编号;
③AS_Confed_Sequence:应用于联盟,在联盟内传递路由,按矢量顺序记录路由所经过的所有AS编号;
④AS_Confed_Set:应用于联盟,在联盟内BGP路由聚合时,无序还原路由所经过的所有AS编号。
-
有序记录经过AS号
- 路由发送给EBGP邻居时,才添加本AS号到AS-path
-
用于AS间防环
- 不接收AS-path当中包含自AS号的路由
-
用于选择最优路由(控制选路)
- 每个AS号计数为1,AS-path越短越优
-
###配置举例 ##1匹配路由 ip ip-prefix ori index 10 permit 41.1.1.1 32 ##2配置路由策略 route-policy as permit node 10 if-match ip-prefix 41 apply as-path 200 200 additive # route-policy as permit node 20 ##3针对邻居调用 BGP 200 network 41.1.1.1 255.255.255.255 peer 10.1.24.2 route-policy as export
注意:在使用增加AS号来控制选路时,一般是增加路由起源AS域的AS号
- 如果增加的是网络中其他的AS号,会导致其他的AS收不到改路由(防环机制);
- 如果添加的是网络中不存在AS号,可以添加但是不建议,考虑到后期拓展性
3.Next_hop
- 用于生成BGP路由的下一跳
- 在本地路由表上默认显示
- 自身产生的路由:0.0.0.0
- 汇总产生的路由:127.0.0.1
- 邻居发送的路由:邻居的更新源地址
默认情况下,
本地始发BGP路由发送给IBGP邻居下一跳不变,
从IBGP学习的BGP路由发送给EBGP邻居下跳变为本地更新源地址
从EBGP学习的路由发送给IBGP邻居下
peer x.x.x.x next-hop-invariable ##发送给邻居x.x.x.x的路由下一跳不变
peer x.x.x.x next-hop-local ##发送给邻居x.x.x.x的路由下一跳为本地更新源地址
PrefVal
-
华为设备的特有属性
-
仅在本地有效
-
不会传递给BGP邻居。因为协议首选值是人为主动设置的,代表本地用户的意愿,因而在BGP进行选路时会优先比较协议首选值
-
默认为0
5.Local_Pref
用于判断流量离开AS时的最佳路由 (也可以说判断进入AS路由的最优方式)
用于选择最优路由
-
仅在本AS内部有效(IBGP对等体之间有效)
-
默认100,越大越优,范围:0-2^32
-
配置时,在路由进入本AS时添加(即从EBGP接收时)
AS100内,R1,R2和R3之间分别两两建立IBGP对等体关系
R2和R3分别和位于AS200和AS300的路由器建立EBGP对等体关系
这样路由器R2和R3都会从自己的EBGP对等体收到10.0.0.0/24这条路由
为了让AS100内的三台路由器优选R2作为10.0.0.0/24这条路由在本AS的出口
我们只需要在R2和R3在接收10.0.0.0/24路由时,对该路由的Local Pref属性进行修改,就可以达到目的
7.MED
类似于IGP的cost
用于判断流量进入AS时的最佳路由
用于选择最优路由
- 只在邻居的AS内有效
- 默认为0,越小越优
- 配置时在本AS发出路由时添加
R1和R2将网段10.0.0.0/24传递给各自的EBGP邻居R3和R4
R3和R4在其他条件相同的情况下,优先选择MED值较低的路径
即均选择经由R1访问网络10.0.0.0/24
##允许BGP比较属于任意AS的EBGP对等体的路由的MED值
compare-different-as-med
8.Community
分为基本团体属性和拓展团体属性
①基本团体属性
- 自定义团体属性
- 功能:标记路由,方便为相同特性路由做统一处理(类似IGP的tag)
- 格式:NN:MM 100:100、200:200、300:300
- 公认团体属性
- internet:缺省属性,所有路由都属于Internet,此属性的路由可以通告给所有的BGP邻居
- no-advertise:收到该属性的路由,不会将这条路由发布给其他的BGP邻居
- no-export:收到该属性的路由,不会将路由发布到其他的AS
- no-export-subconfed:在联盟中使用,不传出联盟内的第三个AS
实验配置
针对R4身上的loopback 42接口:42.1.1.1/32,在发送给R2是打上团体属性200:100##1.R4上创建loopback 42 interface loopback 42 ip address 42.1.1.1 32 ##2.匹配路由 ip ip-prefix 42 permit 42.1.1.1 32 ##3做策略 route-policy tag permit node 10 if-match ip-prefix 42 apply community 200:100 # route-policy tag permit node 20 ##4bgp对应邻居调用 bgp 200 peer 10.1.24.2 route-policy tag export peer 10.1.24.2 advertise-community
R2上针对42.1.1.1这条路由修改其本地优先级
因为配置了团体属性,这里匹配42.1.1.1/32路由时有两种方法,一是直接匹配路由、二是匹配团体属性
匹配团体属性使用ip community-filter工具
##1匹配路由 ip community-filter 1 permit 200:100 ##2做策略 route-policy local permit node 10 if-match community-filter 1 apply local-preference 90 # route-policy local permit node 20 ##3对应邻居调用 bgp 100 peer 10.1.24.4 route-policy local import
②拓展团体属性
- MPLS VPN中使用的RT、RD值
七、BGP选路原则
当到达同一目的地存在多条路由并且下一跳可达时,BGP依照如下策略顺序进行路由选择
-
优选Preference_Value值最高的路由(私有属性,仅本地有效)
-
优选本地优先级(Local_Preference)最高的路由
-
优选手动聚合>自动聚合>network>import>从对等体学到的
- 本地产生>从邻居学习
-
优选AS_Path短的路由
- AS_Path的长度不包括AS_CONFED_SEQUENCE和AS_CONFED_SET
- AS_SET的长度为1,无论AS_SET中包括多少AS号
-
起源类型IGP>EGP>Incomplete
-
对于来自同一AS的路由,优选MED值小的
-
优选从EBGP学来的路由(优先级 EBGP=20>IBGP=200)
-
优选AS内部IGP的Metric最小的路由(比较路由的next_hop)。---优选设备去往BGP路由下一跳IGP cost小的
如果前面八条都无法比较出来,可以开启负载
maximum load-balancing 2 ##针对EBGP/IBGP路由的最大负载均衡路径为2 maximum load-balancing ibgp 2 ##只针对IBGP路由的最大负载均衡路径为2 maximum load-balancing ebgp 2 ##只针对EBGP路由的最大负载均衡路径为2
如果BGP进行开启负载分担,只会在IP 路由表显示负载分担,BGP 路由表依旧只会选择一条最优的路由给BGP邻居,即根据下面几条规则继续比较
-
优选Cluster_List最短的路由。(反射器场景才比较)
-
优选Orginator_ID最小的路由。(反射器场景才比较)
或者优选Router_ID最小的路由器发布的路由 -
优选具有较小IP地址的邻居学来的路由