16.BGP

BGP 概述

定义:BGP 是一种外部网关协议,用于在不同的自治系统(AS)之间交换路由信息。

传输协议:基于 TCP,端口号为 179。

特点:

  • 可靠性:基于 TCP,因此不需要额外的可靠性机制。OSPF 需要周期性更新和确认报文,而 BGP 不需要。
  • 增量更新:只在路由发生变化时发送更新信息,无需周期性更新。
  • 支持 CIDR:除 RIPv1 外,其他协议都支持 CIDR。
  • 距离矢量协议:基于路径向量算法,通过技术手段避免环路。
  • 丰富的路由策略:支持多种路由策略,防止路由震荡,易于扩展。支持 IPv4、IPv6、MPLS VPN、EVPN 等多种扩展功能。

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

BGP是怎么工作的?

BGP中的角色

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

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

BGP的报文类型

BGP通过五种类型的报文进行通信:

  • Open报文:是TCP连接建立后发送的第一个报文,用于建立BGP对等体之间的邻居关系,协商参数。对等体在接收到Open报文并协商成功后,将发送Keepalive报文确认并保持连接的有效性。

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

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

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

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

  • Refresh报文:用于请求对等体重新发送所有的可达路由信息,通常在改变路由策略后使用。

BGP有限状态机及工作流程

在BGP对等体建立的过程中,BGP有限状态机共有六种状态

  1. Idle(空闲):初始状态,路由器关闭所有已有的BGP连接,并开始初始化BGP资源。

路由器会等待开始事件的发生,然后转移到Connect状态。

  1. Connect(连接):尝试建立TCP连接。如果成功,转移到OpenSent状态;如果失败,转移到Active状态。

  2. Active(活动):继续尝试建立TCP连接。如果成功,转移到OpenSent状态;如果失败,保持在Active状态。

  3. OpenSent(开启发送):发送OPEN消息,等待对方的OPEN消息。如果有效,转移到OpenConfirm状态。

  4. OpenConfirm(开启确认):等待KEEPALIVE或NOTIFICATION消息。如果收到KEEPALIVE消息,转移到Established状态。

  5. Established(已建立):正常工作状态,可以发送/接收UPDATE、KEEPALIVE、NOTIFICATION和REFRESH消息。

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

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

image-20230831213958143

邻居建立过程图

  • 在任何状态下,如果检测到错误,则发送 Notification 报文并回到 Idle 状态。
  • 如果 TCP 三次握手失败,则进入 Active 状态,并不断尝试重新建立连接。

IBGP邻居建立实验

实验环境

  • 两台路由器:Router 1Router 2
  • AS 号:100
  • 使用 Loopback 接口建立邻居关系
  • 推荐使用 Loopback 接口的原因:
    • 可靠性更高
    • 不需要直接相连
    • 只需底层 IP 可达即可

配置步骤

image-20230909000428459

配置IP地址

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

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

配置 BGP

[R1]bgp 100
[R1-bgp]peer 2.2.2.2 as-number 100

[R2]bgp 100
[R2-bgp]peer 1.1.1.1 as-number 100

查看bgp邻居状态

display bgp peer

问题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的路由引入

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

BGP的路由引入

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

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

    • 静态路由引入:通过import static命令将静态路由引入BGP。
  • Network方式比Import方式更精确,将指定前缀和掩码的一条路由注入到BGP路由表中。

BGP路由引入实验

  1. 添加两个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

  1. 引入路由

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

R1引入所有的直连路由

[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引入的

路由通告

BGP的路由通告原则

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

BGP(边界网关协议)与IGP(内部网关协议)的区别

  • IGP(如OSPF)会自动通告链路状态,而BGP需要遵循特定的通告原则。
  • OSPF的Network命令用于使能接口,而BGP的Network命令用于引入路由。

BGP路由通告原则

  • 从IBGP对等体学到的路由不会通告给IBGP对等体,只发布给EBGP对等体:防止路由环路。
  • 从EBGP对等体学到的路由会通告给所有邻居(所有EBGP和IBGP对等体):确保路由信息的传播。
  • 只通告最优且有效的路由:BGP只会通告最优的路由给对等体。
  • TTL设置:EBGP默认TTL为1,需要手动调整以确保邻居关系建立。
  • 只发送更新的BGP路由

EBGP间的邻居关系建立

image-20230910121337612

配置IP地址

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

问题:报文开起来正常,但是邻居状态处于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

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

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

R3

image-20230911173326445

R2

image-20230911173253679

R1

image-20230911173417256

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

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

解决方法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.联盟:需要在所有设备上配置,很麻烦,很少用了

路由反射器

  • 简化IBGP全连接需求: 用于简化IBGP全连接需求。
  • 路由反射器的角色:
    • Client: 路由反射器的客户端。
    • Non-Client: 路由反射器的非客户端。
    • Cluster ID: 用于识别路由反射器集群的ID。
    • Originator ID: 用于识别路由反射器的发起者ID。

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

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

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

Cluster_List:记录路由反射器的信息,用于检测路由环路。

添加一台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的时候将下一跳修改为更新源地址

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

image-20230912003658626

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

[R2-bgp]peer 1.1.1.1 reflect-client

[R2-bgp]peer 24.1.1.1 reflect-client

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

image-20230912003636810

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

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

BGP路由属性

BGP路由属性 用于对特定的路由进一步的描述,使得BGP能够对路由进行选择和控制。(其他协议用于路由选择的属性 不一定和BGP相同,)

BGP作为一种EGP(Exterior Gateway Protocol,外部网关协议),设计用于在不同的自治系统(AS)之间交换路由信息,因此它需要更多的灵活性和控制选项。这导致了BGP具有大量的路由属性,这些属性可以用来过滤、标记和控制路由信息的传播。例如,BGP支持的属性如Local Preference、AS_PATH、Next Hop、MED(Multi-Exit Discriminator)、Community等,这些属性提供了高级路由控制机制,使得网络管理员能够精细地管理跨AS的路由行为。
IGP(Interior Gateway Protocols,内部网关协议) 如OSPF(Open Shortest Path First,开放最短路径优先)或IS-IS(Intermediate System to Intermediate System,中间系统到中间系统)也有它们自己的特性或度量标准,比如OSPF中的Cost(开销)。这些度量标准可以被视为一种形式的路由属性,用于决定最佳路径。

RIP(Routing Information Protocol,路由信息协议) 也有一个简单的度量标准——跳数(hop count),这也是一个属性,用于决定路由的距离向量。

所有的路由属性可以分为以下4类:

  • 公认必尊属性(Well-known mandatory): 所有BGP设备都必须识别且必须存在于路由更新消息中的属性。缺少任何一个属性会导致路由信息无效。
  • 公认任意属性(Well-known discretionary): 所有BGP设备都必须识别,但不要求必须存在于更新报文中。即就算缺少这类属性,路由信息也不会出错,可以根据需求选择是否使用。
  • 可选过渡属性(Optional transitive):
    • BGP设备可以不支持此属性,但它仍然会接收这类属性,并通告给其他对等体。
  • 可选非过渡属性(Optional non-transitive):
    • 如果BGP设备不支持此属性,则相应的这类属性会被忽略,且不会通告给其他对等体。

Origin属性

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

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

AS-path 属性

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

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

image-20230912003636810

  • EBGP 防环:As-path 属性

  • IBGP 防环:ibgp 水平分割

Next_Hop属性

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

Local_Pref属性

Local_Pref 是一个 公认任意 属性,用于控制BGP路由器在AS内部选择最佳出口路由时的优先级。值越大,优先级越高

image-20230901221703438

如果路由器1配置了 local-preference 300,路由器2配置了 local-preference 200,则路由器1会选择 local-preference 300 的路径。

MED属性

Multi-Exit Discriminator (MED)属性 是一个 可选非过渡属性,用于影响进入AS时的最佳路由选择。越小越优先

image-20230901222258496

如果路由器1配置了 MED 200,路由器2配置了 MED 300,则远端客户会选择 MED 200 的路径。

团体属性

团体属性(Community Attributes)是附加到相同特征的路由上的标签,用于路由控制。该属性为可选过渡

分类:

  • 自定义团体属性:
    • 用户自定义的团体属性,可以根据需要进行设置。
  • 公共团体属性:
    • 预定义的标准团体属性,具有特定的功能。
    • 包括:
      • Internet
      • No_Advertise: 不向外宣传该路由。 ----------- 联盟 子AS
      • No_Export: 不向其他AS宣传该路由。
      • No_Export_Subconfed: 不向子联盟外的AS宣传该路由。

应用示例:

  • 抗D:
    • 使用团体属性进行路由控制,以应对DDoS攻击。
  • 通过if-match匹配特定团体属性来实现不同路由策略
  • 路由策略:
    • 如果有两个公网IP,可以通过团体属性进行区分。
    • 例如,将公网IP 10.x.x.x 放在一个团体属性中,使其走上面的路径;将公网IP 20.x.x.x 放在另一个团体属性中,使其走下面的路径。
      image-20230912163920849

路由聚合

在大规模的网络中,BGP路由表十分庞大,使用路由聚合(Routes Aggregation)可以将多个具体的路由条目合并为一个汇总路由,从而大大减小路由表的规模。

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

  • 自动聚合

    • 定义:当 BGP 引入路由时,BGP 协议会自动将这些路由聚合到自然网段。
    • 配置:通常通过全局或特定地址族下的 auto-summary 命令启用。
    • 特点:
      • 按自然网段聚合:
        • BGP 将按照自然网段(如 A 类、B 类、C 类地址)进行聚合。
        • 例如,10.1.1.1/3210.2.1.1/32 将被聚合为 10.0.0.0/8
      • 抑制具体路由:
        • 配置自动聚合后,BGP 将不再发送具体路由,只发送聚合后的路由。
      • 无需额外配置:
        • 一旦启用自动聚合,路由器会自动处理聚合逻辑。
  • 手动聚合

    • 定义:
      • 手动聚合是指BGP协议根据管理员指定的规则进行聚合。需要管理员指定具体的聚合前缀和相关属性。
    • 配置:
      • 通过 aggregate 命令进行配置。
    • 特点:
      • 自定义聚合范围:
        • 可以指定任意前缀进行聚合,不受自然网段限制。
        • 例如,可以将 10.1.1.0/24 和 10.1.2.0/24 聚合为 10.1.0.0/16
      • 控制聚合属性:
        • 可以设置聚合路由的属性,如 AS 路径、下一跳等。
        • 例如,可以通过 as-set 参数保留原始的 AS 路径。
      • 选择是否发布具体路由:
        • 可以选择是否抑制具体路由,只发布聚合路由。
        • 例如,使用 detail-suppressed 选项抑制具体路由。

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

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

    • 用于聚合多个具体的路由条目为一个汇总路由。
    • 1.1.0.0 22 表示将所有前缀为 1.1.0.0/22 的路由聚合为一个汇总路由。
  • detail-suppressed参数

    • 默认情况下,bgp的明细路由(被聚合的路由)和聚合路由都会通告给其他BGP邻居。
    • detail-suppressed 选项表示抑制该聚合路由所包含的所有明细路由,只发布汇总路由。
  • as-set 参数:

    • 该参数使得聚合后的路由包含原来的 AS 路径信息。
    • 例如,假设原始路由的 AS 路径为 100 -> 200 -> 300,聚合后的路由也会保留这些 AS 号。
router bgp 100
  no auto-summary
  address-family ipv4
    auto-summary
  exit-address-family

router bgp 100
  address-family ipv4
    aggregate 10.0.0.0 8 as-set detail-suppressed
  exit-address-family

BGP工作原理

image-20230901212844831

BGP的五张主要表

  1. 邻居表 (Neighbor Table):记录 BGP 邻居的信息。
  2. 未处理路由表 (Adj-RIB-In):存储从对等体接收到但还未处理的路由信息。
  3. BGP 路由表 (Loc-RIB):包含本地 BGP Speaker 选择的有效路由信息。
  4. IP 路由表 (IP-RIB):包含所有 IP 路由信息,不仅仅是 BGP 的。
  5. 待发送路由表 (Adj-RIB-Out):准备发送给对等体的路由信息集合。

BGP路由信息处理流程

  1. 接收路由信息:从邻居接收路由信息并存入 Adj-RIB-In 表。
  2. 选择路由:从 Adj-RIB-In 表中选出最优路由放入 Loc-RIB 表。
  3. 应用策略:根据配置的策略过滤 Loc-RIB 表中的路由。
  4. 更新 IP 路由表:将过滤后的路由添加到 IP-RIB 中。
  5. 发送路由信息:将需要通告给邻居的路由信息存入 Adj-RIB-Out 表,并发送给相应的邻居。

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的对等体学来的路由

结尾

bilibili-DDa脾气-BGP协议

华为官网BGP介绍

华为BGP命令全集

posted @ 2023-09-12 17:59  姬雨晨  阅读(147)  评论(0编辑  收藏  举报