BGP边界网关路由协议(1)
BGP协议(一个很牛B的协议)
如果前面的基础打的不好,能够让你在这个协议里面直接懵B的协议
什么是BGP协议
IGP (rip ospf eigrp isis )internal
EGP external
BGP,前身EGP,外部网关路由协议,
具体能做什么?
主要负责不同的AS之间通讯,
什么样的环境需要运行BGP
中小型企业肯定是用不上的,但是大型企业,当企业规模大到一定程度上,就需要BGP
并且存在多个异地分支机构的环境,
配置BGP都有哪些要求吗?
硬件需要支持, 因为BGP协议中会囊括整个internet的条目,硬件性能肯定要好
软件同样需要支持,有些IOS是不支持BGP的,所以想用也没有办法。
IGP路由协议所能承载的路由条目数量 最大到1万条,
而BGP路由协议所能承载的路由条数量,起步就是10万+ 70W条
所以在这里先要友情的提示一下,如果你考虑将BGP的条目引入到IGP中,请一定要三思而后行,一定要进行策略限制,不然你的IGP协议和设备都会被撑死的。
BGP特性
运行在TCP协议之上,使用TCP179 端口建立连接,
其实把它看简单一些,就是一个大的rip,它们两个都是距离矢量路由协议,只不过BGP为了更好的区分,改了个名字,叫做路径矢量路由协议。
BGP的关系
(即不同的关系,可以理解像OSPF的邻居和邻接一样,有两种关系)
IBGP,使用相同的AS号 建立的邻居关系 最大支持255 跳 AD =200
EBGP 使用不同的AS号 来建立邻居关系, 默认最大支持1跳(当然可以手动修改) AD=20
BGP的路径
路径矢量路由协议,(距离矢量),那它是通过什么来标记路径的呢?
BGP的AS-PATH,用于标记BGP的路径,经过一个AS,则视为一跳,跳数 越少的为越优。
这一点详细的在后边说。
先来看个图
如图中所示,当R1方向有一个更新,发给R4时,最开始有两条路可以走,
R1—R2—R3—R4
R1—R5—R6—R4
但是BGP 看的不是所经过的路由设备,而是所经过的AS,用AS-PATH来进行表示,(这个后面会有更加详细的解读)
如果两个路由器在一个AS里时,那也被视为一跳,越短越优
每经过一个AS,就会在BGP的路径 属性中进行标记,进行倒叙标记
那么,上面的就是 100--- 200 然后到400
下面的就是 100---500---600 然后到400
这样一比就出来了,肯定是把上面的链接设为最优喽~。怎么样,不难吧…..
BGP的包种类
一共分为五种
Open ////用于请求BGP邻居用
Keepalive //保活包,用于建立和维持邻居关系
Update ///BGP的更新包, 没有周期更新的。只有增量和触发
Notification ///错误告警包,当出现问题时,会向邻居进行通告消息
Router-refresh //路由刷新,当进行手动刷新时,通过weirshark可以抓到此包
BGP建立在TCP的基础之上,TCP#179 端口
BGP的状态机
Idle 空闲状态
Connect 请求tcp连接状态
Active 请求tcp建立时失败,此阶段反复尝试
Opensent tcp建立成功,
Openconfirm 发送keepalive包,等待回复
Established 邻居建立完成,可以发送update包了
这里有一个利用wireshark抓包的BGP建立过程,
打开后可以清楚的看到一个BGP邻居从无到有的建立过程
抓包为IBGP peer,大同小意
那么一个OPEN包中都包含了哪些信息呢?
说明一个hold time ,这个是keepalive包的holdtime,
Keepalive包有一个周期性, 60S一次,如果180S没有收到对方发来的keepalive则视为peer down,
另外,这个hold time 两端可以不一样的,如果两端不一样,则取值小的,然后除以3 ,就得出了keepalive的同期时间(一定是整数的)
把这这玩意儿一般我们也不去设置,自己看着办就行。
我绘制了一张图,
可以更加了然的看清楚其状态,从idle如何一步一步的走向established的
从IDLE开始,请求连接TCP,进入到connect,开始连接TCP,如果成功则进入open sent状态,如果不成功则到ACTIVE状态,(此时反复尝试,如果一直不成功则回退到IDLE状态)
opensent 状态开始发送Open消息,经过两侧的协商,进入open confilm状态,最终顺利进入established状态,建立完成,开始发送update信息
BGP 的三张表
1 邻居表 存放着BGP 的邻居,可以很直观的看到BGP 的邻居类型是什么
2 BGP表 相当于EIGRP的拓扑表,存放着所有的路由信息,是所有的,
3 路由表 只有BGP协议的最优条目才会放到路由表中
1 邻居表,show ip bgp summary
2 bgp表,show ip bgp
如果想要查看具体的条目,可以在show ip bgp 后面加上前缀 ,如show ip bgp 192.168.1.0
3 路由表show ip route bgp
在BGP中,邻居,叫做对等体,peer (ibgp peer , ebgp peer)
IBGP的基础配置
首先要明确一点,无论你是IBGP还是EBGP,都要明白,建立TCP连接的前提,是底层互通,这样才可以实现BGP的下一步操作,如果底层不通,其它后边的东西,你想都别想了
另外BGP可以实现跨设备建立邻居,所以更需要底层互通 了
为了省事儿,我们在R1和R2上中跑了一个EIGRP,(像其它的RIP ,OSPF,静态都可以)
配置思路如下
1、 创建BGP进程(一台设备只允许有一个BGP进程【AS号唯一】)
2、 指定BGProuter-id
3、 指定邻居,以及邻居所在的AS
4、 指定更新源(如果想使用loopback接口)
配置如下
IGP协议我不在多说了。R1R2各设置loopback1 ,
R1(config)#router bgp 100 //定义并进入BGP 进程 R1(config-router)#bgp rou 1.1.1.1 //定义bgp RID R1(config-router)#nei 2.2.2.2 remote 100 //指定邻居,指定所在AS R1(config-router)#nei 2.2.2.2 up lo 1 //指定更新源为loopback1 R2(config)#router bgp 100 R2(config-router)#bgp rou 2.2.2.2 R2(config-router)#nei 1.1.1.1 remote 100 R2(config-router)#nei 1.1.1.1 up lo 1 R2 做同样的配置,指向R1为 ibgp peer
需要注意的是,在BGP的协议中,建立邻居和宣告 网段是两回事儿
建立邻居不等于是更新条目,所有的条目都要进行手动更新才可以。
查看邻居表
R2#show ip bgp sum BGP router identifier 2.2.2.2, local AS number 100 BGP table version is 3, main routing table version 3 1 network entries using 117 bytes of memory 1 path entries using 52 bytes of memory 2/1 BGP path/bestpath attribute entries using 248 bytes of memory 0 BGP route-map cache entries using 0 bytes of memory 0 BGP filter-list cache entries using 0 bytes of memory BGP using 417 total bytes of memory BGP activity 1/0 prefixes, 1/0 paths, scan interval 60 secs Neighbor V AS MsgRcvd MsgSent TblVer InQ OutQ Up/Down State/PfxRcd 1.1.1.1 4 100 27 26 3 0 0 00:23:13 1 R2#
对比 local as 和邻居的AS ,就可能判断和邻居的关系是ibgp还是ebgp
Neighbor,显示为邻居的标识,如果设置了RID,那么这里显示RID,
State/rfxrcd,只要是数据,就显示邻居已经建立成功,具体的数据表示具体的接收条目数量
如果不是数字 是英文的话,说明状态不正确。
查看BGP表
R2#show ip bgp //这张表一定要会看 BGP table version is 3, local router ID is 2.2.2.2 //本地bgpRID为2.2.2.2 Status codes: s suppressed, d damped, h history, * valid, > best, i - internal, r RIB-failure, S Stale //这两行带表下面将看到的标识的具体意思 Origin codes: i - IGP, e - EGP, ? - incomplete Network Next Hop Metric LocPrf Weight Path r>i1.1.1.0/24 1.1.1.1 0 100 0 i r 表示放入路由表失败,为什么呢?能想出来吗?因为eigrp的AD=90,而ibgp=200 被放入路由的是eigrp条目 >大括号表示best BGP的最优条目 小i 表示其关系为ibgp关系 后面的小i表示的意思为IGP,这一点在后面会有详细的介绍。 Next hop,为下一跳,和IGP中的via是个意思, 这里的意思是:想要去往1.1.1.0/24的条止,其下一跳为1.1.1.1 最后的PATH,显示为空,这是因为IBGP的水平分割原则,限制AS-path在IBGP邻居关系中进行传递。
查看某一个条目的详细信息
R2#show ip bgp 1.1.1.0 BGP routing table entry for 1.1.1.0/24, version 3 Paths: (1 available, best #1, table Default-IP-Routing-Table, RIB-failure(17)) Not advertised to any peer Local 1.1.1.1 (metric 409600) from 1.1.1.1 (1.1.1.1) 下一跳 igp的度量值 来自1.1.1.1 (rid) Origin IGP, metric 0, localpref 100, valid, internal, best //这些是路径属性, 最后这个best,为BGP条目中的最优,这里显示最优,在BGP表中显示的为”>”
EBGP的基础配置
前面也提到过,所谓EBGP,就是通过不同的AS号进行建立邻居关系。
配置思路
1、 创建BGP进程(一台设备只允许有一个BGP进程)
2、 定义BGProuter-id
3、 指定邻居,以及邻居所在的AS,这次是不同的AS号码
4、 指定更新源(如果想使用loopback接口)
5、 如果使用loopback接口做为更新源,还要开启ebgp的多跳,因为ebgp默认只支持一跳
配置如下:
R1(config)#router bgp 100 R1(config-router)#bgp rou 1.1.1.1 R1(config-router)#nei 2.2.2.2 remote 200 ///指定邻居,不同的AS R1(config-router)#nei 2.2.2.2 up lo 1 //更新源为LO 1 R1(config-router)#nei 2.2.2.2 ebgp-multihop //开启EBGP多跳 ,由于EBGP默认支持1跳 Ebgp-multihop后面不加任何数字的话,默认是255跳。
R2同样的配置:
R2(config)#router bgp 200
R2(config-router)#bgp rou 2.2.2.2 R2(config-router)#nei 1.1.1.1 remote 100 R2(config-router)#nei 1.1.1.1 up lo 1 R2(config-router)#nei 1.1.1.1 ebgp-multihop
不过通常情况下,在建立 EBGP邻居关系时,都使用物理接口建立。不用再额外写路由,也方便后期维护。
查看ebgp的相关信息
R2# show ip bgp sum BGP router identifier 2.2.2.2, local AS number 200 BGP table version is 1, main routing table version 1 Neighbor V AS MsgRcvd MsgSent TblVer InQ OutQ Up/Down State/PfxRcd 1.1.1.1 4 100 2 2 0 0 0 never 1 Local as=200 PeerAS= 100 由此可以判断这是一个EBGP的关系,其它信息不变
查看EBGP 的BGP表
R2(config)#do show ip bgp BGP table version is 4, local router ID is 2.2.2.2 Status codes: s suppressed, d damped, h history, * valid, > best, i - internal, r RIB-failure, S Stale Origin codes: i - IGP, e - EGP, ? - incomplete Network Next Hop Metric LocPrf Weight Path
1*> 1.1.1.0/24 1.1.1.1 0 0 100 i * valid 代表有效的,会被放入到路由表中为什么之前的IBGP不会被放入已经说明 , 这里的EBGP为什么会被放入,可想而知喽,因为EBGP的AD= 20,相比EIGRP的90,要优,SO,可以放到路由表中。这也就是为什么会有>的原因了。 ??这里有没有发现少点儿什么, 是的,没错,对于ebgp的BGP表而言,在这条前缀的最前面是没有任何标识的,这一部份显示为空。 再往后面,最后面,path.
AS-PATH的作用
这里我们详细的介绍一下path的作用,其作用有二,
1用于标记路由所经过的AS, RIP中经过一个路由设备视为一跳,而在BGP中,经过一个AS 视为一跳。且标记的方式是反向标记的,
2用于 EBGP的防环路功能,当邻居接收到update更新条目时,如果发现里面包含了自己的AS,那么会直接将这个包丢弃。就是这么傲娇
关于as-path的种类,我们在后面会进行更加详细的介绍。
如果是纯的IBGP关系,则在整个IBGP的网络中不会存在PATH这一条件的产生,因为只有数据从IBGP出来的时候才会被打上标记
BGP同步
黑洞怎么来的呢?
如图
Router-A发布一条更新给B,(此时AB之间是EBGP邻居关系)
AS65102同时运行了IGP和BGP,且只有B和E建立了IBGP的邻居关系,那么路由条目可以传递给F吗?
由于CISCO默认是关闭同步的,所以路由可以传递过去。
先看一下是怎么更新过去的
RA传给RB,RB给自己的IBGP邻居E(此时做为RD和RC来讲,他不会去看这个uodate信息里面包含了啥,而是直接转发),然后E再传给F,在F上可以查看到RA上的更新
但是可以回来吗?也就是说我的RA可以ping通RF吗?
来看一下回来的路是怎么走的,
F-E,E的下一跳是谁?
如何封装的呢?
源地址F,目的地址,在RA上的条目为目标地址
那么问题来了,我的RC/RD上有去往RA上面那个目标地址的路由吗?
这时就出现了路由黑洞,在F上出的问题,就是有路由,无法通信.
同步定义
BGP路由器不应该使用通过IBGP获得到的路由或将其通告给外部的邻居,除非该路由是本地的或通过IGP协议获取的。
这一同步规则目的就是为了防止路由黑洞,
尴尬
此时如果开启BGP同步,那我的条目传不过去
那如果关闭BGP同步的话,条目了路由黑洞
怎么办?
解决办法
1重发布
在中转AS中的IBGP路由器上将BGP重发布到IGP中
如此图我在B和E上,将BGP重发布到OSPF中,即可。这样来去都有条目了,
但是这种方法最好别用,BGP向IGP重发布路由的话,一定一定一定要谨慎
2 全互联IBGP邻居关系
之前只有B和E运行了BGP,现在我将CDBE都运行BGP,实现BGP的全互联。
也是可以实现的,但是这种操作看起来好二,
一是我的配置很多,一台设备上都要和其它三台建立IBGP关系
二是我的排错很麻烦 ,存在潜在问题,关系都是两两之间的
3 最完美的解决方案
1)路由反射器
2)BGP 联邦
3)MPLS(这个会在后面单独讲,也是一个大的技术点,多协议标签转发)
IBGP水平分割原则
只有在IBGP之间才会出现的问题。
当一台路由器从IBGP peer收到BGP路由时,将不可以再传递给我任何的IBGP邻居。
这一点是和AS-Path有所区别的,前边说过AS-path的定义,只有路由经过一个AS的时候才会标记上一个AS-PATH,那么在一个AS内部,是不进行任何的变化的,只有出去的时候才会增加标记,EBGP可以直接 通过AS-PATH进实现防环,而IBGP则不行,所以有了IBGP的水平分割的强制原则。
如何破解这个原则呢?
1)BGP路由反射器
2)BGP联邦
BGP的常用命令补充
Clear ip bgp *
硬清,将所有的BGP邻居连接全部断开再重建,这一条最好,最好,最好不要用,
Clear ip bgp * soft
一般我们都用这种,不断开连接,但是触发router-refesh,使路由触发更新,(也是被逼无奈之举,BGP的收敛速度实在是太慢了)
Clear ip bgp X.X.X.X
断开某一个邻居
Show ip bgp X.X.X.0
查看具体条目的详细信息
Show ip bgp neighbor x.x.x.x routes
只查看某一个邻居发来的条目
Show ip bgp nei x.x.x.x advertised-routes
查看我给某一个邻居发送的条目
以上就是初识BGP的邻居关系,后面的笔记将会由浅入深,步子要一步一步的迈,不要迈的太大,容易扯着蛋......
-----------------------------------------------------------
CCIE成长之路 --- 梅利