之前学的ospf和isis都是igp都是用来计算路由,选一条最优路径
bgp只负责路由传递
小疑问?为啥bgp这么好,当初设计ospf的人不用tcp作为网络协议 ??
因为tcp是面向连接的,假如已经有tcp了,就不需要ospf邻居自动发现了。
能建立tcp连接,就说明早就已经知道邻居IP地址了,那还要ospf自动发现邻居关系干嘛,手动建算了
bgp:职业传递路由
大规模路由传递,上bgp
bgp很好很稳,但是用bgp需要AS,而AS号是要钱的,蛮贵的
小问题?AS之间用bgp是因为,传递的路由量大,那为啥在AS内部还要用bgp呢??
假设,AS内部不做bgp,那么AS内部的运行的是ospf协议,AS外面的是bgp协议,那么两个协议传递路由的时候,需要做路由引入。将AS外部的bgp引入到ospf,再将ospf路由引入回BGP。。
此时就会产生之前,我们学路由引入时的问题:环路、次优路径等。。
那么bgp此时就没有存在的意义了,所以为了保留bgp的一些属性(优势),在AS内部也会做bgp。
以前学习igp的时候,一般我们看前缀、掩码、开销、优先级
但是bgp有很多很多属性特性
一般电信。移动、联通这些用的AS都是共有AS。
企业内部用AS,用的一般为私有AS。
bgp虽然好,但不是所有场景都适合bgp的
1)bgp传递大量的路由,所以对设备有一定要求。如果设备不太行,不建议使用,风险太大。
2)访问AS外部,是单出口、单链路的情况下不要用bgp(无选路不要用bgp)。以为一条链路去访问,不需要选路,直接一条静态路由,OK了。
3)管理员技术有限
假如公司花了很多钱,提高公司网络的效率,技术人员把bgp也配好了,也通了。但是由于配置不完善,导致原本不该本公司处理的数据,跑到链路上来,就很浪费资源,也浪费钱。
**注意:!!!bgp的进程不要随便重启!!(根本就不能重启!)
bgp容错率比ospf还要低(基本不允许错),因为bgp承载的业务量是极大的,重启进程,会带来许多位置的麻烦,例如:重启之后就再也起不来了,就算邻居起来了,之前重启这段时间丢失的数据量,也没了;也有可能,重启之后,之前没生效的路由策略又生效了;又或者出现环路或次优路径...等
所以,在配置之前,考虑清楚bgp配好之后会发生什么,配完之后会有什么效果,想清楚再配置,一旦配置错误就麻烦了(ospf配错顶多瘫痪整个公司,bgp配错至少毁掉一整座城市)。。一重启一配错,准备写离职报告吧。。。bgp弄完了,可能就玩完了。。三思而后行!!!
1)bgp邻居建立:
ibgp:一般用loopback建立。
ebgp:一般用直连接口建立。**bgp基于tcp协议
在bgp建立建立邻居时,就不一定必须要在对端接口配置了,
因为只要tcp协议能建立tcp连接,能通,bgp就可以通。2)用loopback环回口建立ibgp的原因:环回口增加链路的冗余性。因为直连建立ibgp,会存在链路断掉,bgp邻居就没了的风险。用环回口的话,链路断一条没事,只要能通就能建立bgp邻居。
3)不用loopback环回口建立ebgp的原因:
ebgp之间TTL值默认为1。
假如用loopback建立ebgp,当R4把包丢给R3时,R3没法再传递给自己的loopback了(可以修改TTL值来建立ebgp邻居),为了便捷,一般就用直连的接口建立ebgp了。
在R1和R3上建立ibgp,在R3和R4上建立ebgp
**BGP支持ipv4和ipv6(默认为ipv4,所以配置里面有个ipv4-family unicast)
3)查看bgp邻居表
di bgp peer
发现:两边邻居都建立成功(Established)!!
可以从表中能看到:
当前BGP的router id(改router id 选举参考ospf)、自身所处的AS号;BGP邻居的状态、AS号;默认版本为BGPv4。
通过邻居的AS号和自己的AS号,可以判断自己是否和邻居处于同一AS。
AS相同,代表同一AS内,说明邻居关系为ibgp。
AS不同,代表不在同一AS,说明邻居关系为ebgp。
例如:本实验的isis就是为了让两个loopback能互通,这样tcp就通了,bgp邻居才能顺利建立。
引入路由
[R4-bgp]network 150.1.4.4 32
1)open报文
keeplive:60s。
hold time:180s超时时间。(类似ospf的dead time,超过一定时间,就认为邻居挂掉了)
例如:
2)keepalive报文
用来保持tcp连接(与ospf的hello包类似)
3)update报文
携带前缀和路径属性
4)notification报文
提供bgp报错信息
例如:管理员手动重启进程(现网不要重启!!这里是实验所以没啥事。)
5)route-refresh报文
例如:
1)idle状态:
最开始配置时的bgp状态。指完邻居之后,会等待32s。进入下一个状态。
2)connect状态:
主动发起TCP连接的过程。(此过程有可能会成功,也有可能失败)
tcp建立成功->顺利进入下一个opensent状态。
tcp建立失败->有主动变为被动模式(active状态),又对方发起TCP连接(对方发起的tcp来接成功->可以进入opensent状态;失败->等待一会再重新主动发起tcp连接)
3)opensent状态:
open包来协商AS号、router id、版本号等等。
4)openconfirm状态:
代表open包协商成功。当收到邻居的keepalive报文,进入最终状态established。
5)established状态:
bgp邻居建立成功的最终状态!
***注意:其中任何地方错误error,直接回到起点idle。32s后会重新来一遍这个bgp建立过程。
当我们希望这个ebgp能备份时,我们加一条链路,实现冗余备份,这时我们才用环回口loopback来建立ebgp邻居。
那么建立bgp邻居,最首要的一点:tcp建立,那么路由要可达。
配一条静态路由 ,然后用环回口建邻居。
查看bgp邻居表
发现:邻居一直起不来?
原因是ebgp的TTL值为1。
所以修改ebgp的跳数为2,让环回口可达。
查看bgp邻居表。
邻居建立成功。
6.***检查bgp邻居建立:
1)路由是否ok
2)bgp参数是否完整(邻居的AS号、ebgp的跳数、router id等)
路由引入的方式有两种:
1)network(精确匹配一条路由)
2)import-route(运用ACL、ip前缀等做路由引入)
但是network引入时,必须要精确、严格匹配网络的前缀和掩码
那么我们用network宣告的时候,只能是network 10.1.4.4 32,而不能是network 10.1.4.4 24,因为只有路由表里有的路由才能传递,此时路由表里根本没有掩码为24的10.1.4.4的网络,无法生效。
只能是 10.1.4.4/32。
只有这条路由在我的路由表里,不管是不是我本地直连,我都可以传进bgp里,但是没有的路由,一定无法传进去。
比如:现在我的R1的路由表上有一条150.1.2.2的环回口,就可以将它宣告进bgp
查看R4的bgp路由表
发现:刚150.1.2.2/32的路由已经传入bgp了
查看R4的bgp路由表
发现:的确引入了150网段的多条路由,但是150.1.1.1却不见了
> 代表这条路由可以传递的
查看R1的bgp路由表
发现:10.1.4.4这条路由前面没有带 >,它不可传,而且下一跳很奇怪,是150.1.4.4。
例如R2的150.1.2.2的路由到R3再到R4时,在R4上查看会发现,下一跳为R3。
也就是,10.1.4.4->155.1.34.4->155.1.34.3->..->最终目标,这个过程中下一跳一直在起始路由器上(R4)
R1ping R4的10.1.4.4的下一跳不可达(10.1.34.4),于是在R3上修改下一跳,告知AS内的ibgp邻居,自己是去往R4的下一跳。
peer 150.1.1.1 next-hop-local
查看R1的bgp路由表发现:下一跳变为R3了
但是R2无法与R4通信,因为R2没有R4的路由,R2本身没有bgp邻居,传路由根本传不到它那。
把150.1.0.0所有网段都引入的时候,150.1.1.1没法传递路由。
因为在华为里,超网是无法传递的(前缀和下一跳相同),例如150.1.1.1/32这个网段的掩码,下一跳恰巧也是150.1.1.1,是超网,无法传递。