iBGP/eBGP/IGP/OpenFlow

发布于 作者: Ethan

引言

用例子说明BGP/IGP/OpenFlow是如何工作。

基本拓扑

topo

场景说明

  • 企业 AS:65001

  • 上游 ISP:

    • ISP-A (AS 65002) 宣告:8.8.8.0/24
    • ISP-B (AS 65003) 宣告:8.8.8.0/24
  • AS65001 内部运行:

    • IGP: OSPF(提供内部连通)
    • iBGP: 在 R1、R2、R3 之间建立全连接
  • R2、R3 分别与两个 ISP 建立 eBGP


eBGP 阶段:外部路由注入

ISP-A(AS65002)向 R2 发出 BGP UPDATE:

BGP UPDATE Message
-------------------------------
NLRI:        8.8.8.0/24
AS_PATH:     [65002]
NEXT_HOP:    203.0.113.1   (ISP-A出接口)
LOCAL_PREF:  (未设置, 不传播)
ORIGIN:      IGP
MED:         0

R2 收到后,在本地路由表中生成:

Prefix:      8.8.8.0/24
Next-Hop:    203.0.113.1
AS_PATH:     [65002]
LOCAL_PREF:  100 (默认)

同时,R2 对这条路由应用策略(route-map)

set local-preference 200

调整优先级以让出站流量优先走 ISP-A。


iBGP 阶段:内部路由传播

R2 将该外部路由通过 iBGP 通告给 R1 与 R3:

BGP UPDATE Message (iBGP)
-------------------------------
NLRI:        8.8.8.0/24
AS_PATH:     [65002]
NEXT_HOP:    192.168.1.2   (R2在AS内部的接口)
LOCAL_PREF:  200
ORIGIN:      IGP

特征:

  • iBGP 不修改 AS_PATH;
  • LOCAL_PREF 被保留;
  • NEXT_HOP 由 eBGP 学来的外部地址改为 R2 内部接口;
  • TTL=255(非直连)。

同理,R3 也从 ISP-B 学到:

8.8.8.0/24, AS_PATH [65003], LOCAL_PREF=100

并通过 iBGP 通告给 R1、R2。


IGP 阶段:提供内部连通性

在企业 AS65001 内部,R1、R2、R3 运行 OSPF

邻居 OSPF 网络 代价(cost)
R1 ↔ R2 192.168.1.0/24 10
R1 ↔ R3 192.168.2.0/24 10
R2 ↔ R3 192.168.3.0/24 20

IGP 不参与 BGP 决策,但它确保 “下一跳(R2)” 是可达的。 当 R1 要转发到 8.8.8.8 时,OSPF 提供路由:

Destination: 192.168.1.2  (R2)
Interface:   eth0
Next-hop:    R2

BGP 决策过程(在 R1 上)

R1 收到两条 iBGP 路由:

来源 AS_PATH LOCAL_PREF NEXT_HOP 结果
来自 R2 [65002] 200 192.168.1.2 ✅ 优选
来自 R3 [65003] 100 192.168.2.2

决策顺序中:

1. Highest LOCAL_PREF → R2 (200 > 100)
2. Shortest AS_PATH   → 不比较
3. Lowest Origin type → 不比较
...

因此,R1 最终选择 R2 → ISP-A 作为出站路径。


数据包转发路径

主机 H1(在 R1 后面)访问公网的 8.8.8.8

1. H1 → R1:目标 IP = 8.8.8.8
2. R1 查 BGP 表:
     Best route: via R2
3️. R1 通过 OSPF 路由找到 R2
4️. R2 → ISP-A(AS65002)
5️. ISP-A 转发到 8.8.8.8

如果 ISP-A 断线,则 R1 的路由失效,BGP 重新选择来自 R3 的路径(LOCAL_PREF=100),此时流量自动改走 R3 → ISP-B


实际 BGP 报文结构(简化版)

以 eBGP UPDATE 为例(R2 收到 ISP-A 通告):

Marker:    FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF
Length:    59
Type:      UPDATE (2)
Withdrawn Routes Length: 0
Total Path Attribute Length: 36
Path Attributes:
  ORIGIN: IGP (1)
  AS_PATH: [65002]
  NEXT_HOP: 203.0.113.1
  LOCAL_PREF: (Not included)
NLRI: 8.8.8.0/24

总结

阶段 协议 主要任务 数据携带
eBGP 外部路由交换 学到互联网前缀(如 8.8.8.0/24) AS_PATH、NEXT_HOP
iBGP 内部路由分发 在 AS 内传播外部前缀 保留 LOCAL_PREF
IGP 内部路径确定 提供转发下一跳连通性 Cost/Metric

Local Preference 的本质

LOCAL_PREF 是一个 数值型 BGP 属性,表示“在本 AS 内部到达某前缀的偏好程度”, 数值越大,优先级越高

它是:

  • Well-known discretionary attribute(标准可选属性);
  • 仅在 iBGP 内部传播(不会传出 AS);
  • 主要控制出站流量(Outbound Routing)。

Local Preference 的生成与传播机制

一、初始生成(在 eBGP 入站阶段)

当一个边界路由器(edge router)从外部 eBGP 邻居接收到 UPDATE 报文时,它会通过本地策略(policy / route-map / filter-list)设置 LOCAL_PREF

常见做法:

# Cisco 例子
route-map FROM_ISP-A permit 10
  set local-preference 200

route-map FROM_ISP-B permit 10
  set local-preference 100

router bgp 65001
  neighbor 203.0.113.1 route-map FROM_ISP-A in
  neighbor 198.51.100.1 route-map FROM_ISP-B in

含义: 当路由从 ISP-A 学到时,打上 LOCAL_PREF=200; 当路由从 ISP-B 学到时,打上 LOCAL_PREF=100。 → 这样整个 AS 内部都会优先选择走 ISP-A。


二、内部传播(iBGP 阶段)

一旦某台边界路由器(如 R2)给某个前缀设置了 LOCAL_PREF, 它会通过 iBGP 向整个 AS 广播该属性

属性 是否传播到 AS 外 是否在 iBGP 内传播
LOCAL_PREF

因此,AS 内所有路由器都能看到相同的优先值,从而统一出站决策。


三、缺省值生成

如果没有显式配置:

  • 多数厂商(Cisco、Juniper、Huawei)默认 LOCAL_PREF = 100
  • 因此默认情况下所有外部路由的优先级相同。

Local Preference 决策的来源(可配置因素)

LOCAL_PREF 本身不是自动“计算”的,而是由策略(policy)生成的, 这些策略可以根据多种条件匹配:

条件 示例匹配项 动作(生成策略)
邻居来源 来自 ISP-A / ISP-B 给 ISP-A 路由 LOCAL_PREF=200
前缀匹配 匹配 8.8.8.0/24 特定服务优先走某链路
AS-PATH 匹配 AS65002 对特定上游提高偏好
Community 值 匹配 65001:10 通过社区标签分配优先级
MED 值 若外部通告 MED 较小,可适当提升 LOCAL_PREF
接口状态 通过监控链路可用性动态调整 LOCAL_PREF

举例(华为 / Cisco 通用思想):

route-map PRIORITY-IN permit 10
  match community 65001:10
  set local-preference 250
route-map PRIORITY-IN permit 20
  match as-path 65002
  set local-preference 200
route-map PRIORITY-IN permit 30
  set local-preference 100

Local Preference 在 BGP 决策过程中的位置

BGP 选择“最佳路径”有一套标准流程(RFC 4271):

优先级 决策步骤 说明
1 Highest LOCAL_PREF 本地优先级最高的路由优先(用于出站)
2 Shortest AS_PATH 路径经过的 AS 数量更少优先(用于入站)
3 Lowest ORIGIN type IGP < EGP < Incomplete
4 Lowest MED 对来自同一 AS 的路由比较 MED
5 eBGP 优先于 iBGP 来自外部优先
6 Lowest IGP cost to NEXT_HOP 内部到下一跳的代价较低优先
7 Oldest route / Router ID 决策平局时备用项

因此,LOCAL_PREF 是 BGP 路由选择的 第一层决策因素, 比 AS-PATH、MED、NEXT_HOP 等都更早评估。


实际应用示例

场景:控制出站路径

企业 AS 65001 有两条出口:

  • R2 → ISP-A
  • R3 → ISP-B

希望所有 Internet 流量优先走 ISP-A。

R2(config)# route-map SET-LP-IN permit 10
R2(config-route-map)# set local-preference 200
R3(config)# route-map SET-LP-IN permit 10
R3(config-route-map)# set local-preference 100

结果: AS65001 内所有路由器在 iBGP 表中看到:

Prefix: 0.0.0.0/0
R2 path: LOCAL_PREF 200  ← 被选为首选出口
R3 path: LOCAL_PREF 100

动态调整机制(高阶策略)

现代运营商或大型网络会根据链路负载、延迟、带宽或故障检测动态调整 LocalPref,例如:

  • 使用 BGP Route-Reflector + Policy Engine
  • 结合 BFD(Bidirectional Forwarding Detection) 检测出口可达性;
  • 通过 BGP Community 标签批量修改优先级。

例如:

Community 65001:100 → 高优先级出口 (LocalPref=250)
Community 65001:200 → 低优先级出口 (LocalPref=100)

这样上游 ISP 只需添加特定社区标签即可让流量自动选择对应出口。


LocalPref总结

特性 描述
类型 Well-known discretionary
取值范围 任意整数(通常 0–65535)
默认值 100
比较规则 越大越优先
传播范围 仅在同一 AS 内(iBGP)
决策方向 控制出站路径
配置位置 eBGP 入站策略(route-map / policy)

OpenFlow

我们假设一个小型数据中心网络,有两个交换机和四台主机:

          +---------------------+
          |   SDN Controller    |
          +---------------------+
                /           \
               /             \
          +--------+     +--------+
          | Switch1|-----| Switch2|
          +--------+     +--------+
           /     \         /     \
       HostA   HostB   HostC   HostD
     (10.0.0.1)(10.0.0.2)(10.0.0.3)(10.0.0.4)

目标: Host A(10.0.0.1)要与 Host D(10.0.0.4)通信。 路径为: HostA → Switch1 → Switch2 → HostD

openflow seq chart