前言:
- 当一台 BGP 路由器从多个路径(不同的邻居)学习到去往同一目的网络前缀的路由时,它需要根据一套严格的规则选择一条最优 (Best) 路径放入 IP 路由表,并用于数据转发
- BGP路由反射器(RR)是为解决IBGP全互联问题而设计的,通过减少IBGP邻居数量优化网络架构
BGP通告
BGP的通告遵循以下原则:
- 只发布最优且有效路由
- 从EBGP对等体获取的路由,会发布给所有对等体
- IBGP水平分割:从IBGP对等体获取的路由,不会发送给IBGP对等体
- BGP同步规则指的是:当一台路由器从自己的IBGP对等体学习到一条BGP路由时(这类路由被称为IBGP路由),它将不能使用该条路由或把这条路由通告给自己的EBGP对等体,除非它又从IGP协议(例如OSPF等此处也包含静态路由)学习到这条路由,也就是要求IBGP路由与IGP路由同步。同步规则主要用于规避BGP路由黑洞问题
黑洞问题
简单来说: 我去快递站寄一个快递(数据包),快递站(路由器)明明知道最终目的地(目标 IP 地址),但中间的站点(路由器)却不知道下一步该把快递送到哪里去(没有有效的下一跳路由),或者知道送过去也没人签收(路由指向一个不存在的接口或设备)。结果,这个站点就直接把你的快递扔掉了(丢弃数据包),这就是BGP黑洞
总结:黑洞问题是: 路由器知道目的地存在(通过 BGP 学到了这条路由),但它自身没有能力将数据送达下一跳或者目的地
同步
同步的目的是为了防止上面说的“运营商内部路由缺失”导致的黑洞问题
简单来说黑洞是问题(数据消失),同步是过去用来防止特定黑洞问题的一种机制(通过限制路由广播)
水平分割
BGP 的水平分割是一种核心的防环机制,主要应用于 IBGP 对等体之间。其核心规则是:一条通过 IBGP 对等体学到的路由,不能再通告给另一个 IBGP 对等体
其目的是防止同一个 AS 内部的 BGP 路由环路(因为 IBGP 不修改 AS_PATH),EBGP不受限制
水平分割规则要求 IBGP 对等体之间必须形成全互联,于是产生了路由反射器和联盟
路由反射器(RR)
BGP 路由反射器 (Route Reflector - RR)
1. 解决的问题:IBGP 全互联困境
规则限制: IBGP 路由器之间默认不能将从某个 IBGP 对等体学到的路由再通告给其他 IBGP 对等体,因为环路的存在
扩展性问题: 在一个大型 AS 内部,如果要求所有 IBGP 路由器之间建立全互联 (Full Mesh) 连接(
n*(n-1)/2
个连接),管理和维护成本会急剧上升,配置复杂且资源消耗巨大
2. RR 的核心思想
角色定义:
路由反射器 (RR): 允许把从IBGP对等体学到的路由反射到其他IBGP对等体的BGP设备
客户端 (Client): 与RR形成反射邻居关系的IBGP设备。RR 会将从客户端或非客户端学到的路由反射给其他客户端
非客户端 (Non-Client): 既不是RR也不是客户机的IBGP设备。RR 只会将从非客户端学到的路由反射给客户端(不会反射给其他非客户端),只会将从客户端学到的路由反射给客户端和非客户端
反射规则: RR 在收到一条 IBGP 路由后,会根据来源决定如何反射:
从客户端学到的路由: 反射给所有其他客户端和所有非客户端
从非客户端学到的路由: 反射给所有客户端(不反射给其他非客户端)
从 EBGP 对等体学到的路由: 按照正常 IBGP 规则通告给所有 IBGP 对等体(包括客户端和非客户端),因为这条规则只限制 IBGP到 IBGP的传递
优势: 减少 IBGP 连接数
RR的防环机制:由Originator_ID和Cluster_List这两个属性来阻止防环
配置本设备为 RR,并指定客户端 # 语法: peer <client-ip-address> reflect-client peer 2.2.2.2 reflect-client # 将 2.2.2.2 配置为客户端 peer 3.3.3.3 reflect-client # 将 3.3.3.3 配置为客户端 # peer 4.4.4.4 没有被配置为客户端,因此它是非客户端 (可选) 配置 Cluster ID (默认是 Router ID) reflector cluster-id 10.10.10.10
联盟
联盟将一个AS内部划分为若干个子AS。每个子AS内部建立IBGP全连接关系,子AS之间建立联盟EBGP连接关系,但联盟外部AS仍认为联盟是一个AS。配置联盟后,原AS号将作为每个路由器的联盟ID
这样有两个好处:
- 一是可以保留原有的IBGP属性,包括Local Preference属性、MED属性和NEXT_HOP属性等
- 二是联盟相关的属性在传出联盟时会自动被删除,即无需在联盟的出口处配置过滤子AS号等信息的操作
核心思想: 对外部世界隐藏内部复杂的 AS 划分,整个联盟对外仍然表现为一个单一的 AS 号(称为联盟 ID (Confederation ID
联盟 ID (Confederation ID):这是整个联盟对外呈现的 AS 号
成员 AS (Member-AS):联盟内部划分成的逻辑子自治系统,每个成员AS有自己的AS号,这个 AS 号仅在联盟内部可见,对外部 AS 是不可见的
联盟边界路由器 (Confederation Border Router):指那些既与联盟内部其他成员 AS 的邻居建立会话(联盟内 EBGP),也与外部真实 AS 的邻居建立会话(标准 EBGP)的路由器
注意:
同一个成员 AS 内的路由器之间运行标准IBGP
不同成员 AS 的路由器之间运行联盟内EBGP (Confederation EBGP)
防环:
- 通告路由时,在
AS_PATH
属性中会添加一个特殊的段类型AS_CONFED_SEQUENCE
,里面包含经过的成员 AS 号序列 - 路由器如果在自己收到的
AS_PATH
的AS_CONFED_SEQUENCE
段中看到自己所在的成员 AS 号,就会丢弃该路由更新,防止在联盟内部形成环路
[Router] bgp 100 // 所有路由器都使用联盟 ID 65000
[Router-bgp] confederation id 100 // 再次指定联盟 ID
[Router-bgp] confederation peer-as 101 102 // 列出联盟内所有的成员 AS 号
在每个路由器上指定自己所属的成员 AS
[Router-bgp] confederation as-number <member-as> // 例如 R1/R2: 101; R3/R4: 102
建立 BGP 邻居关系
IBGP
[Router-bgp] peer <R2_IP_Address> as-number 100 // AS号写联盟ID 100
[Router-bgp] peer <R2_IP_Address> connect-interface LoopBack0 // 通常用环回口建立
EBG
[Router-bgp] peer <R3_IP_Address> as-number 102 // AS号写邻居的 member-as
[Router-bgp] peer <R3_IP_Address> ebgp-max-hop 2 // 如果非直连,需要指定跳数
[Router-bgp] peer <R3_IP_Address> connect-interface LoopBack0 // 用环回口建立
与外部真实 AS,不再是联盟内部的
[Router-bgp] peer <2.2.2.2> as-number 100 // 标准 EBGP
路由优选
当到达同一目的地存在多条路由时,BGP依次对比下列属性来选择路由:
丢弃下一跳不可达的路由,是必备的前置条件
优选协议首选值(PrefVal)最大的路由,值越大越优
协议首选值(PrefVal)是华为设备的特有属性,该属性仅在本地有效
优选本地优先级(Local_Pref)最大的路由,值越大越优
依次优选手动聚合路由、自动聚合路由、network命令引入的路由、import-route命令引入的路由、从对等体学习的路由
优选AS路径(AS_Path)最短的路由,越短越优先
依次优选Origin类型为IGP、EGP、Incomplete的路由,优先级:
(i)
>(e)
>(?)
对于来自同一AS的路由,优选MED值最低的路由,越小越优
依次优选EBGP路由、IBGP路由,EBGP 路由优先级高于 IBGP 路由
优选到BGP下一跳IGP度量值(metric)最小的路由,值越小越优
优选
Cluster_List
长度:越短越优优选最低的
Router ID
: 优选 BGP 邻居中 Router ID 最小 的那台路由器通告的路由。如果路由是通过 RR 反射来的,则比较Originator_ID
(如果存在且不为 0)优选最低的
IP Address
邻居: 如果 Router ID 相同(或比较 Originator_ID 后相同),则优选邻居 IP 地址(建立 BGP 会话的源 IP)最小的那条路径
BGP负载分担
当到达同一目的地址存在多条等价路由时,可以通过BGP等价负载分担实现均衡流量的目的
形成BGP等价负载分担的条件是“BGP选择路由的策略”中的前9条规则中需要比较的属性完全相同