首页 > 技术文章 > BGP

tmjblog 2020-04-06 19:26 原文

边界网关协议,是DV,本身不能自动发现网络拓扑,而在于在AS之间选择最佳路由和控制路由的传播,至今共有4代,主要在ISP中运用。

在EGP(外部网关协议)中,引入了AS(自治系统)的概念。AS是指由同一个技术管理机构管理,使用同一选路策略的一些路由器的集合。

在AS内部使用IGP协议(ospf,ISIS,RIP等)来计算和发现路由,AS之间使用BGP来传递和控制路由。

每个AS都有一个唯一的编号来标识路由域,这个编号是由IANA分配。范围是4字节二进制,最多4294967295。

每个路由器都必须有唯一的Router-ID,未配置的情况下默认为环回口地址,如果没有则用物理接口中最大的IPV4地址,一经确认,除非发生接口地址删除等事件,否则即使配置更大的地址也保持原来的Route-ID。

为了稳定性,BGP的对等体之间建立TCP连接,端口号为179。

BGP中分为Speaker和Peer两种角色。

  • Speaker:发送BGP报文的设备称为BGP发言者(Speaker),它接收或产生新的报文信息,并发布(Advertise)给其它BGP Speaker。
  • Peer:相互交换报文的Speaker之间互称对等体(Peer)。若干相关的对等体可以构成对等体组(Peer Group)。

11.1 BGP邻居类型

按照运行方式分为:

  • EBGP
    • 运行于不同AS之间的BGP。为了防止AS间产生环路,当BGP设备收到EBGP对等体发送的路由时,会将带有本地AS号的路由丢弃。
  • IBGP
    • 运行在同一AS内部的BGP成为IBGP。为了防止AS内产生环路,BGP设备不将从IBGP对等体学到的路由通告给其它IBGP设备,IBGP设备之间需要建立起全连接。

11.2 报文类型

BGP的运行是通过消息驱动的,共有5种类型。

  • open:建立TCP连接建立后发送的第一个消息。
  • update:用于在路由器之间交换路由信息
  • notification:当检测到错误状态时就发出此消息,之后BGP连接断开。
  • keepalive:周期性地向对等体发出此消息保持路由的有效性,默认60秒一次。
  • route-refresh:当入口路由策略发生变化后,向对等体发送此消息,收到此消息的对等体会将路由信息重新发回,这样可以在不中断BGP连接的情况下对路由表进行动态刷新,别应用新的路由策略。

11.3 BGP状态机

BGP对等体交互过程:

BGP设备将最优路由加入BGP路由表,形成BGP路由。BGP设备与对等体建立邻居关系后,采取以下交互原则:

  • 从IBGP对等体获得的BGP路由,只发布给EBGP对等体。
  • 从EBGP对等体获得的BGP路由,发布给它所有EBGP和IBGP对等体。
  • BGP设备只将最优路由发布给对等体。
  • 只发送更新的BGP路由。
  • IBGP与IGP同步,既从IBGP邻居学来的路由在发布给一个BGP邻居之前,必须通过IGP知道该路由。

11.4 BGP与IGP交互

BGP和与IGP在设备中使用不同的路由表,而且BGP协议本身不发现路由,为了实现不同AS间相互通讯,需要进行路由引入。

两种引入方式:

  • import,是按照协议类型将RIP等IGP协议引入到BGP路由表。还可以引入静态路由和直连路由。
  • network,是逐条将IP路由表中已存在的路由引入到BGP路由表中,比import精确。

11.5 信息处理

路由信息库:

  • IP-RIB:全局路由信息库,包括所有IP路由信息。
  • Loc-RIP:BGP路由信息库,包括本地BGP Speaker选择的路由信息。
  • 邻居表:对等体邻居清单列表
  • Adj-RIP-In:对等体宣告给本地BGP Speaker的未处理路由信息库
  • Adj-RIB-Out:本地BGP Speaker宣告给指定对等体的路由信息库

  • 收到BGP邻居发来的Update报文,将信息存至Adj-RIP-In路由器会执行算法进行路径选择,确定每一条前缀的是最佳路径存储到本地BGP路由表中。

11.6 路由属性

可分为以下4大类:

  • 公认必须遵循(Well-known mandatory):所有BGP设备都可以识别此类属性,且必须存在于Update报文中。如果缺少这类属性,路由信息就会出错。
  • 公认任意(Well-known discretionary):所有BGP设备都可以识别此类属性,但不要求必须存在于Update报文中,即就算缺少这类属性,路由信息也不会出错。
  • 可选过渡(Optional transitive):BGP设备可以不识别此类属性,如果BGP设备不识别此类属性,但它仍然会接收这类属性,并通告给其他对等体。
  • 可选非过渡(Optional non-transitive):BGP设备可以不识别此类属性,如果BGP设备不识别此类属性,则会被忽略该属性,且不会通告给其他对等体。
属性名 类型
Origin属性 公认必须遵循
AS_Path属性 公认必须遵循
Next_Hop属性 公认必须遵循
Local_Pref属性 公认任意
MED属性 可选非过渡
团体属性 可选过渡
Originator_ID属性 可选非过渡
Cluster_List属性 可选非过渡
  • PrefVal协议首选值(华为特有属性)

    该属性仅在本地有效,不会传递给BGP邻居。此属性为人为主动设置的,代表本地用户的意愿,因此在BGP进行选路是会优先比较协议。

  • Origin属性用来定义路径信息的来源

    • IGP,具有最高优先级
      • 通过始发AS的IGP得到的路由信息,如通过network命令注入BGP的路由
      • 标识符为“i”
    • EGP,优先级次之
      • 通过EGP得到的路由信息
      • 标识符为“e”
    • Incomplete,优先级最低
      • 通过其他方式学习到的路由信息,如通过import-route命令注入BGP的路由
      • 标识符为“?”
  • AS_Path

    按矢量顺序记录某条路由从本地到目的地址都要经过的所有AS编号。用于避免AS之间的环路。

  • Next_Hop

    此属性记录了路由的下一跳信息,通常情况下,Next_Hop属性遵循下面的规则:

    • BGP Speaker在向EBGP对等体发布某条路由时,会把该路由信息的下一跳属性设置为本地与对端建立BGP邻居关系的接口地址。
    • BGP Speaker将本地始发路由发布给IBGP对等体时,会把该路由信息的下一跳属性设置为本地与对端建立BGP邻居关系的接口地址。
    • BGP Speaker在向IBGP对等体发布从EBGP对等体学来的路由时,并不改变该路由信息的下一跳属性。
  • Local_Pref

    表明BGP路由器的优先级,值越大越优先,默认值为100该属性仅在IBGP对等体之间有效,不通告给其他AS。

  • MED

    用于在AS间的路由选路的开销值,较小值优先。

11.7 选择路由的策略

当到达同一目的地存在多条路由时,BGP依次对比下列属性来选择路由:

  1. 优选协议首选值(PrefVal)最高的路由。

    协议首选值(PrefVal)是华为设备的特有属性,该属性仅在本地有效。

  2. 优选本地优先级(Local_Pref)最高的路由。

    如果路由没有本地优先级,BGP选路时将该路由按缺省的本地优先级100来处理。

  3. 依次优选手动聚合路由、自动聚合路由、network命令引入的路由、import-route命令引入的路由、从对等体学习的路由。

  4. 优选AS路径(AS_Path)最短的路由。

  5. 依次优选Origin类型为IGP、EGP、Incomplete的路由。

  6. 对于来自同一AS的路由,优选MED值最低的路由。

  7. 依次优选EBGP路由、IBGP路由、LocalCross路由、RemoteCross路由。

    PE上某个VPN实例的VPNv4路由的ERT匹配其他VPN实例的IRT后复制到该VPN实例,称为LocalCross;从远端PE学习到的VPNv4路由的ERT匹配某个VPN实例的IRT后复制到该VPN实例,称为RemoteCross。

  8. 优选到BGP下一跳IGP度量值(metric)最小的路由。

  9. 优选Cluster_List最短的路由。

  10. 优选Router ID最小的设备发布的路由。

    如果路由携带Originator_ID属性,选路过程中将比较Originator_ID的大小(不再比较Router ID),并优选Originator_ID最小的路由。

  11. 优选从具有最小IP Address的对等体学来的路由。

形成BGP等价负载分担的条件是“BGP选择路由的策略”的1至8条规则中需要比较的属性完全相同。

11.8 路由聚合

  • 只对对等体发送聚合后的路由,从而缩小路由表规模。

  • 明细路由如果发生路由振荡,不会对网络造成影响。

  • 分为自动聚合和手动聚合

    • 自动聚合
      • 对import的路由按照自然网段进行聚合,对network命令引入的无效。
      • 只向对等体发送聚合后的路由
      • 默认情况下不启用
      • 聚合之后的路由带有atomic_aggregate和aggregator属性
    • 手动聚合
      • 聚合后的路由不会携带成员明细路由的AS-PATH属性
      • 通过AS_SET属性携带AS号
      • 聚合后的路由会携带atomic_aggregate属性

11.9 对等体组

  • 对等体组是一些具有某些相同策略的对等体的集合,当新对等体加入时,自动获得与其他对等体相同的配置。当对等体组的配置改变时,组内成员的配置也相应改变。

  • 此功能可以简化BGP的配置,同时减少路由性能损耗。

  • 对等组中的单个对等体也可以配置自己的发布路由与接受路由的策略。

11.10 按组打包

  • 将所有拥有共同出口策略的BGP邻居当作一个打包组
  • 每条待发送路由只打包一次然后发送给组内的所有邻居。

11.11 团体

团体属性是一组有相同特征的目的地址的集合,团体属性用一组以4字节为单位的列表来表示,格式为aa:nn和团体号。

  • aa表示自治系统AS编号,nn是管理员定义的团体属性标识,两者的范围都是0~65535

  • 团体号范围为04294967295,其中065535和4294901760~4294967295为私有AS。

团体属性可以用来简化路由策略的应用和降低维护管理的难度,利用团体可以使多个AS中的一组BGP设备共享相同的策略。团体是个路由属性,可以在对等体之间不受AS的限制传播,并且可以在发布给其它对等体之前改变此路由原有的团体属性。

11.12 路由反射器

全互联需要n(n-1)/2个连接数,太消耗资源,于是就有了路由反射器(RR),其它路由器作为客户机(Client),既不是RR又不是Client的就是非客户机(Non-Client)。

RR和clients之间建立IBGP连接,RR与它的Clients组成一个集群(Cluster),AS内始发路由的设备叫始发者(Originator)。

  • Originator_ID属性用于防止集群内产生路由环路,由RR产生,携带Originator的RouterID,

  • Cluster_List属性用于防止集群间产生环路,由RR产生,携带经过的集群的Cluster_ID。

RR按照以下规则向IBGP邻居发布学习到的路由信息:

  • 发布给所有的client和Non_Client。

  • Non_Client从IBGP对等体学到的路由发布给此RR的所有Client。

  • 从Client学到的路由,发布给此RR所有的Client和Non_Client。

为防止RR故障,就有了备份RR。

一个AS中可能会有多个集群,就有了同级RR,各个RR之间是IBGP对等体关系。

一个client也可以作为其它路由器的RR,RR就有了分级的概念,可以将较低层次的RR配置成较高层次client。

11.3 BGP联盟

将一个AS划分为若干个子AS,每个子AS内部建立全连接的IBGP邻居,子AS之间建立EBGP连接。配置联盟后,原AS号作为每个路由器的联盟ID,原有的IBGP属性和联盟相关属性在传出联盟时会被自动删除,无需在联盟出口配置过滤操作。

11.4 AS路由控制工具

  • AS-path-Filter:在BGP收发路由的时候进行过滤。

    • 以BGP中的AS_Path属性为匹配条件
    • 可以使用正则表达式进行定义
    特殊字符 功能 举例
    \ 转义字符。将下一个字符(特殊字符或者普通字符)标记为普通字符。 *匹配*
    ^ 匹配行首的位置。 ^10匹配10.10.10.1,不匹配20.10.10.1
    $ 匹配行尾的位置。 1$匹配10.10.10.1,不匹配10.10.10.2
    * 匹配前面的子正则表达式零次或多次。 10可以匹配1、10、100、1000、……(10)可以匹配空、10、1010、101010、……
    + 匹配前面的子正则表达式一次或多次。 10+可以匹配10、100、1000、……(10)+可以匹配10、1010、101010、……
    ? 匹配前面的子正则表达式零次或一次。 10?可以匹配1或者10(10)?可以匹配空或者10
    . 匹配任意单个字符。 0.0可以匹配0x0、020、…….oo.可以匹配book、look、tool、……
    () 一对圆括号内的正则表达式作为一个子正则表达式,匹配子表达式并获取这一匹配。圆括号内也可以为空。 100(200)+可以匹配100200、100200200、……
    x|y 匹配x或y。 100|200匹配100或者2001(2|3)4匹配124或者134,而不匹配1234、14、1224、1334
    [xyz] 匹配正则表达式中包含的任意一个字符。 [123]匹配255中的2
    [^xyz] 匹配正则表达式中未包含的字符。 [^123]匹配除123之外的任何字符
    [a-z] 匹配正则表达式指定范围内的任意字符。 [0-9]匹配0到9之间的所有数字
    [^a-z] 匹配正则表达式指定范围外的任意字符。 [^0-9]匹配所有非数字字符
    _ 匹配一个逗号(,)、左花括号({)、右花括号(})、左圆括号、右圆括号。匹配输入字符串的开始位置。匹配输入字符串的结束位置。匹配一个空格。 _2008_可以匹配2008、空格2008空格、空格2008、2008空格、,2008,、{2008}、(2008)、{2008)、(2008}

    举例:

ip as-path-filter 10 permit .* //匹配所有AS-PATH属性

常用的正则表达式:

注意点:最后经过的AS号放在AS_Path记录中的最左侧,如依次经过AS100,AS200,AS300,最后到达AS400,那么在AS400里,路由的AS-PATH属性为(300 200 100)

  • Community-Filter:在BGP收发路由的时候进行过滤。
    • 以BGP中的community属性为匹配条件

举例:

ip community-filter 1 permit 100:1 //匹配community属性为100:1

推荐阅读