引言
用例子说明BGP/IGP/OpenFlow是如何工作。
基本拓扑

场景说明
-
企业 AS:65001
-
上游 ISP:
- ISP-A (AS 65002) 宣告:
8.8.8.0/24 - ISP-B (AS 65003) 宣告:
8.8.8.0/24
- ISP-A (AS 65002) 宣告:
-
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
