BGP 协议 电脑版发表于:2022/10/8 17:29 ![](https://img.tnblog.net/arcimg/hb/e4ea9a230f7c459a812dd0468feff187.png) >#BGP 协议 [TOC] ##BGP 协议介绍 tn2>BGP 全称是 Border Gateway Protocol, 对应中文是边界网关协议。 BGP是互联网上一个核心的去中心化自治路由协议。 从这个解释来看,首先这是一个用于互联网(Internet)上的路由协议。它的地位是核心的(目前是最重要的,互联网上唯一使用的路由协议),它的目的是去中心化,以达到各个网络自治。不过还是有点抽象。 先看看几个相关的概念: | 名词概念 | 描述 | | ------------ | ------------ | | AS(Autonomous system)<br/>自治系统 | 指在一个(有时是多个)组织管辖下的所有IP网络和路由器的全体,它们对互联网执行共同的路由策略。也就是说,对于互联网来说,一个AS是一个独立的整体网络。而BGP实现的网络自治也是指各个AS自治。每个AS有自己唯一的编号。 | | IGP(Interior Gateway Protocol)<br/>内部网关协议 | 在一个AS内部所使用的一种路由协议。一个AS内部也可以有多个路由器管理多个网络。各个路由器之间需要路由信息以知道子网络的可达信息。IGP就是用来管理这些路由。代表的实现有RIP和OSPF。 | | EGP(Exterior Gateway Protocol)<br/>外部网关协议 | 在多个AS之间使用的一种路由协议,现在已经淘汰,被BGP取而代之。| tn2>由于BGP就是为了替换EGP而创建,它的地位与EGP相似。 但是BGP也可以应用在一个AS内部。 因此BGP又可以分为IBGP(Interior BGP :同一个AS之间的连接)和EBGP(Exterior BGP:不同AS之间的BGP连接)。 既然EGP已经被替代了,那EBGP的存在比较好理解,但是IGP协议都还活得好好的(这里指的是OSPF),那IBGP的意义何在? IGP的协议是针对同一个AS网络来设计的,一个自治网络的规模一般都不大,所以设计的时候就没有考虑大规模网络的情况。 而当一个自治网络足够大时,OSPF存在性能瓶颈(后面会说明)。 BGP本身就是为了在Internet工作,其设计就是为了满足大型网络的要求,所以大型私有IP网络内部可以使用IBGP。总的来说,这几类路由协议,小规模私有网络IGP,大规模私有网络IBGP,互联网EBGP。 ![](https://img.tnblog.net/arcimg/hb/5f47695d8b384d75ad4c2fe0a0abe508.png) >### 定义 tn2>边界网关协议BGP(Border Gateway Protocol)是一种实现自治系统AS(Autonomous System)之间的路由可达,并选择最佳路由的距离矢量路由协议。早期发布的三个版本分别是BGP-1、BGP-2和BGP-3,1994年开始使用BGP-4,2006年之后单播IPv4网络使用的版本是BGP-4,其他网络(如IPv6等)使用的版本是MP-BGP。 MP-BGP是对BGP-4进行了扩展,来达到在不同网络中应用的目的,BGP-4原有的消息机制和路由机制并没有改变。 MP-BGP在IPv6单播网络上的应用称为BGP4+,在IPv4组播网络上的应用称为MBGP(Multicast BGP)。 >### 目的 tn2>为方便管理规模不断扩大的网络,网络被分成了不同的自治系统。1982年,外部网关协议EGP(Exterior Gateway Protocol)被用于实现在AS之间动态交换路由信息。 但是EGP设计得比较简单,只发布网络可达的路由信息,而不对路由信息进行优选,同时也没有考虑环路避免等问题,很快就无法满足网络管理的要求。 BGP是为取代最初的EGP而设计的另一种外部网关协议。不同于最初的EGP,BGP能够进行路由优选、避免路由环路、更高效率的传递路由和维护大量的路由信息。 虽然BGP用在AS之间传递路由信息,但并非所有AS之间传递路由信息都要运行BGP。如数据中心上行到Internet的出口上,为了避免Internet海量路由对数据中心内部网络影响,设备采用静态路由代替BGP与外部网络通信。 >### 受益 tn2>BGP从多方面保证了网络的安全性、灵活性、稳定性、可靠性和高效性: BGP采用认证和GTSM的方式,保证了网络的安全性。 BGP提供了丰富的路由策略,能够灵活的进行路由选路,并且能指导邻居按策略发布路由。 BGP提供了路由聚合和路由衰减功能用于防止路由振荡,有效提高了网络的稳定性。 BGP使用TCP作为其传输层协议(端口号为179),并支持BGP与BFD联动、BGP Tracking和BGP GR和NSR,提高了网络的可靠性。 在邻居数目多、路由量大且大多邻居有相同出口策略场景下,BGP用按组打包技术极大提高了BGP打包发包性能 更多名词定义: | 名词概念 | 描述 | | ------------ | ------------ | | BGP | 1. 边界网关协议(Border Gateway Protocol)是互联网上一个核心的去中心化自治路由协议,它通过维护IP路由表或前缀表来实现自治系统(AS)之间的可达性 <br/> 2. 大多数ISP使用BGP来与其他ISP创建路由连接,特大型的私有IP网络也可以使用BGP <br/> 3. BGP的通信对端(对等实体,Peer)通过TCP(端口179)会话交换数据,BGP路由器会周期地发送19字节的保活消息来维护连接。在路由协议中,只有BGP | | IBGP | 内部边界网关协议。同一个AS内部的两个或多个对等实体之间运行的BGP被称为IBGP | | IGP | 1. 一个IGP内部应该仅有数十(最多小几百)个对等实体 <br/> 2. 对于端点数,也存在限制,一般在数百(最多上千)个Endpoint级别 <br/> IBGP和IGP都是处理AS内部路由的,仍然需要IGP的原因是:<br/>(1) IBGP之间是TCP连接,也就意味着IBGP邻居采用的是逻辑连接的方式,两个IBGP连接不一定存在实际的物理链路。所以需要有IGP来提供路由,以完成BGP路由的递归查找 | | EBGP | 外部边界网关协议。归属不同的AS的对等实体之间运行的BGP称为EBGP。 | | Border Router | 边界路由器,在AS边界上与其他AS交换信息的路由器 | | AS | 自治系统(Autonomous system),一个组织(例如ISP)管辖下的所有IP网络和路由器的整体。<br/>参与BGP路由的每个AS都被分配一个唯一的自治系统编号(ASN)。对BGP来说ASN是区别整个相互连接的网络中的各个网络的唯一标识。64512到65535之间的ASN编号保留给专用网络使用 | | Route Reflector | 1. 同一AS内如果有多个路由器参与BGP路由,则它们之间必须配置成全连通的网状结构——任意两个路由器之间都必须配置成对等实体。由于所需要TCP连接数是路由器数量的平方,这就导致了巨大的TCP连接数 <br/> 为了缓解这种问题,BGP支持两种方案:Route Reflector、Confederations <br/>路由反射器(Route Reflector)是AS内的一台路由器,其它所有路由器都和RR直接连接,作为RR的客户机。RR和客户机之间建立BGP连接,而客户机之间则不需要相互通信 <br/> RR的工作步骤如下:<br/>(1)从非客户机IBGP对等实体学到的路由,发布给此RR的所有客户机 <br/>(2)从客户机学到的路由,发布给此RR的所有非客户机和客户机<br/>(3)从EBGP对等实体学到的路由,发布给所有的非客户机和客户机<br/>RR的一个优势是配置方便,因为只需要在反射器上配置 | | 工作负载 | Workload,即运行在Calico节点上的虚机或容器 | | 全互联 | 全互联网络(Full node-to-node Mesh)是指任何两个Calico节点都进行配对的L3连接模 | tn2>通过下面的这副图中关于BGP的理解将会更加清晰。 ![](https://img.tnblog.net/arcimg/hb/2593c123437544ceb53af009972f15bc.png) tn2>BGP使用TCP为传输层协议,TCP端口号179。路由器之间的BGP会话基于TCP连接而建立。 运行BGP的路由器被称为BGP发言者(BGP Speaker),或BGP路由器。 两个建立BGP会话的路由器互为对等体(Peer)。BGP对等体之间交换BGP路由表。 BGP路由器只发送增量的BGP路由更新,或进行触发更新(不会周期性更新)。 BGP具有丰富的路径属性和强大的路由策略工具。 BGP能够承载大批量的路由前缀,用于大规模的网络中 BGP通常被称为路径矢量路由协议(Path-Vector Routing Protocol)。 每条BGP路由都携带着多种路径属性(Path attribute),在各种路径属性中,AS_Path属性是非常关键的一个。AS_Path属性记录了BGP路由传递过程中所经过的AS号,实际上它是一个AS号的列表。 BGP路由器不接受AS_Path中包含其自身AS号的路由更新。AS_Path属性值的长短(AS号的个数)会作为一个比较的依据,影响BGP路由选择的决策。 ## 关于BGP包的格式 ![](https://img.tnblog.net/arcimg/hb/c20562fd18aa4b97a8321ccfebb3953f.png) tn2>BGP报文类型字段解释: | 报文名称 | 作用 | 发包场景 | | ------------ | ------------ | ------------ | | Open | 协商BGP邻居的各项参数,建立邻居关系。 | BGP对等体之间需先建立TCP连接,如果TCP连接成功,那么BGP向对等体发送Open报文。 | | Update | 用于发送BGP路由信息。 | 连接建立后,有路由需要发送或路由变化时,发送UPDATE通告对端路由信息。 | | Notification | 报告错误,中止对等体关系。 | 当BGP在运行中发现错误时,要发送NOTIFICATION报文通告BGP对端。 | | Keepalive | 维持BGP对等体关系。 | 定时发送Keepalive报文以保持BGP对等体关系的有效性。 | | Route-refresh | 用于在改变路由策略后请求对等体重新发送路由信息。只有支持路由刷新能力的BGP设备会发送和响应此报文。 | 当路由策略发生变化时,触发请求对等体重新通告路由。 | ## IBGP 与 EBGP ![](https://img.tnblog.net/arcimg/hb/54746aa076574c9b817883c9188313f0.png) tn2>IBGP(Internal BGP):位于相同自治系统的BGP路由器之间的BGP邻接关系。 两台路由器之间要建立IBGP对等体关系,必须满足两个条件: 1.两个路由器所属AS需相同(也即AS号相同)。 2.在配置BGP时,Peer命令所指定的对等体IP地址要求路由可达,并且TCP连接能够正确建立<br/> EBGP(External BGP):位于不同自治系统的BGP路由器之间的BGP邻接关系。 两台路由器之间要建立EBGP对等体关系,必须满足两个条件: 1.两个路由器所属AS不同(也即AS号不同)。 2.在配置BGP时,Peer命令所指定的对等体IP地址要求路由可达,并且TCP连接能够正确建立. tn>这里可能有疑问的是IBGP既然能够使R1与R3邻接相通,那关OSPF什么事情? 我们可以把IBGP想象成IGP的更上一层的抽象,IGP的具体实现这里是OSPF,作用在于主动学习路由。 通过IBGP开放的端口更新相关路由表,但学习是ospf学习得到的。 当与不同的AS进行连接时,对方可以不需要加入OSPF网络。 还有就是不同的路由协议它可以进行宣告,OSPF当宣告的数量一多会造成严重的性能问题(它的宣告容量是有限的),而BGP不会。 ## BGP的路由学习 ![](https://img.tnblog.net/arcimg/hb/d2992f97d3ca49d897e90e0718964186.png) tn2>为了保证中转AS300内所有路由器都能学习到完整的BGP路由信息,我们不得不在该AS内的每一台路由器上运行BGP并且建立全互联的IBGP对等体关系。 为了防止AS内产生环路,BGP设备不将从IBGP对等体学到的路由通告给其他IBGP对等体,并与所有IBGP对等体建立全连接 tn>简单来讲C与B、D、E成为对等体,我直接从BDE中拿取它们的路由表,并且不让他们告诉其他人。 B、D、E以此内推。 ## Demo 配置演示 ![](https://img.tnblog.net/arcimg/hb/394ad92c748a47a0bf8668f95810150e.png) tn2>需要完成如下要求: 1.R1、R2及R3属于AS123,R4属于AS 400; 2.AS123内的R1、R2及R3运行OSPF,通告各自直连接口(包括三台设备的Loopback0接口),注意OSPF域的工作范围;所有设备的Loopback0接口地址为x.x.x.x/32,其中x为设备编号(如R1的接口地址为1.1.1.1/32)。 3.R3与R4之间建立EBGP对等体关系,R2暂时不运行BGP,R1与R3之间建立IBGP对等体关系,所有的BGP对等体关系基于直连接口建立;R4将直连路由4.4.4.4/32通告到BGP,要求R1能学习到BGP路由4.4.4.4/32; 4.修改BGP配置,使得R1与R3基于Loopback0接口建立IBGP对等体关系 ![](https://img.tnblog.net/arcimg/hb/26f61a5c523a401d95c9ff54b82fb782.png) tn2>配置AR1 设备的 g0/0/0 接口的IP为`10.1.12.1`,并添加Loopback0接口地址为`1.1.1.1`。 ```bash system-view sysname AR1 int g0/0/0 ip a 10.1.12.1 24 dis this int L 0 ip a 1.1.1.1 32 dis this q ``` ![](https://img.tnblog.net/arcimg/hb/777f31deb51449369b6c394fd735e884.png) tn2>配置AR2 设备的 g0/0/0 接口的IP为`10.1.12.2`,g0/0/1 接口的IP为`10.1.23.2`,并添加Loopback0接口地址为`2.2.2.2`。 ```bash system-view sysname AR2 int g0/0/0 ip a 10.1.12.2 24 int g0/0/1 ip a 10.1.23.2 24 int L 0 ip a 2.2.2.2 32 dis this q ``` ![](https://img.tnblog.net/arcimg/hb/ecb2266da1c146588ae59704e354a17c.png) tn2>配置AR3 设备的 g0/0/0 接口的IP为`10.1.23.3`,并添加Loopback0接口地址为`3.3.3.3`。 ```bash system-view sysname AR3 int g0/0/0 ip a 10.1.23.3 24 dis this int L 0 ip a 3.3.3.3 32 dis this dis ip int b q ``` ![](https://img.tnblog.net/arcimg/hb/00661fde7c9d4b1ea02a342437c241ce.png) tn2> 直连ping测试。 ```bash # AR3 ping 测试 ping 10.1.23.2 # AR1 ping 测试 ping 10.1.12.2 ``` ![](https://img.tnblog.net/arcimg/hb/282ddf30fff54d1c81e9fabdddc0b2d1.png) ![](https://img.tnblog.net/arcimg/hb/2e7ea2d2e2d64933a4bbf4b223dc0cca.png) tn2>配置AR1的OSPF,设置router-id为`1.1.1.1`,区域为0,并宣告所有的网络。 ```bash ospf router-id 1.1.1.1 # 相当于 area 0.0.0.0 A 0 network 0.0.0.0 255.255.255.255 dis this q ``` ![](https://img.tnblog.net/arcimg/hb/7dc81b9fe48e4ecf8ab25bf7a27f0c2e.png) tn2>配置AR2的OSPF ```bash ospf router-id 2.2.2.2 A 0 network 0.0.0.0 255.255.255.255 dis this q q ``` ![](https://img.tnblog.net/arcimg/hb/54654e784c8041c8838a1afdca9b02a6.png) tn2>配置AR3的OSPF ```bash ospf router-id 3.3.3.3 A 0 network 0.0.0.0 255.255.255.255 dis this dis ospf peer dis ospf peer B ``` ![](https://img.tnblog.net/arcimg/hb/1996e731291d474cb4de407bd31f6dcc.png) tn2>配置AR1的BGP,由于我们需要映射AR1与AR3的通信所以我们需要peer AR1的,以此类推。 ```bash bgp 123 router-id 1.1.1.1 peer 3.3.3.3 as-number 123 peer 3.3.3.3 connect-interface L0 ``` tn2>配置AR3的BGP ```bash bgp 123 router-id 3.3.3.3 peer 1.1.1.1 as-number 123 peer 1.1.1.1 connect-interface L0 # 查看bgp peer dis bgp peer # 进入bgp内部 dis this int L 11 ip a 33.33.33.33 32 q bgp 123 router-id 3.3.3.3 network 33.33.33.33 32 # 查看当前peer dis this # 查看当前BGP peer dis bgp routing-table ``` ![](https://img.tnblog.net/arcimg/hb/23c0b3c22d7642a39216b5490ce7dfaa.png) tn2>这里符号的意义 | 符号 | 描述 | | ------------ | ------------ | | `*` | 可用的(不可用:R,从更小AD值的IGP中学到了该路由,因此不用BGP路由;s,聚合时明细路由被抑制)| | `>` | 优化的(要确保>号出来,才能放进路由表,才能继续传给EBGP邻居)| | `i` | >号后面的i代表从IBGP学到的路由,本地通告的/从EBGP学到的路由不打i | | `?` | 重发布得来的 | tn2>然后我们到AR1中查看路由表,发现它已经发现了`33.33.33.33`但是并不是IBGP协议,而是ofsp协议。 ```bash system-view bgp 123 dis ip routing-table ``` ![](https://img.tnblog.net/arcimg/hb/a6d5b195cb294477946e12e02b62ac7d.png) tn>我们还会在后面说到这个问题。 tn2>AR3与AR4打通EBGP连接 ```bash system-view sysname AR4 int g0/0/0 ip a 10.1.34.4 24 int L0 ip a 4.4.4.4 32 q ``` ![](https://img.tnblog.net/arcimg/hb/b2d0bf26406d4f479b7850e18215d4b6.png) tn2>设置AR3与AR4的直连,并设置直连区域为400 ```bash system-view int g0/0/1 ip a 10.1.34.3 24 dis this ping 10.1.34.4 # 配置BGP bgp 123 peer 10.1.34.4 as-number 400 ``` tn2>设置AR4的EBGP ```bash bgp 400 router-id 4.4.4.4 network 4.4.4.4 32 peer 10.1.34.3 as-number 123 dis bgp peer # 测试直连 ping 10.1.34.3 dis bgp peer dis bgp routing-table ``` ![](https://img.tnblog.net/arcimg/hb/293d01b2ae994bd5a461ec4d18df4d5f.png) tn2>我们发现它还是OSPF的连接,而不是IBGP的连接。 问题在于我们宣告的时候是`0.0.0.0`。 所以我们需要先解除`0.0.0.0`的网络宣告对应到每个32位,然后将我们的环卫口(`3.3.3.3`)添加到我们的bgp中,最后再刷新bgp。 ```bash # AR2 ospf router-id 2.2.2.2 a 0 undo network 0.0.0.0 255.255.255.255 network 10.1.12.0 0.0.0.255 network 10.1.23.0 0.0.0.255 dis this dis ospf peer b # AR1 刷新 bgp 123 refresh bgp external import # 去掉AR3的ospf 0.0.0.0 配置 ospf router-id 3.3.3.3 area 0 undo network 0.0.0.0 255.255.255.255 network 10.1.23.0 0.0.0.255 # AR3 配置环卫口 network 3.3.3.3 0.0.0.0 ``` ![](https://img.tnblog.net/arcimg/hb/c50f1847f3784fb4881b62ff7edb62f6.png) ![](https://img.tnblog.net/arcimg/hb/dc85761d3d6b4029bd0b7e5a1222edc9.png)