BGP-Huawei
BGP概述
BGP(Border Gateway Protocol)
IGP(Internal Gateway Protocol)
EGP(External Gateway Protocol)
AS指的是在同一个组织管理下,使用同一选路策略的设备集合
as号有16bit和32bit
BGP更像搬运工,直接把IGP内部的路由搬出去
触发式更新,只对波动的路由才收敛
能解决环路问题,并对路由信息优选,控制
BGP4,BGP4+ 扩展性非常高
企业内部互通,企业和运营商互通
BGP基本概念
路径矢量路由协议(Path-vector Routing Protocol)
使用tcp 端口号179,使用触发式路由更新,而不是周期性的
BGP能承载大批量的路由信息,能够支持大规模网络
BGP提供丰富的路由策略,能够灵活的进行路由选路,并能指导对等体按策略发布路由信息
BGP能够支撑MPLS/VPN应用,传递客户VPN路由
BGP提供了路由聚合和路由衰减用于防止路由震荡,通过这两项功能有效的提高了网络稳定性
BGP特征
运行BGP的路由器被称为BGP发言者,BGP Speaker 或者BGP路由器
两个建立BGP会话的路由器互为对等体 Peer,BGP对等体之间交换BGP路由表
BGP路由器只发送增量的BGP路由更新,或进行触发式更新(不会进行周期姓更新
BGP能承载大批量的路由器前缀,可在大规模网络中应用
每条BGP路由都携带多重路径属性(Path Attribute),BGP可以通过这些路径属性控制路径选择,OSPF和IS-IS只能通过开销Cost控制路径选择,因此在路径选择上,BGP有丰富的可操作性,可以在不同场景下选择最合适的路径
BGP与对等体的关系
与OSPF和ISIS等不同,BGP的会话是基于tcp的,建立BGP的对等关系的路由器并不要求必须直连
BGP存在两种对等体关系类型:EBGP和IBGP:
-EBGP(External BGP):位于不同自治区的BGP路由器之间的BGP对等体关系,两台路由器要建立EBGP对等体关系,必须满足两个条件:
-- 两个路由器所属的AS不同
-- 在配置EBGP时,Peer命令所指定的对等体的IP地址要求路由可达,并且TCP连接能够正确建立
-IBGP(Internal BGP):位于相同自治系统的BGP路由器之间的BGP邻居关系
BGP对等体关系的建立
先启动BGP的一端先发起TCP连接,比如R1先启动,使用随机端口向R2的179端口发起tcp连接
三次握手完成后,R1和R2互相发送open报文,携带参数用于对等体建立,参数协商完成后双发互相发送keepalive报文,收到对端发送的keepalive后对等体建立成功,同时双方定期发送keepaalive保持连接
其中Open报文中携带
- My Autonomous System:自身的as号
- Hold Time:用于协商后续keepalive的发送时间
- BGP Identifier:自身的Router ID(通过这个id来确定使用那个tcp连接,会选择id大的tcp连接)
对等体关系建立完成后,双方BGP路由器发送BGP Update报文通告路由到对等体
TCP连接源地址
缺省情况下,BGP使用报文出接口作为TCP连接的本地接口
在部署IBGP对等关系时,建议使用loopback地址作为更新源地址,loopback接口非常稳定,而且可以借助as内的IGP和冗余拓扑来保证可靠性
在部署EBGP对等关系时,通常使用直连接口的IP地址作为源地址,如若使用Loopback接口建立EBGP对等关系,则应注意EBGP多跳问题
-EBGP传递报文的TTL值默认1,如果使用loopback接口作为源ip地址就会被丢弃,如想要使用loopback需要修改默认ttl>=2
BGP的报文类型
BGP存在五种类型的报文,不同类型的报文拥有相同的头部(header)
-Open: 协商BGP对等体参数,建立对等关系 | 在BGP TCP建立连接之后发送
-Update:发送BGP路由更新 | BGP对等体关系建立之后又路由需要发送或者路由变化时向对等体发送Update报文
-Notification:报告错误信息,终止对等体关系 | 当BGP在运行时发现错误时,发送Notification报文将错误通告给BGP对等体
-Keepalive:标志对等体建立,维持BGP对等体关系 | BGP路由器收到对端发送的Keepalive报文,将对等体状态置为已建立,同时后续定期发送keepalive报文用于保持连接
-Route-Refresh:用于在改变路由策略后请求对等体重新发送路由信息,只有支持路由刷新能力的BGP设备会发送和响应此报文 | 当路由策略发生变化时,触发请求对等体重新通告路由
报文格式:
Marker(16byte)Length(2byte)type(1byte)
-Marker : 用于标明BGP报文边界,所有bit均为1
-Length :BGP报文总长度(包括头部报文)
-Type : BGP报文的类型(取值从1到5表示open,update,notification,keepalive,route-refresh)
Open报文格式
Version(8bit)-My AS(16bit)-Hold Time(16bit)-BGP Identifier(32bit)-Opt Parm Len(8bit)-Optional Parameters(可变长度)
-Version : BGP的版本号,对于BGP4来说,值为4
-My AS(Autonomous System) :本地AS号。比较本端自治系统和对端自治系统是否在同一个AS内,确定E或IBGP
-Hold Time :保持时间。默认是180秒、在建立对等关系时两端要协商Hold Time,并保持一致,如果在这个时间内未收到对端发来的Keepalive(默认60秒)或update报文,则认为BGP连接中断
-BGP Identifier : BGP的标识符,以IP地址的形式表示,用来识别BGP路由器
-Optional Parameters :包含了BGP在协商过程中能够支持的其他能力,比如,是否支持认证,是否支持其他协议处理,都需要这个字节来协商
Update报文格式
Unfeasible Routes Length (2byte) / Withdrawn Routes (nbyte) / Total Path Attribute Length (2byte) / Path Attrbutes (nbyte) / NLRI (nbyte)
一个UPdata报文可以通告具有相同路径属性的多条路由,这些路由保存在NLRI(Network Layer Reachable Information,网络可达信息)中。
同时,Update还可以携带多条不可达路由,用于告知对方撤销路由,这些保存在Withdrawn Routes字段中。
报文解释:
Unfeasible Routes Length : 表示不可行路由的数量
Withdrawn Routes(可选): 撤销路由前缀;撤销路由长度
Total Path Attribute Length :指示路径属性的总长度
Path Attributes(可选):用于描述BGP路由的特征和属性例如:NEXT_HOP(下一跳地址)、AS_PATH(AS路径)和MED(多路径外部度量)等。
NLRI(Network Layer Reachable Information):网络层可达消息,要发布或者更新路由信息就通过这个字段,NLRI前缀,NLRI前缀长度
Notification报文格式
Error Code(8bit) / Error Subcode(8bit) / Data(可变长度)
当BGP检测到错误状态时(对等体关系建立时,建立之后都可能发生)就会像对等体发送Notifiction,告知对端错误原因,之后BGP连接将会立即终端。
Error Code : 差错码,用于告知对端具体的错误类型
Error SubCode : 差错子码,用于告知对端具体的错误类型
Data : 用于辅助描述详细的错误内容,长度并不固定
Keepalive报文格式
Marker(16byte) / Length(2byte) / Type (1byte) 这里会发现跟头部一样,没错就是一样
BGP路由器收到对端发送的Keepalive报文,将对等体状态置为已建立,同时后续定期发送Keepalive报文用于保持连接。
Keepalive报文格式中只包含报文头,没有附加其他任何字段。默认每隔60秒发送一次
Route-Refrash报文格式
AFI(16bit) / Res(8bit) / SAFI(8bit)
Route-Refresh报文用来要求对等体重新发送指定地址族的路由信息,一般为本地修改了相关路由策略之后让对方重新发送Update报文,本端执行新的路由策略重新计算BGP路由。并不是所有设备都支持。
AFI(Address Family Identifier) : 地址族标识,如IPV4
Res : 保留,8个bit必须置0
SAFI(Subsequent Address Family Identifier) :子地址族标识
BGP-Peer状态
Idle:开始准备tcp的连接并监视远程对等体,启用BGP时,要准备足够的资源
connect:正在进行TCP连接,等待完成中,认证都是在TCP建立期间完成的。如果TCP连接建立失败则进入Avtive状态,反复尝试连接,成功就会进入OpenSent状态。
Active:TCP连接没建立成功,反复尝试TCP连接。
OpenSent:TCP连接已经建立成功,开始发送Open包。Open包携带参数协商对等体的建立。
OpenConfirem:参数,能力特性协商成功,自己发送keepalive,等待对方的Keepalive
Established:已经收到对方的Keepalive包,双方能力特性经协商发现一致,开始使用Update发送路由信息,表明正式建立对等体Peer
BGP路由的生成(注入)
不同于IGP路由协议,BGP自身并不会发现并计算产生路由,BGP将IGP路由表中的路由注入到BGP路由表中,并通过Update报文传递给BGP对等体。
BGP注入路由的方式有两种:
Network
Import-route
与IGP协议相同,BGP支持根据已有的路由条目进行聚合,生成聚合路由。
Network
bgp 200
network 10.1.0.0/24
network 10.2.0.0/24
可以精确的发送路由信息,但是一次只能注入一条,量大的时候太繁琐。
注入后,这两条路由将会出现在本地的BGP路由表中。然后通过Update报文发送给Peer,Peer收到后将接受到的路由加入到本地的BGP路由表中
Import-route
通过import-route注入可以使用以下路由协议的路由直接注入到BGP中:
直连路由
静态路由
OSPF路由
IS-IS路由
等非BGP的路由都可以注入到本地BGP路由表
bgp 200
import-route {bgp | direct | static | isis[process-id-isis] | ospf[process-id-ospf] }
BGP聚合路由
与众多的IGP协议相同,BGP同样支持路由的手工聚合,在BGP配置视图中使用aggregate命令可以执行BGP路由手工聚合,在BGP已经学习到相应的明细路由情况下,设备会向BGP注入指定的聚合路由
比如有:
10.1.1.0/24
10.1.2.0/24
10.1.3.0/24
就可以聚合为
10.1.0.0/22
bgp 200
aggregate 10.1.0.0 22 detail-suppressed
如果不加detail-suppressed会把聚合前的三个路由也给传过去,为了减少开支,就加上细节抑制也就是detail-suppressed
通告原则
BGP通过Network、import-route、aggregate聚合方式生成BGP路由后,通过Update报文将路由传递给Peer也就是对等体
BGP通告遵循以下原则:
- 只发布最优路由
- 从EBGP对等体获取的路由,会发布给所有的对等体
- IBGP水平分割:从IBGP对等体获取的路由,不会发送给IBGP对等体
- BGP同步规则指的是:当一台路由器从自己的IBGP对等体学习到一条BGP路由时(这类路由被称为IBGP路由),它不能使用该条路由或者这条路由通告给自己的EBGP对等体,厨房它又从IGP协议(例如OSPF等,此处也包含静态路由)学习到这条路由,也就是要求IBGP路由与IGP路由同步。同步规则主要用于规避BGP路由黑洞问题。
只发布最优路由
通过display bgp routing-table 可以查看bgp路由表:
Total Number of Routes:2 | ||||||
Network | NextHop | MED | LocPrf | PrefVal | Path/Ogn | |
*>i | 10.1.0.1/24 | 11.1.0.1 | 0 | 100 | 0 | ? |
*i | 11.1.0.1 | 0 | 100 | 0 | ? |
在BGP路由表中同时存在以下两个标志的路由为最优,有效路由:
- * :代表有效
- > :代表最优
所以会发送第一条,而不发送第二条
从EBGP对等体获取的路由,会发布给所有的对等体
只要是从EBGP获取到的,除了不发给来的的时候的Peer,都会转发给IBGP和EBGP
IBGP水平分割
从IBGP的Peer获取的BGP路由,不会再发送给其他IBGP对等体。
该原则也被称为IBGP水平分割
如图所示,如果IBGP对等体学习到的路由会继续传递给其他的IBGP对等体:
- R2将一条路由传递给了IBGP对等体R3
- R3收到路由之后传递给IBGP对等体R1
- R1收到路由之后传递给IBGP对等体R2
路由环路产生。所以会有这条原则
但是同时,第三条原则也会来带新的问题,当BGP路由器R2将路由传递给BGP路由器R1时,由于IBGP水平分割原则,R1无法将BGP路由传递给R3,R3将无法学习到路由。
为解决该问题可以采用AS内IBGP全互联的方式,即:R2、R3之间建立非直连的IBGP对等体关系,
以此让BGP路由器R2将路由传递给BGP路由器
R3。
第四条规则
当一台路由器从自己的IBGP对等体学习到一条BGP路由时(这类路由被称为IBGP路由),它不能使用该条路由或者这条路由通告给自己的EBGP对等体,所以它又从IGP协议(例如OSPF等,此处也包含静态路由)学习到这条路由,也就是要求IBGP路由与IGP路由同步。同步规则主要用于规避BGP路由黑洞问题。
在后续的学习中可以使用RR路由反射器,MPLS隧道等技术来解决路由黑洞的问题。
BGP的基本配置
配置介绍:
1.启动BGP进程
]bgp {as-number-plain | as-number-dot}
// plain指的是数字方式的as号,dot指的是as1.2模式的as号
bgp]router-id ipv4-address
// 在bgp视图中,使用router-id命令配置BGP的router id,建议将BGP router ID配置为设备的Loopback接口的地址。
2.配置BGP对等体
bgp]peer {ipv4-address | ipv6-ipaddress} as-number {as-number-plain | as-number-dot}
// 创建BGP对等体,指定对等体的ip地址以及as号
3.配置建立对等体使用的源地址,EBGP对等体的最大跳数
bgp]peer ipv4-address connect-interface interface-type interface-number [ipv4-source-address]
// 指定发送BGP报文的原接口,并可指定发起连接时使用的源地址
bgp]peer ipv4-address ebgp-max-home [hop-count]
// 指定建立EBGP连接允许的最大跳数。缺省情况下,EBGP连接允许的最大跳数为1,即只能在物理直连链路上建立EBGP连接。
4.查看BGP信息
display bgp peer
// 查看Peer表
display bgp routing-table
// 查看bgp路由表
display bgp routing-table 10.1.0.0 24
// 查看具体的一条路由表