目录
bgp的基础知识
bgp出现的背景,应用场景:
1.总公司要和分公司相互通信,总公司在北京,分公司在天津,他们属于不同的as,这时候就需要用到bgp
2.运营商骨干网络
3.数据中心或者大型政企单位
注:as(自治系统)内部的称为ibgp,不同as之间的称为ebgp
ibgp:内网网关路由协议 内部使用的协议是isis ospf rip
ebgp:外部网关路由协议,在不同公司之间,城市之间 使用的协议只有bgp
为什么使用bgp协议:
1.他可以让不同的as之间通信
2.可以传递大量的路由(百万为单位)
3.非常的稳定
4.具有很多的路由控制策略,可以灵活的选路
bgp概述:
是应用层协议,基于tcp协议,所以很稳定,端口号是179
注:OSPF基于IP协议,为了可靠性,数据库同步:协商主从关系,序列号、有确认机制
bgp的作用:
可以传递大量的路由,以百万为单位
基于tcp协议(三次握手 四次挥手)非常的稳定
具有很多的路由控制策略,可以进行灵活的选路
bgp的报文和状态
bgp报文:
open报文:用于建立bgp邻居(hello报文)
keepalive报文:用于维护邻居关系(hello报文)
update报文:用于传递和撤销bgp路由条目(lsu报文)
notification报文:用于传递bgp报错信息
refresh报文:用于重传路由
bgp的状态:
idle:最开始的状态,tcp连接并未建立
connect:tcp连接正在进行,如果连接失败会转变为active状态,成功会变成opensent状态
active:tcp连接仍然在尝试,仍然失败还是active状态 如果超时,会变为connect状态,如果成功会变为opensent状态
opensent:open报文已发送状态
已向邻居发送open报文,如果收到邻居的回复报文,且报文正确,则会继续发送keepalive报文,然后会转变为opencomfirm状态,如果回复的报文错误,将会发送notification报文,告知对方,发送的报文错误,然后断开连接 回到idle状态
open comfirm : open报文确认状态
如果收到邻居发来的keep alive 报文,状态会转为established 建立状态
如果收到邻居发来的notification 报文,状态会跳转为 idle 状态
establish:完全建立连接
工作过程:
建立邻居---传递路由
注:bgp只传递路由 而不产生路由,ospf isis这些在ibgp里面才是生产最优路由
bgp单区域配置
拓扑图
需求:使用bgp实现互联
配置:
R1:
bgp 100 //进入AS100
router-id 1.1.1.1 //设置router-id
peer 192.168.12.2 as-number 100 //指定邻居的IP地址与邻居所在的AS号
R2:
bgp 100
router-id 2.2.2.2
peer 192.168.12.1 as-number 100
R1:将路由表中的路由条目搬进BGP路由表发送给邻居
bgp 100
network 192.168.1.0 24
R2:
bgp 100
network 192.168.2.0 24
ibgp全互联
拓扑图:
需求:实现全互联,bgp不同as号之间通信
配置:
第一步: 配置R4
R4的配置:
1)配置R4的接口IP地址
[R4]int g0/0/0
[R4-GigabitEthernet0/0/0]ip add 192.168.14.4 24
[R4-GigabitEthernet0/0/0]int lo0
[R4-LoopBack0]ip add 10.10.4.4 24
[R4-LoopBack0]quit
2)配置R4和R1的EBGP,并注入路由
[R4]bgp 100 //打开bgp功能,进入as100
[R4-bgp]router-id 4.4.4.4 //配置router-id
[R4-bgp]peer 192.168.14.1 as 200 //和R1建立EBGP邻居关系
[R4-bgp]network 10.10.4.0 24 //把已经存在的直连路由注入到BGP路由表
第二步: 配置R1
1)配置R1的接口IP地址
[R1]int g0/0/0
[R1-GigabitEthernet0/0/0]ip add 192.168.14.1 24
[R1-GigabitEthernet0/0/0]int g0/0/1
[R1-GigabitEthernet0/0/1]ip add 192.168.12.1 24
[R1-GigabitEthernet0/0/1]int lo0
[R1-LoopBack0]ip add 10.10.1.1 24
[R1-LoopBack0]quit
2)配置R1的ospf
[R1]ospf 1 router-id 1.1.1.1
[R1-ospf-1]area 0
[R1-ospf-1-area-0.0.0.0]network 192.168.12.0 0.0.0.255
[R1-ospf-1-area-0.0.0.0]network 10.10.1.0 0.0.0.255
[R1-ospf-1-area-0.0.0.0]quit
[R1-ospf-1]quit
3) 配置R1和R4建立外部邻居-EBGP邻居
[R1]bgp 200
[R1-bgp]router-id 1.1.1.1
[R1-bgp]peer 192.168.14.4 as 100
4) 配置R1和R3建立内部邻居-IBGP邻居
[R1-bgp]peer 10.10.3.3 as 200 //R1和R3建立IBGP邻居
[R1-bgp]peer 10.10.3.3 connect-interface LoopBack 0 //R1使用loopback接口和R3建立邻居
[R1-bgp]peer 10.10.3.3 next-hop-local
//R1在给R3传递路由的时候会修改路由的下一跳地址为R1的本地地址(也就是10.10.1.1)
5)配置R1和R2建立内部邻居-IBGP邻居-为了解决路由黑洞问题
[R1-bgp]peer 10.10.2.2 as 200
[R1-bgp]peer 10.10.2.2 connect-interface LoopBack 0
[R1-bgp]peer 10.10.2.2 next-hop-local
第三步:验证一下:
========================================================================
验证结果:
<R4>display bgp peer //R4和R1是好邻居
<R1>display bgp peer //R1和R4是好邻居
<R4>display bgp routing-table //R4中注入了路由,并且是最优的
Total Number of Routes: 1
Network NextHop MED LocPrf PrefVal Path/Ogn
*> 10.10.4.0/24 0.0.0.0 0 0 i
<R1>display bgp routing-table //从EBGP邻居学来的路由是最优的
Total Number of Routes: 1
Network NextHop MED LocPrf PrefVal Path/Ogn
*> 10.10.4.0/24 192.168.14.4 0 0 100i
=============================================================================
第四步: 配置R2
R2的配置:
1) 配置R2的接口IP地址:
[R2]int g0/0/0
[R2-GigabitEthernet0/0/0]ip add 192.168.12.2 24
[R2-GigabitEthernet0/0/0]int g0/0/1
[R2-GigabitEthernet0/0/1]ip add 192.168.23.2 24
[R2-GigabitEthernet0/0/1]int lo0
[R2-LoopBack0]ip add 10.10.2.2 24
[R2-LoopBack0]quit
2)配置R2的ospf:
[R2]ospf 1 router-id 2.2.2.2
[R2-ospf-1]area 0
[R2-ospf-1-area-0.0.0.0]network 192.168.12.0 0.0.0.255
[R2-ospf-1-area-0.0.0.0]network 192.168.23.0 0.0.0.255
[R2-ospf-1-area-0.0.0.0]network 10.10.2.0 0.0.0.255
[R2-ospf-1-area-0.0.0.0]quit
[R2-ospf-1]quit
3)配置R2的BGP-R2和R1/R3分别建立IBGP邻居关系:
[R2]bgp 200
[R2-bgp]router-id 2.2.2.2
[R2-bgp]peer 10.10.1.1 as 200
[R2-bgp]peer 10.10.1.1 connect-interface LoopBack 0
[R2-bgp]peer 10.10.3.3 as 200
[R2-bgp]peer 10.10.3.3 connect-interface LoopBack 0
第五步: 配置R3
1)配置R3的接口
[R3]int g0/0/0
[R3-GigabitEthernet0/0/0]ip add 192.168.23.3 24
[R3-GigabitEthernet0/0/0]int g0/0/1
[R3-GigabitEthernet0/0/1]ip add 192.168.35.3 24
[R3-GigabitEthernet0/0/1]int lo0
[R3-LoopBack0]ip add 10.10.3.3 24
[R3-LoopBack0]quit
2) 配置R3的OSPF
[R3]ospf 1 router-id 3.3.3.3
[R3-ospf-1]area 0
[R3-ospf-1-area-0.0.0.0]network 192.168.23.0 0.0.0.255
[R3-ospf-1-area-0.0.0.0]network 10.10.3.0 0.0.0.255
[R3-ospf-1-area-0.0.0.0]quit
3)配置R3和R2建立IBGP邻居关系
[R3]bgp 200
[R3-bgp]router-id 3.3.3.3
[R3-bgp]peer 10.10.2.2 as 200
[R3-bgp]peer 10.10.2.2 connect-interface LoopBack 0
[R3-bgp]peer 10.10.2.2 next-hop-local
4)配置R3和R1建立IBGP邻居关系
[R3-bgp]peer 10.10.1.1 as 200
[R3-bgp]peer 10.10.1.1 connect-interface LoopBack 0
[R3-bgp]peer 10.10.1.1 next-hop-local
5)配置R3和R5建立EBGP邻居关系
[R3-bgp]peer 192.168.35.5 as 300
第六步: 配置R5
R5的配置:
1)配置R4的接口IP地址
[R5]int g0/0/0
[R5-GigabitEthernet0/0/0]ip add 192.168.35.5 24
[R5-GigabitEthernet0/0/0]int lo0
[R5-LoopBack0]ip add 10.10.5.5 24
[R5-LoopBack0]quit
2)配置R5和R3的EBGP,并注入路由
[R5]bgp 300
[R5-bgp]router-id 5.5.5.5
[R5-bgp]peer 192.168.35.3 as 200
[R5-bgp]network 10.10.5.0 24
第七步:验证
1)查看R1-R2-R3的ospf 邻居关系
<R1>display ospf peer brief
<R2>display ospf peer brief
<R3>display ospf peer brief
2)查看R1/R2/R3/R4/R5的BGP邻居关系
<R1>display bgp peer
<R2>display bgp peer
<R3>display bgp peer
<R4>display bgp peer
<R5>display bgp peer
3)查看R1/R2/R3/R4/R5的BGP路由表
<R1>display bgp routing-table
<R2>display bgp routing-table
<R3>display bgp routing-table
<R4>display bgp routing-table
<R5>display bgp routing-table
4)验证网络连通性
<R4>ping -a 10.10.4.4 10.10.5.5
注:
这里小主 就将命令和验证方式都放在这里了
1.bgp只会将最好的路由传递给邻居
2.为什么建议使用loopback建立邻居:loopback接口永远不会down,有一条线路完好的时候,loopback接口都可以使用
更新源机制
-当使用逻辑接口,建立IBGP时,需要考虑,更新源检查机制
-R1和R3建立IBGP邻居关系时,如果是使用loopback 接口建立邻居关系,就要告诉路由器使用loopback接口的IP地址,封装BGP报文,不然他是会用上面的接口地址进行发送,我们用loopback接口就会失败(抓包即可看到)
配置:
[R1-bgp]peer 10.10.3.3 as 200 //R1和R3建立IBGP邻居
[R1-bgp]peer 10.10.3.3 connect-interface LoopBack 0 //R1使用loopback接口和R3建立邻居
修改下一跳
BGP路由器从外部邻居-EBGP邻居哪里学来的路由,在传递给自己的内部邻居-IBGP邻居时,默认不修改下一跳地址,会保持路由的下一跳地址不变,下一跳不改变,会导致路由实效
配置:
[R1]bgp 200
[R1-bgp]peer 10.10.3.3 next-hop-local
//R1在给R3传递路由的时候会修改路由的下一跳地址为R1的本地地址(也就是10.10.1.1)
bgp的通告原则
BGP通告原则之一 : 仅将自己最优的路由发布给邻居
说人话:BGP路由器只会将自己认为最好的路由传递给自己的邻居
BGP通告原则之二 : 通过EBGP获得的最优路由发布给所有BGP邻居
说人话:从外部邻居学来的路由,会传递给自己所有的邻居
BGP通告原则之三 : 通过IBGP获得的最优路由不会发布给其他的IBGP邻居
说人话:BGP路由器从内部邻居学来的路由不会再传递自己的内部邻居 这叫内内不相传:也就是传说中的 IBGP水平分割
为什么IBGP要这么搞,防止路由环路
但是我们要他互联互通,就要解决水平分割,这里介绍三种解决办法:ibgp全互联(上面介绍就是),路由反射器,路由联盟
路由反射器
反射器角色:客户机/非客户机/路由反射器rr
原理:
客户机只需要与反射器建立IBGP邻居,客户机之间不需要建立邻居,减少了邻居关系的数量,通过RR将自身学习到的路由反射给邻居,实现路由的传递;
反射器通过命令指定自己的客户弃,客户机不知道谁是反射器,只有反射器知道谁是客户机,没有指定为客户机的路由器,就是非客户机
反射器打破了水平分割的限制,让IBGP邻居之前路由可以传递,不需要改变原有拓扑结构,配置简单,较为常用
反射的原则:
RR从客户学到的路由,会反射给客户和非客户
RR从非客户学到的路由,会反射给客户
RR从EBGP邻居学到的路由,会反射给客户机和非客户机
RR从非客户机学到的路由不会在反射给非客户机,(非非不反射)
拓扑:
配置(就相当于配置反射器不需要配置更新源检测机制,不需要修改下一跳,指定客户机即可实现全互联):
r2上面的配置:
peer 10.10.1.1 reflect-client //指定R1为我的客户机
备注:如果配置下面这条命令:
peer 10.10.3.3 reflect-client //代表指定R3为我的客户机
如果没有配置这条命令: 代表,R3是我的非客户机
注:十分推荐,工作里用的最多的也是反射器
bgp联盟
概念:
将一个大的as号分割成多个小的as号,对外呈现的是大的as号,对内呈现的是子as号
原理:
子AS内部如超出3台路由器,依然有水平分割限制,在子AS内也可以配置路由反射器
联盟配置复杂,需要所有路由器都支持该功能,适合特别大的网络
拓扑:
配置有点多,我把他打包成文档在文章的开头,如果有需要就自取
bgp选路
公认必遵:所有bgp设备都要认识这个属性,这些属性都在update报文,如果不存在,就会存在路由错误,例如:as-path origin next-hop
公认任意:这类属性不一定在update报文里面,可以在也可以不在,例如:local-pref(当地优先级)
可选过渡:bgp设备可以认识也可以不认识,如果不认识会接受,将会传递给邻居,例如:community(团体属性)
可选非过渡:bgp设备可以认识也可以不认识,如果认识会忽略这个属性,并且不会传递给邻居
例如:med值(开销值)
bgp选路的原则
第一个:丢弃下一跳不可达的路由
然后进行选路:
1、比较“协议首选值-pref-val”属性,数值越大越好,默认值是0,只在本设备生效,不会传递(华为设备私有的)
2、比较“本地优先级-local_pref”属性,数值越大越好,默认值是100
3、比较“as-path” 属性-as号越短越好
4、比较“起源属性”-指的是已什么方式注入进BGP协议的
5、比较“MED”属性,指的是一个路由器去往一个BGP路由网段的距离,类似cost