BGP网关路由协议是无类别路径矢量的EGP协议。
在谈BGP之前我们谈一下AS自治系统,一个自治系统就是一个范围。之所以会出现这么一个东西,是因为我们不能将全球的网络运行在一个很大的网络中。
因此我们需要将这个很大网络划分为若干个小的区域,这个小区域就是AS,然后AS内部跑IGP协议,当需要访问外部的其它区域时,这时EGP登场了,它负责每个AS之间的通信。
要区别AS,那么AS一定要有编号。编号范围:0-65535,其中1-64511为公有,64512-65535为私有
这个网站每天都会更新,这个网站可以查出AS号、IPv4、IPv6部署、规划情况:CIDR Report
最底下有一个搜索引擎,我们可以查出中国所拥有的AS号。
4134-中国第一个AS号,中国电信的第一个AS号。
9929-中国网通的第一个AS号。
EGP协议的三大特性 |
---|
1、可控性:EGP协议共享其它协议产生的路由,正常不关注选路。 |
2、可靠性:EGP使用增量更新,依靠TCP的三次握手,使用单播非直连建邻,EGP承载于IGP之上 |
3、AS-BY-AS,以一个AS为一跳,一个条目在AS内部属性不变(保证BGP无环的最大意义) |
我们可以理解BGP协议是一个公平的重发布协议,它不生产路由,它只是路由的搬运工。
这是有关IGP、EGP的协议:
IGP | OSPF、EIGRP、RIP、ISIS、IGRP |
---|---|
EGP | EGP、BGP |
我们说EGP,EGP是最早的AS间的协议,拥有两个版本,版本1、版本2。版本2之后就有了BGP,经过多年的使用,BGP已经到V4版本了。因此,我这里讲的也是BGPv4版。
蓝色字体比较重要:
BGP特点: |
---|
1、无类别路径矢量,其实就是距离矢量(共享路由)的升级版,使用AS号作为跳数 |
2、使用单播更新来发送所有信息,基于TCP179端口工作 |
3、使用增量更新——仅触发无周期 |
4、具有丰富的属性来取代IGP中度量进行选路,使用多个参数控制协议 |
5、可控性——可以在进项和出项对流量实施强大的策略 |
6、默认BGP不被用于负载均衡,通过各种选路规则仅仅产生一条最佳路径 |
7、BGP支持认证和聚合(汇总) |
首先我们要知道的就是BGP所有的数据包是基于TCP传输。
包名 | 作用 | 详细 |
---|---|---|
Open | 建邻 | 存在hold time 和 RID,用于邻居关系建立,默认仅收发一次即可 |
Keeplive | 保活 | 保活周期 1分钟,保活的是TCP会话,hold time 3分钟 |
Update | 更新 | 更新包:包含路由条目:目标网络号+属性 |
Notification | 报错 | 报错包会在错误信息出现时发送 |
BGP的工作过程: |
---|
1、首先要IP可达,也就是建邻设备间可以通讯 |
2、通过三次握手建立TCP的会话 |
3、收发BGP的Open报文,建立邻居关系生成邻居表 |
4、使用Update报文共享本地的路由信息给邻居,生成BGP表:表中包含所有本地发出及接收到的路由信息 |
5、默认将BGP表中最优路径加载于路由表中,之后收敛完成,仅Keeplive周期保活即可。 |
6、若存在错误的配置或策略时,BP协议将使用Notification包来进行报错。 |
结构突变 | 调整 |
---|---|
新增 | 最先学习到新增网段的BGP设备,使用Update包共享条目即可。 |
断开 | 最先知道断开网段的BGP设备,使用Update包共享信息即可。 |
无法通讯 (设备断电) |
hold time 到时时,断开邻居关系和TCP会话,然后删除所有从该邻居学习到的信息。 |
用个图来说明一下:
有关名词注解:
对等体:peers,在BGP中因为可以非直连建邻,故邻居也被称为对等体。
EBGP:不同AS间的BGP邻居关系,管理距离为20
IBGP:同一AS内部建立的BGP邻居关系,管理距离为200
从这个图中,我们可以看到总共有3个AS自治系统,中间的自治系统中:B、E两台设备运行了BGP,而D、C并没有运行BGP。B和E之间通过非直连建邻,它们之间的关系是IBGP。
接下来说说路由黑洞是怎样产生的:
上图在说明一个问题:当A新出现一个环回(X网段)的时候,该环回被B学习到,B通过TCP单播发给E,进而被E学习到,之后F就有了去X的路由。
当F要访问X网段的时候,比如说F要ping X网段。F的下一跳是E,在BGP中E的下一跳是B,但是路由器查表的规则是递归查询,实际流量的下一跳是C、D,接着E把流量交给C、D。
但是问题来了,C、D根本没有学习到去往X的路由,流量就会被C、D所扔掉。此时路由黑洞出现,而C、D的存在就是造成路由黑洞的主要原因。
总结一下BGP的路由黑洞的出现原因:
因为BGP协议可以非直连建邻,这样在一个AS内部就运行出现不运行BGP协议的路由,导致BGP可以邻居间正常传递路由,实现控制层面可达,但数据层面在未运行BGP协议的设备上不可达。
序号 | 解决方案 | 评价 |
---|---|---|
1 | 最佳方案:MPLS多协议标签交换 | |
2 | 物理链路全连:所有BGP设备间直连,不存在非直连建邻(直接相连俩BGP设备) | 如果可以,就可以 |
3 | 邻居关系全连:所有设备运行BGP | 不现实 |
4 | 将BGP路由条目重发布到IGP(纯实验环境可以考虑) | 更不现实 |
5 | tunnel:在公网中,所有走BGP的时候加上一个包头,但这就会导致整个网络很差劲。 | 原理上可讲通,但实际不可行 |
EBGP水平分割,防止EBGP邻居间的环路。它在BGP协议的属性中存在一个AS-path属性,记录经过的每一个AS号。接收到的路由条目中,若存在本地的AS号将拒绝接收。
基于AS-BY-AS规则,一条路由在一个AS内部传递时,默认属性无变化。
IBGP水平分割规则:从一台IBGP邻居处学习到的路由不得传递给另一个IBGP邻居。
或者是下面这种情况:
注:该规则迫使全网所有BGP设备间均需要进行邻居关系建立配置,配置量几何增长,可以使用联邦、和路由反射器来打破。
下面的配置我会以这个图为依据,所有设备都有环回,均运行OSPF,且同在一个区域0。R5~R6之间有两根网线。
因为单播建邻,因此建立邻居关系和宣告路由是分开进行的。
建邻是双向的,两边都要配置
//启动协议时携带真实的AS号,无多进程概念,一个设备只能配置一个AS
R1(config)#router bgp 1
//配置RID,如果不配置,则使用环回接口,最后为物理接口作为RID
R1(config-router)#bgp router-id 1.1.1.1
//直连的EBGP邻居关系建立:邻居接口的IP,及所在AS
R1(config-router)#neighbor 12.1.1.2 remote-as 2
建邻配置完成后,邻居间通过三次握手建立TCP会话:
R1#show tcp brief
TCB Local Address Foreign Address (state)
6427FFF0 12.1.1.1.179 12.1.1.2.36113 ESTAB
两端均为向另一端发起TCP会话建立请求,但将随机断开一条,上面的信息说明R2是找R1建的邻。
TCP会话建立后,BGP协议将发出open报文,建立BGP的邻居关系生成邻居表
//查看BGP邻居表
R1#show ip bgp neighbors
//查看bgp汇总信息
R1#show ip bgp summary
从图中可以看出它包含本地bgp RID,本地AS号,BGP的表版本为1,bgp 版本为4。
最右侧的State/PfxRcd表示状态:
此处的阿拉伯数字标识从该邻居处学习到的路由条目数量,此处(数字、Idle、active)若为数字也同时标识已经建立了邻居关系。
在实际网络中,IBGP邻居间一般存在多条路径,使用环回接口地址作为源、目标地址来建立邻居关系,可以同时基于多条路径传输,且邻居关系更稳定。
建邻是双向的,两边都需要配置:
R2(config)#router bgp 2
R2(config-router)#neighbor 3.3.3.3 remote-as 2
//一旦将目标地址修改为对端环回接口,本地也需要将源地址修改为本地的环回接口。
R2(config-router)#neighbor 3.3.3.3 update-source loopback 0
比如说下图,如果以两台边界设备的接口来建立IBGP,一旦物理链路一断,它们的邻居关系就会断开。
而使用环回,就是稳定。虽然bgp的下一跳只有一个,但是流量递归以后实际走的是两条链路,还提升了链路利用率。即使断一条也没有关系,邻居关系还存在。
为了保证EBGP邻居间关系的稳定,EBGP邻居间也会存在多条链路,为了同时使用这些链路,建议使用环回接口作为源、目IP地址建立邻居关系。
建邻过程分2步:
①IP可达:
但是这里存在一个问题,使用两台设备的环回建邻,但是大家都不在相同的AS中,一般为了使IP可达,常使用静态路由。
两边都要配置静态:
R5(config)#ip route 6.6.6.0 255.255.255.0 56.1.1.2
R5(config)#ip route 6.6.6.0 255.255.255.0 65.1.1.2
②使用环回建立BGP邻居关系:
两边都需要配置:
R5(config-router)#neighbor 6.6.6.6 remote-as 3
R5(config-router)#neighbor 6.6.6.6 update-source loopback 0
③修改TTL值:
默认IBGP邻居间数据包TTL=255,EBGP邻居间TTL=1,故一旦使用环回地址建立EBGP邻居关系,那么必须修改TTL值。
//后面的数字2即表示TTL值,如果不设置则默认为255
R5(config-router)#neighbor 5.5.5.5 ebgp-multihop 2
R1(config)#router bgp 1
R1(config-router)#network 1.1.1.0 mask 255.255.255.0
切记:BGP协议只能逐条宣告本地路由表中的内容(不关注路由条目的产生方式),宣告时必须和表中的记录完全一致。
一旦进行了路由条目的宣告,本地就生成BGP表。BGP表中包含本地收发到的所有路由条目,基于Update发送
//查看BGP表
R1#show ip bgp
* 的位置显示 | 注解: |
---|---|
* | 条目可用,可以加到路由表 |
r | 条目不可用,不装载:标识本地路由表已经通过更好的方式获取路由。 |
s | 条目不可用,被抑制:人为的策略限制条目的传递 |
其他位置 | 注解: |
---|---|
> | 标识条目优秀:可以加载到路由表,可以传递给邻居。 |
i | 该条目是从IBGP处学习到的路由。 |
注意:条目必须 即优且可用 才可以加表,仅优 便可传递。前提为不能被s抑制,就是没有做策略。
成为优秀的条件:
①同步问题:
本地IGP已经学习到了该BGP路由才能优,该规则的目的在于避免路由黑洞,但条件苛刻故在IOS版本12.2(8)T以上默认关闭。
R3(config)#router bgp 2
R3(config-router)#no synchronization
②下一跳可达问题:
因为AS-BY-AS,条目在传递给IBGP邻居时,属性默认不变,故从IBGP邻居学习到的路由,下一跳不变。当路由传递给EBGP邻居时,下一跳自动修改为本地。
当存在这个问题时,R3看到的路由的下一跳是12.1.1.1,但问题是R3根本没有去往该网段的路由。
此时我们就需要让R2把路由传递给邻居R3时,修改属性中的下一跳地址为本地R2。
R2(config)#router bgp 2
R2(config-router)#neighbor 3.3.3.3 next-hop-self
这样R3就可以加表了。
注意:这样修改下一跳为本地,只是单方向的(R2给R3),如果是从R3给R2则需要在R3上配置到R2修改下一跳为本地。
它的路由表如下:注意IBGP的度量为200。
由于存在IBGP水平分割,因此虽然R3加了表,有了路由,但是它不会给R4。因此我们需要R2和R4之间建立一个IBGP
R2、R4之间建立了IBGP邻居后,同样的需要在R2上进行配置,告诉R4修改下一跳为本地。
同理,除之前所建邻居外,还有这张图中的其他邻居也要建邻,然后也要修改下一跳为本地。而R5和R6是不受水平分割限制的,R6肯定会优,因为R5会自动修改下一跳为自己,它们之间的关系是EBGP。
这张图中,黑色线条表明了物理链路,R3、R4之间使用串线,而R1、R2、R3之间使用以太网线,它们处在MA网段。绿色线条表明IBGP关系,而蓝色线条表明了EBGP关系。
R4把它的环回传给R3、R3再传给R2、R2再传给R1,根据水平分割来讲,R1去往R4的环回下一跳是R2,因为是R2给的。
但是我们将所有配置配置好后,然后发现R1的下一跳不是R2,而是R3,这就是MA网段中下一跳问题。
在MA网络中,ICMP重定向将帮助BGP学习到最佳的下一跳。
配置 | 注解 |
---|---|
R1#debug ip bgp updates | 动态查看BGP更新包 |
R1#clear ip bgp * | 硬重启(慎用),重启本地所有邻居间的TCP会话,重建TCP会话会很慢。 |
R1#clear ip bgp * soft [in/out] | 软重启,仅和本地所有邻居间重新收发路由,不断开任何关系,做策略很有用。 后面加in表示收路由,而out表示发路由 |
R1#clear ip bgp 3.3.3.3 | 仅和3.3.3.3邻居进行硬重启 |
R1#clear ip bgp 3.3.3.3 soft | 仅和3.3.3.3邻居进行软重启 |
之前我们也看到,BGP的表格过大,因此需要筛选,可以使用以下配置进行筛选。
//仅查看本地发送给邻居123.1.1.2的路由信息
R1#show ip bgp neighbors 123.1.1.2 advertised-routes
//要想查看本地从xxx.x.x.x的接收的路由,也可以。但是我们知道路由会很多的,因此我们需要配置专门的储存空间来装载,建议查看完成后删除该空间
R1(config-router)#neighbor 123.1.1.2 soft-reconfiguration inbound
//查看本地从xxx.x.x.x的接收的路由
R1#show ip bgp neighbors 123.1.1.2 received-routes