16.BGP

发布时间 2023-09-12 18:09:05作者: 姬雨晨

BGP是一种路径矢量协议,主要用于在自治系统(AS)之间进行路由信息的交换。BGP的主要作用是在互联网上提供一种可扩展的路由系统,使得不同的网络可以互相通信。

BGP有两种运行方式,当BGP运行于同一AS内部时,被称为IBGP(Internel BGP,内部边界网关协议);当BGP运行于不同AS之间时,称为EBGP(Externel BGP,外部边界网关协议)。

BGP就被设计成一种域间路由选择协议,其设计目标就是策略控制能力和可扩展性。

BGP是怎么工作的?

BGP报文中的角色

Speaker:发送BGP报文的路由设备称为BGP发言者(Speaker),它接收或产生新的路由信息,并发布(Advertise)给其它BGP Speaker。当BGP Speaker收到来自其它AS的新路由时,如果该路由比当前已知路由更优、或者当前还没有该路由,它就把这条路由发布给所有其他BGP Speaker(发布该路由的BGP Speaker除外)。

Peer:相互交换报文的BGP Speaker之间互称对等体(Peer)。

BGP的报文

BGP的运行是通过报文驱动的,共有Open、Update、Notification、Keepalive和Route-refresh五种报文类型。

  • Open报文:是TCP连接建立后发送的第一个报文,用于建立BGP对等体之间的连接关系。对等体在接收到Open报文并协商成功后,将发送Keepalive报文确认并保持连接的有效性。确认后,对等体间可以进行Update、Notification、Keepalive和Route-refresh报文的交换。协商BGP参数

  • Update报文:用于在对等体之间交换路由信息。Update报文可以发布多条属性相同的可达路由信息,也可以撤销多条不可达路由信息。交换路由信息

  • Keepalive报文:BGP会周期性地向对等体发出Keepalive报文,用来保持连接的有效性。保持邻居关系

    OSPF的hello报文的作用是建立邻居保持邻居。

  • Notification报文:当BGP检测到错误状态时,就向对等体发出Notification报文,之后BGP连接会立即中断。差错通知

  • Route-refresh报文:Route-refresh报文用来请求对等体重新发送所有的可达路由信息。用于在改变路由策略后请求对等体重新发送路由信息

BGP处理过程

因为BGP的传输层协议是TCP协议,所以在BGP对等体建立之前,对等体之间首先进行TCP连接。

BGP邻居间会通过Open报文协商相关参数,建立起BGP对等体关系。

建立连接后,BGP邻居之间交换整个BGP路由表。

BGP会发送Keepalive报文来维持邻居间的BGP连接。

BGP协议不会定期更新路由表,但当BGP路由发生变化时,会通过Update报文增量地更新路由表。

当BGP检测到网络中的错误状态时(例如收到错误报文时),BGP会发送Notification报文进行报错,BGP连接会随即中断。

图1-3 邻居建立过程图

BGP有限状态机

在BGP对等体建立的过程中,BGP有限状态机共有六种状态,分别是Idle、Connect、Active、Open-Sent、Open-Confirm和Established,通常可见的三个状态是:Idle、Active、Established。

  1. Idle(空闲):这是BGP会话的初始状态。在此状态下,路由器关闭所有已经存在的BGP连接,并开始初始化BGP资源。路由器会等待开始事件的发生,然后转移到Connect状态。

  2. Connect(连接):在此状态下,路由器尝试建立TCP连接。如果连接成功,路由器将转移到OpenSent状态。如果连接失败,路由器将转移到Active状态。

  3. Active(活动):在此状态下,路由器继续尝试建立TCP连接。如果连接成功,路由器将转移到OpenSent状态。如果连接尝试失败,路由器将继续保持在Active状态。中间状态

  4. OpenSent(开启发送):在此状态下,路由器已经发送了一个OPEN消息,并等待对方的OPEN消息。如果收到的OPEN消息是有效的,路由器将转移到OpenConfirm状态。

  5. OpenConfirm(开启确认):在此状态下,路由器已经收到了对方的OPEN消息,并等待KEEPALIVE或NOTIFICATION消息。如果收到的是KEEPALIVE消息,路由器将转移到Established状态。

  6. Established(已建立):在此状态下,路由器可以发送/接收UPDATE、KEEPALIVE、NOTIFICATION和ROUTE-REFRESH消息。这是BGP会话的正常工作状态。

这些状态的转换是由BGP的有限状态机(FSM)控制的,每个状态都有明确的输入和输出条件。

BGP对等体双方的状态必须都为Established,BGP邻居关系才能成立,双方通过Update报文交换路由信息。

image-20230831213958143

BGP邻居建立与路由引入

IBGP间的邻居关系建立-示例

image-20230909000428459

R1

<Huawei>sys
[Huawei]sys R1
[R1]inter gi 0/0/0
[R1-GigabitEthernet0/0/0]ip add 12.1.1.1 30
[R1-GigabitEthernet0/0/0]inter loop0
[R1-LoopBack0]ip add 1.1.1.1 32
[R1-LoopBack0]q
[R1]bgp 100
[R1-bgp]peer 2.2.2.2 as-number 100

R2

<R2>sys
[R2]sys R2
[R2]inter gi 0/0/0
[R2-GigabitEthernet0/0/0]ip add 12.1.1.2 30
[R2-GigabitEthernet0/0/0]inter loop0
[R2-LoopBack0]ip add 2.2.2.2 32
[R2-LoopBack0]q
[R2]bgp 100
[R2-bgp]peer 1.1.1.1 as-number 100

问题1:此时状态处于Idle状态,因为路由不通

image-20230908233555546

两边路由不通,解决办法添加静态路由

[R1]ip route-static 2.2.2.2 32 12.1.1.2
[R2]ip route-static 1.1.1.1 32 12.1.1.1

问题2:此时邻居开始建立,但状态处于Active状态,即TCP/IP状态建立失败。

image-20230908234623798

原因:目的地址2.2.2.2的出接口是G/0/0/0,TCP/IP的SYN报文在封装的时候就会以出接口的IP地址作为源地址去封装,也就是12.1.1.1;R2在收到SYN报文后会检查SYN报文,源地址2.2.2.2证明是发给R2处理的,但是源地址是12.1.1.1与R2的邻居配置冲突,R2不想跟他做邻居,就会回复一个RST报文,三次握手建立失败。

image-20230908235049226

image-20230831221140917

回复一个RST报文,TCP/IP三次握手连接建立失败。

image-20230908235305458

解决办法:将源IP12.1.1.1改为1.1.1.1,这个技术就叫做更新源。

[R1]bgp 100
[R1-bgp]peer 2.2.2.2 connect-interface LoopBack 0              #将目的地址为2.2.2.2的路由的源地址修改为loopback0的地址

[R2]bgp 100
[R2-bgp]peer 1.1.1.1 connect-interface LoopBack 0

其实配一边的话TCP/IP就能建立,BGP就能走,但是为了健壮性还是两边都配。

image-20230908235951621

三次握手建立成功后,BGP邻居建立成功。

image-20230909000043617

问题3:如果处于Connect状态的原因:

  1. 对端没有回程路由
  2. 中间有防火墙,没有放通BGP端口号(BGP的端口号:179)

路由引入

BGP协议自身不能发现路由,所以需要引入其他协议的路由(如IGP或者静态路由等)注入到BGP路由表中,从而将这些路由在AS之内和AS之间传播。

BGP引入路由时支持Import和Network两种方式:

Import方式是按协议类型,将RIP路由、OSPF路由、IS-IS路由、静态路由和直连路由等某一协议的路由注入到BGP路由表中;

Network方式比Import方式更精确,将指定前缀和掩码的一条路由注入到BGP路由表中。

添加两个loopback地址来模拟用户

[R1]int loop 1
[R1-LoopBack1] ip address 100.1.1.1 32


[R2]int loop 1
[R2-LoopBack1] ip address 200.1.1.1 32

此时BGP已经起来了,但是是没有学到任何路由的。

image-20230909113014772

image-20230909114536700

R1上将静态路由全部进入BGP

[R1]bgp 100
[R1-bgp]import-route static                  #引入静态路由

R2引入路由

[R2]bgp 100
[R2-bgp]network 200.1.1.1 32

引入的时候这条路由必须存在于本地路由表中

R1的路由

image-20230909114846955

image-20230909115837178

R2的路由

image-20230909115106845

image-20230909120435929

向BGP中引入直连的路由

[R1]bgp 100
[R1-bgp]import-route direct                 #引入直连路由

image-20230909120031567

image-20230909120043501

image-20230909120637473

image-20230909120144315

两种引入方式的优先级

使用network将100.1.1.1重新发布一下

这里只显示network引入的100.1.1.1,因为network引入的优先级高于import的,所以不会发布这条路由给对等体的。

image-20230909121130935

* 表示有效
> 表示最优

Path/Ogn 表示路由的引入方式

i 表示使用network引入的

? 表示使用import-route引入的

EBGP间的邻居关系建立-示例R3

image-20230910121337612

R2

[R2]inter gi 0/0/1
[R2-GigabitEthernet0/0/1]ip add 23.1.1.2 30

R3

[R3]inter gi 0/0/0
[R3-GigabitEthernet0/0/0]ip add 23.1.1.1 3
[R3-GigabitEthernet0/0/0]inter loop 0
[R3-LoopBack0]ip add 3.3.3.3 32

静态路由

[R2]ip route-static 3.3.3.3 32 23.1.1.1

[R3]ip route-static 2.2.2.2 32 23.1.1.2

配置邻居关系与更新源

[R2]bgp 100
[R2-bgp]peer 3.3.3.3 as-number 200
[R2-bgp]peer 3.3.3.3 connect-interface LoopBack 0

[R2]bgp 200
[R3-bgp]peer 2.2.2.2 as-number 100
[R3-bgp]peer 2.2.2.2 connect-interface LoopBack 0

问题1:报文开起来正常,但是邻居状态处于Idle状态

image-20230910120540551

image-20230910120916734

报文看起来正常,但是为什么处于Idle状态呢?

保护机制:

对等体在同一个AS内部的话,就是互相可信的,ttl默认为255

EBGP为了安全,TTL默认为1,也就是经过1条,就会被丢弃。

loopback到loopback至少需要2跳,1跳是不够的,这就导致邻居建不起来

解决方法:将默认的ttl改了,将ttl改为2(如果够的话),两边都要配

[R2]bgp 100
[R2-bgp]peer 3.3.3.3 ebgp-max-hop 2

[R3]bgp 200
[R3-bgp]peer 2.2.2.2 ebgp-max-hop 2

image-20230910121430377

添加一个loopback地址来模拟用户并引入

[R3]interface loop 
[R3-LoopBack1]ip add 100.3.1.1 3
[R3-LoopBack1]q
[R3]bgp 200
[R3-bgp]network 100.3.1.1 32

BGP的路由通告原则

  1. 从IBGP对等体获得的路由,只发布给EBGP对等体
  2. 从EBGP对等体获得的路由,发布给所有EBGP和IBGP对等体
  3. 只将BGP的最优路由发布给对等体:示例参考引入方式的优先级
  4. 只发送更新的BGP路由

从EBGP对等体获得的路由,发布给所有EBGP和IBGP对等体

添加R3后,R2从EBGP对等体R3上学到的路由100.3.1.1,会被发布给所有的IBGP和EBGP。

R3

image-20230911173326445

R2

image-20230911173253679

R1

image-20230911173417256

问题1:R1上学习到的这条引入的路由无效,因为下一条为3.3.3.3

因为从EBGP对等体获得的路由,发布给所有EBGP和IBGP对等体的时候不会改下一条

将路由放给EGP会改下一跳,给IGP发的时候默认不会改下一条

解决方法1:直接在R2上添加一条到3.3.3.3的静态路由(极不推荐)(应该是引入,前面为了建邻居关系,静态路由已经添加了)

解决方法2:自动修改下一条为更新源的地址

[R2-bgp]peer 1.1.1.1 next-hop-loca

在R2上配置以上命令,意思是在向邻居1.1.1.1发布路由的时候,将下一跳替换,替换为更新源地址。

image-20230911181021088

从IBGP对等体获得的路由,只发布给EBGP对等体,不发送给IBGP邻居,称为IBGP水平分割原则

image-20230911143817174

其实,原本设计之初,是否发布给EBGP会检查同步原则,但是华为这边默认有一条 undo synchronization ,意思是不做同步检查,而且改不了,现在永远会发布给EBGP

image-20230911122656218

水平分割主要用于AS内环路防止。IBGP水平分割会导致路由传递问题,会使AS内的IBGP无法学习到路由;4就学不到1引入的路由了。

解决方法:

1.全连接 1和4之间建一个BGP,也就是一个全连接的BGP,full

2.路由反射器

3.联盟:需要在所有设备上配置,很麻烦,很少用了

路由反射器:

RR (路由反射器) / client(客户端) / non-client(非客户端)

RR收到client的路由,会转发client和non-client;RR收到non-client的路由,只会转发client

路由反射器的防环机制:簇 Cluster 与 Cluster_ID

添加一台R4并配置水平分割

image-20230912004402590

这里R2与R4直接使用接口ip建立邻居关系

[R4]inter gi 0/0/0
[R4-GigabitEthernet0/0/0]ip add 24.1.1.1 30

R2

[R2]inter gi 0/0/2
[R2-GigabitEthernet0/0/2]ip add 24.1.1.2 30

静态路由:不需要静态路由

配置邻居关系与更新源

[R4]bgp 100
[R4-bgp]peer 24.1.1.2 as-number 100

[R2]bgp 100 
[R2-bgp]peer 24.1.1.1 as-number 100
[R2-bgp]peer 24.1.1.1 next-hop-local                               #通过EBGP学到的路由传递给24.1.1.1的时候将下一跳修改为更新源地址

问题1:R4未学到R1引入的路由

image-20230912003658626

谁配置这条命令谁就是RR,使用这条命令告诉RR谁是你的client

[R2-bgp]peer 1.1.1.1 reflect-client

[R2-bgp]peer 24.1.1.1 reflect-clien

配置之后(学到了R1的路由)

image-20230912003636810

问题:next-hop-local只针对来自ebgp的路由生效,所以1与4学到的路由不会改下一跳

1与4之间其实应该使用IBGP连起来的

BGP属性

BGP路由属性是一套参数,它对特定的路由进一步的描述,使得BGP能够对路由进行过滤和选择。事实上,所有的BGP路由属性都可以分为以下4类:

  • 公认必须遵循的(Well-known mandatory):所有BGP设备都可以识别,且必须存在于Update报文中。如果缺少这种属性,路由信息就会出错。
  • 公认任意(Well-known discretionary):所有BGP设备都可以识别,但不要求必须存在于Update报文中;即就算缺少这类属性,路由信息也不会出错
  • 可选过渡(Optional transitive):在AS之间具有可传递性的属性。BGP设备可以不支持此属性,但它仍然会接收这类属性,并通告给其他对等体。
  • 可选非过渡(Optional non-transitive):如果BGP设备不支持此属性,则相应的这类属性会被忽略,且不会通告给其他对等体。

下面介绍几种常用的BGP路由属性:

Next_Hop属性

Next Hop属性记录了路由的下一跳信息,该属性为公认必遵。

MED属性

MED属性相当于IGP的代价值,用于判断流量进入AS时的最佳路由,即用来影响邻居AS流量进入本AS的最佳路径,该属性为可选非过渡。

进入AS时的最佳路由(AS之间,越小越优先)

MED和Local_Pref都是做优先选路的。

image-20230901222258496

Local_Pref属性

Local_Pref 属性表明BGP路由器的优先级,用于判断流量离开AS时的最佳路由。该属性为公认任意

离开AS时的最佳路由(AS内部,越大越优先)

image-20230901221703438

AS-path 属性

按矢量顺序记录了某条路由从本地到目的地址所要经过的所有AS编号。(AS之间防环)属于公认必须遵循属性。

作用:如果一个路由器收到一条路由,路由的AS-path 包含自己所在的AS,则路由器会认为发生了环路将该路由丢弃。

image-20230912003636810

EBGP 防环:As-path 属性

IBGP 防环:ibgp 水平分割

Origin属性

属于公认必须遵循属性,用来定义路径信息的来源,标记一条路由是怎么成为BGP路由的,包含IGP、EGP和Incomplete三种类型。

  • IGP
    • 通过路由始发AS的IGP得到的路由信息
    • 标识符为"i"
  • EGP
    • 通过EGP得到的路由信息
    • 标识符为“e“
  • Incomplete
    • 通过其他方式学习到的路由信息
    • 标识符为”?"

团体属性

团体属性用于标识具有相同特征的BGP路由,该属性为可选过渡

团体属性分为

  • 自定义团体属性
  • 公共团体属性
    • Internet
    • No_Advertise ----------- 联盟 子AS
    • No_Export
    • No_Export_Subconfed

抗D / color

image-20230912163920849

如果有两个公网ip,公网ip(10.x.x.x)放在一个团体属性里面,走上面;公网ip(20.x.x.x)放在另一个团体属性里面,走下面

路由聚合的AS-set 参数

R4:
bgp 200
   aggregate 1.1.0.0 22 detail-suppressed as-set

as-set 参数可以使得聚合后的路由含有原来的as-path 属性

一台路由器上面只能运行一个bgp 的进程。

BGP工作原理

BGP的五张表

邻居表:对等体邻居清单列表

Adj-RIB-In:对等体宣告给本地BGP Speaker的未处理的路由信息库

BGP路由表(Loc-RIB):BGP路由信息库,包括本地BGP Speakeri选择的路由信息

IP路由表(IP-RIB):全局路由信息库,包括所有P路由信息

Adj-RIB-Out:本地BGP Speaker宣告给指定对等体的路由信息库

BGP路由信息处理流程

image-20230901212844831

BGP是如何选择路由的?

当到达同一目的地存在多条路由时,BGP依照如下策略顺序进行路由选择:

  • 如果此路由的下一跳不可达,忽略此路由
  • 优选协议首选值(PrefVal)最高的路由
  • 优选本地优先级(Local_Pref)最高的路由
  • 优选本地生成的路由
  • 优选AS路径(AS_Path)最短的路由
  • 比较Qrigin属性,依次优选Origin类型为IGP、EGP、Incomplete的路由
  • 优选MED值最低的路由
  • 优选MBGP邻居学来的路由(EBGP路由优先级高于IBGP路由)
  • 选到下一跳IGP Metric较小的路由
  • 优选Cluster_List最短的路由
  • 优选Router ID最小的路由器发布的路由
  • 比较对等体的IP Addres,优选从具有较小IP Address的对等体学来的路由

路由聚合

在大规模的网络中,BGP路由表十分庞大,使用路由聚合(Routes Aggregation)可以大大减小路由表的规模。

路由聚合实际上是将多条路由合并的过程。这样BGP在向对等体通告路由时,可以只通告聚合后的路由,而不是通告所有的具体路由。

BGP路由聚合支持两种方式:

  • 自动聚合:对BGP引入的路由进行聚合。配置自动聚合后,对参加聚合的具体路由进行抑制。配置自动聚合后,BGP将按照自然网段聚合路由(如10.1.1.1/32和10.2.1.1/32将聚合为A类地址10.0.0.0/8),并且BGP向对等体只发送聚合后的路由。

  • 手动聚合:对BGP本地路由进行聚合。手动聚合可以控制聚合路由的属性,以及决定是否发布具体路由。

IPv4支持自动聚合和手动聚合两种方式,而IPv6仅支持手动聚合。

bgp 100
aggregate 1.1.0.0 22

在BGP路由表中,将1.1.0.0/22及其更具体的路由(如果存在)聚合为一条路由。

默认情况下,bgp的明细路由(被聚合的路由)和聚合路由都会通告给其他BGP邻居。

bgp 100
aggregate 1.1.0.0 22 detail-suppressed

使用detail-suppressed关键字,只向邻居通告该聚合路由,抑制该聚合路由所包含的所有明细路由。

结尾

bilibili-DDa脾气-BGP协议

华为官网BGP介绍

华为BGP命令全集