华为数通 BGP

技术原理

边界网关协议(BGP)是运行于 TCP 上的一种自治系统的路由协议。动态路由协议分为两种,IGP和EGP,IGP工作在同一个AS内,主要用来发现和计算路由,为AS内提供路由信息的交换,OSPF和ISIS则是IGP协议;而EGP工作在AS与AS之间,在AS间提供无环路的路由信息交换,BGP则是EGP协议的一种

基本概念(实现原理)

BGP采用TCP协议179端口

  • AS:指一个区域的集合的统称
  • 邻居关系:
    • IBGP:和AS编号一致的设备建立的邻居关系就是IBGP
    • EBGP:和AS编号不一致的设备建立的邻居关系就是EBGP
  • 建立过程:
    1. TCP三次握手,建立TCP连接
    2. 交换open报文,里面携带了as,router-id等信息,如果信息无问题,建立完成,后续通过keeplive报文保护,邻居建立完成
    3. 路由传递
  • 报文:
    • open报文:携带自身得参数,建立邻居使用
    • update:更新报文
    • Notification:差错报文,比如建立邻居不成功,通过这个报文去描述具体错误的原因
    • Keepalive:保活报文
    • Route-refresh:立即刷新表项
  • 状态机:
    • Idle
      • BGP协议初始时是处于Idle状态。在这个状态时,系统不分配任何资源,也拒绝所有进入的BGP连接。只有收到Start Event时,才分配BGP资源,启动ConnectRetry计时器,启动对其它BGP对等体的传输层连接,同时也侦听是否有来自其它对等体的连接请求。Connect Retry 计时器会呈现级数级的增加
    • Connect
      • 这个状态下BGP等待TCP完成连接,再决定后续动作:
        • 若连接成功,本地清空ConnectRetry计时器,并向对等体发送OPEN报文,然后状态改变为OpenSent状态;
        • 连接失败,BGP会继续侦听邻居发出的连接,重置 Connect Retry 计时器并将自己状态转移到 Active 状态
        • Connect Retry时间超时,重置ConnectRetry计时器,再次试图与邻居建立TCP连接,BGP 保持 Connect 状态,出现其他事件转 入 Idle 状态。
    • Active
      • 置于Active 状态时 BGP 试图与邻居建立一个 TCP 的连接;
      • 如果 TCP 连接成功,BGP 将 Connect Retry 计时器清零,完成初始化,给邻居发送Open 消息并将状态置为 Open,hold 时间置为4mins 。
      • 如果在 Active 状态,Connect Retry计时器超时回 Connect 状态并重置 Connect Retry 计时器。
      • 如果试图与一个未知 IP 建立 TCP 会话,同时 Connect Retry 计时器重置,拒绝连接并保持 Active 状态。
      • 任何一个事件都会导致重回 Idle
    • OpenSent
      • 在此状态,已经发送了 open 消息,BGP 需要等待邻居发送的 open 消息包;
      • 收到open消息,如果发现有差错,将给邻居发送一个 notification 消息并将状态置为 Idle 。
      • 如果收到 open 包消息没错,将发送 keeplive 包给邻居,并建立IBGP或者EBGP状态置为 Open confire state 。
      • 如果收到TCP断开消息则断开BGP连接重置 Connect Retry 计时器,状态置为 Active 。
    • OpenConfirm
      • 这个状态下,BGP等待KEEPALIVE或NOTIFICATION报文。如果收到KEEPALIVE报文,则进入Established状态,如果收到NOTIFICATION报文,则变为Idle状态。
      • 如果收到一个 keeplive 消息包,会将状态置为 Establish 。
      • 如果收到 notification 消息包,会将状态置为 Idle 并断开 TCP 连接。
      • 如果 hold 计时器超时,检测到一个差错或者有 stop 事件发生,BGP 将给邻居发送一个 notification 并断开连接,之后状态置为 Idle 。
    • Established
      • 这个状态下, BGP可以和其他对等体交换UPDATE,NOTIFICATION,KEEPALIVE报文。如果收到了正确的UPDATE或KEEPALIVE报文,就认为对端处于正常运行状态,本地重置Hold Timer。如果收到NOTIFICATION报文,本地转到Idle状态。如果收到错误的UPDATE报文,本地发送NOTIFICATION报文通知对端,并改变本地状态为Idle。如果收到了TCP拆链通知,本地关闭BGP连接,并回到Idle状态。
  • 通告原则:
    • 第一条:发布最优的有效路由,带>号的路由
    • 第二条:从EBGP收到的路由会发送给所有对等体(从其他站点收到的)
    • 第三条:水平分割原则,IBGP收到的,不传递IBGP设备(防环原则,as内部防环),只传递一次
    • 第四条:同步问题,已经砍掉了,从对等体收到路由后,在IGP路由表当中也要存在才会置为最优的路由

基础配置命令:

  • bgp 100 # bgp的as编号
    • router-id 1.1.1.1 # 定义router-id
    • peer 2.2.2.2 as-number 100 # 对等体建立信息
    • peer 2.2.2.2 connect-interface LoopBack0
      • # 可选,指定更新源,igbp之间邻居建议使用回环口建立,egbp不建议使用回环口建立邻居。这条命令的作用是ibgp之间使用回环口建立邻居口指定回环口地址作为更新源,是指在tcp三次握手阶段,默认是使用出接口地址作为源地址进行三次握手,会导致双方通过peer 2.2.2.2 as-number 100命令指定的邻居地址不一致,所以通过这条命令可以修改三次握手的源ip为回环口ip,不然无法建立邻居
    • peer 2.2.2.2 ebgp-max-hop 1-255 # 可选,ebgp间使用回环口建立邻居的话修改ttl,因为默认是ebgp的ttl是1,如果不修改邻居起不来。默认是255ttl
    • peer 2.2.2.2 next-hop-local
      • # 边界AS路由器配置指定下一条,作用就是EBGP在传给IBGP的时候修改路由的下一跳为自己的更新源,也就是EBGP和EBGP之间的出接口。如图IBGP传递给EBGP会修改下一跳为自己的更新源(也就是下一跳),EBGP传回给IBGP的时候,更新源并没有修改为自己的更新源,所以IBGP学习到的这条路由就不是带*的(*代表不是可用),也不是带>的(>代表不是最优的),所以需要通过这条命令修改更新源给到IBGP
    • import-route ospf # 可选,路由引入

路由聚合

路由聚合作用就在于优化路由,有利的减少比较连贯的路由条目,路由聚合有三种方法:静态聚合、自动聚合、手动聚合,比如现有10.1.8.0/24、10.1.9.0/24、10.1.10.0/24、10.1.11.0/24四条路由,通过以下聚合方式:

  • 静态聚合
    • 本地生成一条指向null 0的静态路由,让这条路由存在于路由表(路由表不存在BGP不会宣告),再进行BGP宣告
    • 命令:
      • ip route-s 10.1.8.0 255.255.252.0 null 0
      • network 10.1.8.0 255.255.252.0
  • 自动聚合
    • 自动聚合只能对引入的路由聚合(import *),对network的路由无效,而且只能做主类聚合,比如/24聚合后为/16,不会精细。如下图标记s,不会发布给其他对等体,只会发一个17.0.0.0/8
    • 命令:
      • summary automatic
  • 手动聚合
    • 手动聚合优先级高于自动聚合,不管是本地network还是引入路由都能聚合。
    • 命令:aggregate 10.1.8.0 255.255.252.0/22
      • detail-suppressed:抑制发布明细路由,默认不加detail-suppressed不会对明细路由标记s,还是会发布给其他对等体,如图加了参数后只会发布/22,带s的不会发布给其他对等体:
      • as-set:保留原有明细路由的as_path属性,用在对非本AS产生的路由做汇总的时候要加的参数,如果不加这个参数会出现环路问题,比如EBGP传过来四条明细路由(比如10.1.8.0/24….四条),作为本AS的边缘路由手动聚合汇总了明细路由/22,发布给IBGP的同时也会发回给EBGP,因为手动聚合将AS_path参数清理掉了,所以需要加上as-set让这条汇总路由携带该参数。

路由反射器(RR)

作用:BGP不会将从IBGP对等体学到的路由通告给其他IBGP对等体,并与所有IBGP对等体建立全连接,所以为了防止连接数量太多,BGP设计了路由反射器。

传递原则:

  • 非非不传递
    • 非客户端与非客户端不传递
    • RR从客户端收到的路由,会传递给非客户端
    • RR从非客户端收到的路由,会传递给客户端

防环属性

  • originator id
    • 第一台RR会填充这个字段
      • 反射的时候,如果RR收到了里面携带自己id的,就会丢弃掉。(默认产生)
  • cluster id
    • 每次经过设备都会填充,只要收到重复的,就丢弃掉(默认产生)

路由器属性

  • 公认属性是所有BGP路由器都必须能够识别的属性
    • 公认必遵(必须包括在每个Update消息里)
      • Origin
      • AS_Path
      • Next_Hop
    • 公认任意(可能包括在某些Update消息里)
      • Local_Preference
      • Atomic_aggregate
  • 可选属性不需要都被BGP路由器所识别
    • 可选过渡(BGP设备不识别此类属性依然会接受该类属性并通告给其他对等体)
      • Aggregator
      • Community
    • 可选非过渡(BGP设备不识别此类属性会忽略该属性,且不会通告给其他对等体)
      • MED
      • Cluster-List
      • Originator-ID

选路原则(当到达同一个目的网段存在多条路由时,BGP通过如下的次序进行路由优选)

  1. 丢弃下一跳不可达的路由
  2. 优选Preferred-Value协议首选值 属性值最大的路由
    • 特点:本地产生的选路规则,针对入方向的路由,可以通过协议首选值控制路由进入设备
    • 仅仅本地有意义,可以调整的范围是0-65536,比较规则是越大越优先。
  3. 优选Local_Preference本地优先级 属性值最大的路由
    • 特点:影响本AS的选路控制,通过该方式,调整内部选路,一般是在收到EBGP路由的设备上面配置,影响内部选路走我这个路径,这个值一般用于控制怎么出
    • 比较方式,越大越优先,缺省为100
    • 影响范围:当前AS,从IGBP收到不会再传递给EBGP邻居
    • 配置方法:
      • 配置规则
        • route-policy local permit node 10
        • apply local-preference 1000
      • 针对EBGP收到的路由调用,影响本AS内部的设备的路由选路
        • peer 2.2.2.2 route-policy local import
  4. 本地始优于对等体传递过来的
    • 手动聚合>自动聚合>network>import>从对等体学习到的
  5. 选举as-path更短的路由
    • 防环:每次路由传递给EBGP邻居的时候,会产生自己的AS编号。 从邻居收到路由,里面如果有携带自己的AS编号的话,会拒绝接收这条路由
    • 选路:当从两个对等体收到路由的时候,选择AS编号更少的
    • 配置方法:
      • 配置规则
        • route-policy as permit node 10
        • apply as-path 10 20 additive 增加10 和20
        • apply as-path 10 20 overwrite 替换成10和20
        • apply as-path none overwrite 清空
  6. 优选Origin起源属性 属性最优的路由
    • 特点:标注一个路由的来源,分别有三种:IGP/EGP/?未知来源(import ospf引入的方式这种就会是?)。 i>e>?
    • 一般不会通过该属性去做选路控制,影响范围较大,可调整的属性太少
    • 配置方法:
      • route-policy 1 permit node 10
      • if-match ip-prefix 1
      • apply origin egp 1 修改为EGP属性
  7. 优选MED 属性值最小的路由
    • 类似cost,是一种度量值。可以影响到下一个自治系统的选路,只会在下一个自治系统中传递,不会再传递给下下个,这个值一般用于控制怎么进入本AS
    • 越小越优先
    • 配置方法:
      • route-policy q1 permit node 10
      • if-match ip-prefix q1
      • apply cost 1 修改med为1
  8. 优选从EBGP对等体学来的路由(EBGP路由优先级高于IBGP)
  9. 优选next_hop的IGP度量值小的路由。
    • 假如是通过OSPF部署的IGP,在对等体维护接口ospf cost * 修改度量值
    • 通过display bgp routing-table 路由 可以查看到路由非常多的信息,故障排查经常会用得到
  10. 负载均衡
    • 前面属性如果完全一致,可以通过命令实现负载均衡(本地路由表的),传递给其他对等体的路由当中还是选择最优的传递。
    • 进入到bgp视图内bgp * ,maximum load-balancing igbp 2 #2等于负载条目
    • 配置方法:
      • maximum load-balancing ibgp 2
  11. 优选Cluster_List 最短的路由
    • 一般不会拿这个去选路。
  12. 优选Router ID(Orginator ID)最小的设备通告的路由
  13. 优选具有最小IP地址的对等体通告的路由
  14. 优选通告时间长的

作者:Zleoco,如若转载,请注明出处:https://www.zleoco.com/?p=1451

发表回复

您的电子邮箱地址不会被公开。