BGP简单概述
BGP,边界网关协议。是一种实现自治系统AS之间的路由可达,并选择最佳路由的高级路径矢量路由协议。优先级:255。TCP端口号:179。BGP 4版本。
BGP不产生路由,只负责传递路由,所以TCP可以承载大量的路由;
BGP工作前,必须建立TCP连接,基于TCP工作,这也是BGP协议稳定的原因。
BGP知识点:
BGP 基础配置,BGP 5 种报文,6 种邻居状态,4 大类 细分 10 种属性,IBGP EBGP (环回口 物理接口)建立邻居,BGP 认证,fake-as ,路由传递原则,IBGP 防环,EBGP 防环,RR防环,BGP 路由自动聚合,手工聚合(detail-suppressed,suppress-policy,attribute-policy,origin-policy , as-set ),BGP 5 种 community 属性,BGP 选路,BGP 联盟,路由反射器,BGP路由过滤,引入,下放默认路由。
自治系统AS
AS指的是在同一个组织管理下,使用统一选路策略的设备集合。
BGP网络中的每一个AS都被分配一个唯一的AS号,用于区分不同的AS。
AS号长度分为2字节AS号和4字节AS号。
其中2字节的AS号的范围是1 ~ 65535,其中1 ~ 64511是互联网上注册公有AS号,类似公网IP地址;64512 ~ 65535是私有AS号,类似私网地址。
4字节AS号的范围为1至4294967295。4200000000-4294967294为私有AS号。支持4字节AS号的设备能够与支持2字节AS号的设备兼容。IANA(互联网数字分配机构)负责AS号的分发。
使用BGP传递路由
在AS之间专门使用BGP协议进行路由传递,相较于传统的IGP协议:
- BGP基于TCP,只要能够建立TCP连接即可建立BGP。
- 只传递路由信息,不会暴露AS内的拓扑信息。
- 触发式更新,而不是进行周期性更新。
- 在OSPF里,R1的邻居只有R2。但如果在BGP中,即使非直连,BGP中R1也会和R3建立邻居。
- 触发式更新:只有网络发生变化,才会立即把变化内容发送邻居。
BGP的基本概念
BGP特点
BGP是一种实现自治系统AS之间的路由可达,并选择最佳路由的矢量性协议。
BGP的特点:
- BGP使用TCP作为传输层协议(端口号179),使用触发式路由更新。
- 运行BGP的路由器被称为BGP发言者(BGP Speaker),或BGP路由器。
- 两个建立BGP会话的路由器互为对等体(Peer),或BGP邻居,BGP对等体之间交换BGP路由表。
- BGP能够承载大批量的路由信息,能够支撑大规模网络。
- BGP通常被称为路径矢量路由协议。
- BGP能够支撑MPLS/VPN的应用,传递客户VPN路由。
- BGP提供了路由聚合和路由衰减功能用于防止路由震荡,通过这两项功能有效的提高了网络稳定性。
- 在路径选择上,BGP具有丰富的可操作性,可以在不同场景下选择最合适的路径控制方式。不像IS-IS、OSPF只能通过cost控制路径选择。
BGP对等体
如图1所示,BGP按照运行方式分为EBGP(External/Exterior BGP)和IBGP(Internal/Interior BGP)。
与OSPF、ISIS不同,BGP是基于TCP建立的。建立BGP对等体关系的两台路由器并不要求必须直连。
EBGP对等体优于IBGP对等体。
图1 BGP的运行方式
- EBGP:运行于不同AS之间的BGP称为EBGP。为了防止AS间产生环路,当BGP设备接收EBGP对等体发送的路由时,会将带有本地AS号的路由丢弃。
- IBGP:运行于同一AS内部的BGP称为IBGP。为了防止AS内产生环路,BGP设备不将从IBGP对等体学到的路由通告给其他IBGP对等体,并与所有IBGP对等体建立全连接。
BGP的路由器号(Router ID)
BGP的Router ID是一个用于标识BGP设备的32位值,通常是IPv4地址的形式,在BGP会话建立时发送的Open报文中携带。对等体之间建立BGP会话时,每个BGP设备都必须有唯一的Router ID,否则对等体之间不能建立BGP连接。
BGP的Router ID在BGP网络中必须是唯一的,可以采用手工配置,也可以让设备自动选取。缺省情况下,BGP选择设备上的Loopback接口的IPv4地址作为BGP的Router ID。如果设备上没有配置Loopback接口,系统会选择接口中最大的IPv4地址作为BGP的Router ID。一旦选出Router ID,除非发生接口地址删除等事件,否则即使配置了更大的地址,也保持原来的Router ID。
BGP工作原理
BGP对等体的建立、更新和删除等交互过程主要有5种报文、6种状态机和5个原则。
BGP的报文
BGP对等体间通过以下5种报文进行交互,其中Keepalive报文为周期性发送,其余报文为触发式发送:
- Open报文:协商对等体参数,用于建立BGP对等体连接。
- Update报文:用于在对等体之间交换路由信息。
- Notification报文:用于中断BGP连接。
- Keepalive报文:用于保持BGP连接。
- Route-refresh报文:用于在改变路由策略后请求对等体重新发送路由信息。只有支持路由刷新(Route-refresh)能力的BGP设备会发送和响应此报文。
报文名称 |
作用 |
发送时刻 |
Open |
协商对等体参数,用于建立对等体连接。 |
BGP TCP连接建立成功之后 |
Update |
用于BGP对等体之间交换路由信息。 |
BGP对等体关系建立之后有路由需要发送路由变化时向对等体发送Update报文。 |
Notification |
报告错误信息,中断BGP对等体连接。 |
当BGP在运行中发现错误时,发送Notification报文把错误通告给BGP对等体。 |
Keepalive |
标志对等体建立,保持BGP连接。 |
BGP路由器收到对端发送的Keepalive报文,将对等体状态置位建立,同时后续定期发送Keepalive报文(60s),用于保持连接。 |
Router-refresh |
用于在改变路由策略后请求对等体重新发送路由信息。只有支持路由刷新能力的BGP设备才会发送和响应该报文。 |
当路由策略发生变化时,触发请求对等体重新通告路由。 |
BGP状态机
如图1所示,BGP对等体的交互过程中存在6种状态机:空闲(Idle)、连接(Connect)、活跃(Active)、Open报文已发送(OpenSent)、Open报文已确认(OpenConfirm)和连接已建立(Established)。在BGP对等体建立的过程中,通常可见的3个状态是:Idle、Active和Established。
Peer状态名称 |
用途 |
Idle |
开始准备TCP的连接并监视远程对等体,启用BGP时,要准备足够的资源。 |
Connect |
正在进行TCP连接,等待完成中,认证都是在TCP建立期间完成的。如果TCP连接建立失败则进入Active状态。 |
Active |
表示TCP连接没建立成功,并反复尝试TCP连接。 |
OpenSent |
TCP连接已建立成功,开始发送Open包,Open包携带参数协商对等体的建立。 |
OpenConfirm |
参数、能力特性协商成功,自己发送Keepalive包,等待对方的Keepalive包 |
Established |
已经收到对方的Keepalive包,双方能力特性经协商发现一致,开始使用Update通告路由信息。 |
图1 BGP对等体交互过程
- Idle状态是BGP初始状态。在Idle状态下,BGP拒绝邻居发送的连接请求。只有在收到本设备的Start事件后,BGP才开始尝试和其它BGP对等体进行TCP连接,并转至Connect状态。
说明:
- Start事件是由一个操作者配置一个BGP过程,或者重置一个已经存在的过程或者路由器软件重置BGP过程引起的。
- 任何状态中收到Notification报文或TCP拆链通知等Error事件后,BGP都会转至Idle状态。
- 在Connect状态下,BGP启动连接重传定时器(Connect Retry),等待TCP完成连接。
- 如果TCP连接成功,那么BGP向对等体发送Open报文,并转至OpenSent状态。
- 如果TCP连接失败,那么BGP转至Active状态。
- 如果连接重传定时器超时,BGP仍没有收到BGP对等体的响应,那么BGP继续尝试和其它BGP对等体进行TCP连接,停留在Connect状态。
- 在Active状态下,BGP总是在试图建立TCP连接。
- 如果TCP连接成功,那么BGP向对等体发送Open报文,关闭连接重传定时器,并转至OpenSent状态。
- 如果TCP连接失败,那么BGP停留在Active状态。
- 如果连接重传定时器超时,BGP仍没有收到BGP对等体的响应,那么BGP转至Connect状态。
- 在OpenSent状态下,BGP等待对等体的Open报文,并对收到的Open报文中的AS号、版本号、认证码等进行检查。
- 如果收到的Open报文正确,那么BGP发送Keepalive报文,并转至OpenConfirm状态。
- 如果发现收到的Open报文有错误,那么BGP发送Notification报文给对等体,并转至Idle状态。
- 在OpenConfirm状态下,BGP等待Keepalive或Notification报文。如果收到Keepalive报文,则转至Established状态,如果收到Notification报文,则转至Idle状态。
- 在Established状态下,BGP可以和对等体交换Update、Keepalive、Route-refresh报文和Notification报文。
- 如果收到正确的Update或Keepalive报文,那么BGP就认为对端处于正常运行状态,将保持BGP连接。
- 如果收到错误的Update或Keepalive报文,那么BGP发送Notification报文通知对端,并转至Idle状态。
- Route-refresh报文不会改变BGP状态。
- 如果收到Notification报文,那么BGP转至Idle状态。
- 如果收到TCP拆链通知,那么BGP断开连接,转至Idle状态。
BGP对等体关系的建立
- 先启动的BGP路由器发起TCP连接,使用随机端口号向另一台路由器的179端口发起TCP连接,完成TCP的建立。
- 路由器两端都会发送建立TCP连接,但只会保留其中一个,比较open报文中的Router ID, 小的一方会关闭自己的TCP连接。
- 三次握手建立完成之后,两台BGP路由器相互发送Open报文,携带参数用于对等体的建立,参数协商正常后相互发送Keepalive报文,收到对端的keepalive报文后对等体建立成功,同时双方定期发送该报文用于保持连接。
- BGP对等体关系建立之后,BGP路由器发送update报文通告更新路由信息到对等体。
其中open报文携带:
- 自身AS号
- Hold Time:用于协商后续keepalive报文发送时间
- BGP自身router ID
Keepalive周期发送,60s
Hold Time180s发送
如果邻居之间keepalive发送时间不一致,则会选择小的时间当作keepalive发送时间
TCP连接源地址:
缺省情况下,BGP使用报文出接口作为TCP连接的本地接口。
在部署IBGP对等体,建议使用loopback地址作为更新源地址。稳定。
在部署EBGP对等体,建议使用直连接口作为源地址。
如果是EBGP建立邻居,要注意EBGP多跳的问题。
BGP对等体之间的交互原则
BGP设备将最优路由加入BGP路由表,形成BGP路由。BGP设备与对等体建立邻居关系后,采取以下交互原则:
- 从IBGP对等体获得的BGP路由,BGP设备只发布给它的EBGP对等体。
- 从EBGP对等体获得的BGP路由,BGP设备发布给它所有EBGP和IBGP对等体。
- 当存在多条到达同一目的地址的有效路由时,BGP设备只将最优路由发布给对等体。
- 路由更新时,BGP设备只发送更新的BGP路由。
- 所有对等体发送的路由,BGP设备都会接收。
BGP的表项
BGP对等体表
Peer:对等体IP地址
V:版本号
AS:对等体AS号
Up/Down:对等体存在up/down的时间
State:对等体状态
PrefRcv:从该对等体收到的路由前缀数目
BGP路由表
Network:路由的目的网络地址以及掩码
Nexthop:下一跳地址
查看某条路由更详细的信息,可以通过display bgp routing-table 地址+掩码
BGP路由的生成
BGP注入路由的方式有两种:
Network
import-router
与IGP协议相同,BGP支持根据已有的路由条目进行聚合,生成聚合路由。
聚合路由也是路由生成的一种方式。
Network方式注入的路由必须是已经存在于IP路由表中的路由条目,否则不会被成功注入到BGP路由表中 。
Network方式注入路由虽然是精确注入,但是只能一条条配置,如果注入路由条目较多,可以使用import-route方式。
BGP聚合路由
支持自动聚合和手动聚合。
自动聚合只能聚合引入的路由,network的路由聚合不了。 summary automatic
aggregate 10.1.0.0 22 detail-suppressed
如果不带后面detail-suppressed的话,那么将会学习明细路由和聚合路由。如果指定了这条命令,那么只通告聚合后的路由。
BGP通告原则
BGP通过network、import-route、aggregate聚合方式生成BGP路由后,通过Update报文将BGP路由传递给对等体。
BGP通告遵循以下原则:
- 只发布最优且有效路由。
- 从EBGP对等体获取的路由,会发布给所有对等体。
- IBGP水平分割:从IBGP对等体获取的路由,不会发送给IBGP对等体。
- BGP同步规则指的是:当一台路由器从自己的IBGP对等体学习到一条BGP路由时(这类路由被称为IBGP路由),它将不能使用该条路由或把这条路由通告给自己的EBGP对等体,除非它又从IGP协议(例如OSPF等,此处也包含静态路由)学习到这条路由,也就是要求IBGP路由与IGP路由同步。同步规则主要用于规避BGP路由黑洞问题。
第4条总结:从IBGP邻居学到的路由,如果要发给EBGP邻居,那么这条路由必须存在IGP路由表中。
路由黑洞:如果两台设备跨跳的建立了IBGP邻居,但是中间设备没有运行BGP,那么当数据转发到这台设备后,他没有路径可走,会被丢弃
1和3建立邻居,经过2时,会被丢弃,因为2没有建立BGP。
IGBP防环:水平分割
EBGP防环:AS Path
BGP通告遵循以下原则
- 只发布最优路由。 *代表可用路由 >代表最优路由
- 从EBGP对等体获取的路由,会发布给所有对等体。
- 比如R2从R3获取到了2.2.2.2/24的路由,R2会发布给R1,同样,R2也会发给R4。
- IBGP水平分割:从IBGP对等体获取的路由,不会发送给IBGP对等体。
- 比如R1、R2、R3同属于IBGP对等体,R1从R2获取的路由,R1不会发送给R3,如果R3需要获取R2的路由,可以直接由R2发给R3。
- BGP同步规则指的是:当一台路由器从自己的IBGP对等体学习到一条BGP路由时(IBGP路由),它将不能使用该条路由通告给自己的EBGP对等体,除非它又从IGP协议(例如OSPF、静态)学习到这条路由,也就是要求IBGP路由和IGP路由同步。同步规则主要是用于路由黑洞。
- 路由黑洞是指在BGP路由条目中有这条路由,但ping不通。
- BGP同步规则一般取消。
- 系统自动生成的命令。
BGP路由通告原则
第一条原则:只发布最优且有效(下一跳可达)的路由。
通过display bgp routing-table查看路由表
*代表有效
>代表最优
第二条原则:从EBGP对等体获取的路由,会发布给所有对等体。
R2从EBGP对等体获取的BGP路由,会发布给所有EBGP、IBGP对等体。
第三条原则:从IBGP对等体获取的路由,不会再发送给其他IBGP对等体。
该原则被称为“水平分割”。
如图所示,如果IBGP对等体学习到的路由会继续传递给其他的IBGP对等体:
- R2将一条路由传递给了IBGP对等体R3
- R3收到路由之后传递给IBGP对等体R1
- R1继续传递给IBGP对等体R2
路由环路形成。
但这条原则可能会带来当R2将路由传递给R1时,由于第三条原则限制,R1无法传递给R3,R3就学习不到路由。为解决该问题可以采用AS内IBGP全互联方式,即:R2、R3之间建立非直连的IBGP对等体关系,以此让R2可以将路由传递给R3。
第四条原则:当一台BGP路由器从自己的IBGP对等体学习到一条BGP路由时(IBGP路由),它将不能使用该条路由或把这条路由通告给自己的EBGP对等体,除非它又从IGP协议路由学习到这条路由,该条路由也被称为BGP同步原则。
如图所示:
1.BGP路由器R4上存在一条路由10.0.4.0/24,R4将其传递给了R2。
2.R2将路由传递给非直连IBGP对等体R3。
3.R3将路由传递给R5。
4.之后R5向10.0.4.4发起访问。
R5访问10.0.4.4:
1.R5查找路由表,将报文发给R3。
2.R3收到报文后查找路由表,匹配到一条BGP路由。其下一跳为R2,但是R2为非直连下一跳,需要进行路由迭代,通过IGP学习到的路由迭代下一跳为R1。R3将报文发给R1。
3.R1收到报文后查找路由表,因为R1并非BGP路由器,未与R2建立IBGP对等体关系,因此R1上并无BGP路由10.0.4.0/24,路由查找失败,R1将报文丢弃。
产生该问题原因为AS200域内未运行BGP的路由器没有学习到BGP的路由条目,查找路由失败,导致R1丢弃报文。为此制定了BGP同步原则:
当BGP的路由条目同时也存在于IGP路由表时才对外发送,以图中为例,当R3查看IGP(R1)路由表时,OSPF路由表中并无路由10.0.4.0/24,因此不会向R5发送该路由,自然也不会产生后续的访问失败。
解决该问题的方式有:
- 把BGP路由重分发到IGP,但基本不用;
- 建立全互联的IBGP对等体关系,让全网所有路由器都拥有BGP路由。
BGP的基本配置
1.启动BGP进程
[Huawei]bgp [Huawei]router-id x.x.x.x
启动BGP,指定本地AS号,并进入BGP视图。使用router-id命令配置BGP的router-id,建立配置为loopback的地址。
2.配置BGP对等体
[Huawei]peer x.x.x.x as-number //x.x.x.x是BGP对等体的IP地址,as-number也是对等体的AS号
创建BGP对等体,指定对等体地址和编号
3.配置建立对等体使用的源地址、EBGP对等体最大跳数
[Huawei]peer x.x.x.x connect-interface [Huawei]peer x.x.x.x ebgp-max-hop
指定发送BGP报文的源接口,并可指定发起连接时使用的源地址。如果是环回口,要加connect-interface
指定建立EBGP连接允许的最大跳数。如果是环回口,要下ebgp-max-hop,最少是2跳,