1. BGP 的定位:为什么有 OSPF 还需要 BGP

OSPF / EIGRP 更适合解决一个 AS 内部的动态路由问题。

BGP 的核心目标则是:

  • 在不同 AS 之间交换大量 Prefix
  • 根据策略而不仅仅是链路 Cost 进行选路
  • 利用 Path Attributes 控制出口和入口
  • 支撑 Internet、大型 IDC、运营商和大型企业网络

AS(Autonomous System)

AS 可以理解为:

在统一管理和外部路由策略下运行的一组网络。

BGP 分为:

  • eBGP:不同 AS 之间建立 BGP
  • iBGP:同一个 AS 内部建立 BGP

例如:

1
2
3
4
AS65001 ── eBGP ── AS65002

AS65001 内部:
R1 ── iBGP ── R2

iBGP 不能替代 OSPF/EIGRP。

常见设计:

1
2
3
4
5
IGP(OSPF / IS-IS 等)
→ 提供 AS 内部基础 IP 可达性

iBGP
→ 在 AS 内传播 BGP Prefix 和 Path Attributes

2. BGP Neighbor 与 FSM

BGP 不像 OSPF 一样依靠 Hello 自动发现邻居,而是显式指定 Neighbor。

1
2
router bgp 65001
neighbor 10.0.12.2 remote-as 65002

BGP 使用:

1
TCP Port 179

因此建立 BGP 的基础条件之一是:

1
2
3
4
底层 IP 可达
→ TCP Session 建立
→ BGP OPEN
→ BGP Neighbor Established

BGP FSM

核心状态:

1
2
3
4
5
6
7
8
9
10
11
Idle
↓
Connect
↓
Active
↓
OpenSent
↓
OpenConfirm
↓
Established

简化理解:

  • Idle:初始状态
  • Connect:尝试建立 TCP
  • Active:TCP 建立失败后等待/重试
  • OpenSent:TCP 已建立,交换 OPEN
  • OpenConfirm:OPEN 已确认,等待 KEEPALIVE
  • Established:BGP Session 正常,可以交换 UPDATE

长期停留在 Active:

1
2
3
4
5
6
优先检查:
IP Reachability
TCP 179
Neighbor IP
remote-as
ACL

主要 BGP Message

1
2
3
4
5
6
7
8
9
10
11
OPEN
→ 建立 BGP Session、协商参数

KEEPALIVE
→ 维持邻居关系

UPDATE
→ 携带 Prefix 和 BGP Path Attributes

NOTIFICATION
→ BGP 错误通知

3. BGP 路由始发:network 与 OSPF network 的区别

BGP:

1
network 192.168.10.0 mask 255.255.255.0

含义:

将指定 Prefix 始发进入本地 BGP。

一般要求本地 RIB 中存在精确匹配的 Prefix。

例如:

1
2
3
RIB:

C 192.168.10.0/24

则:

1
network 192.168.10.0 mask 255.255.255.0

可以正常始发。

但是如果只有:

1
2
192.168.10.0/25
192.168.10.128/25

并不能满足:

1
network 192.168.10.0 mask 255.255.255.0

因为 RIB 中没有精确的:

1
192.168.10.0/24

BGP 不会自动把两个 /25 合并成 /24。

与 OSPF network 的区别

OSPF:

1
network 192.168.10.0 0.0.0.255 area 0

核心作用:

1
2
3
用 wildcard 匹配本 Router 的接口 IP
→ 在匹配接口运行 OSPF
→ 将接口放入指定 Area

BGP:

1
network Prefix mask Subnet-Mask

核心作用:

1
2
指定要始发进入 BGP 的 Prefix
→ RIB 精确匹配

4. AS_PATH 与 BGP 防环

BGP 是 Path Vector Protocol。

重要属性:

1
AS_PATH

例如:

1
2
3
4
5
6
7
8
9
R1 AS65001
|
| eBGP
|
R2 AS65002
|
| eBGP
|
R3 AS65003

R1 始发 Prefix:

1
192.168.10.0/24

R3 最终可能看到:

1
AS_PATH = 65002 65001

左边通常是最近经过的 AS。

当 eBGP 向其他 AS 通告路由时,会在 AS_PATH 中加入自己的 AS。

如果 R3 收到:

1
AS_PATH = ... 65003 ...

发现自己的 AS 已经存在:

1
2
3
→ 说明路由绕回来了
→ 默认拒绝
→ 防止 AS 级路由环路

AS-PATH Prepending

可以人为重复自己的 AS:

1
400 400 400 500

让路径看起来比:

1
600 500

更长。

常用于:

尝试降低外部 AS 选择该入口的意愿。

注意:

AS-PATH Prepending 只能影响对方的 BGP Best Path 判断,不能保证对方一定按照预期选择,因为对方可能存在更高优先级的 Local Preference 等策略。

5. NEXT_HOP 与 next-hop-self

BGP Route 不只有 Prefix,还包含:

1
NEXT_HOP

例如:

1
R1 10.0.12.1 ── eBGP ── 10.0.12.2 R2

R1 向 R2 通告:

1
192.168.10.0/24

R2 通常看到:

1
2
Prefix   = 192.168.10.0/24
NEXT_HOP = 10.0.12.1

NEXT_HOP 必须可达,否则 BGP Path 无法正常用于转发。

iBGP NEXT_HOP 问题

1
ISP ── eBGP ── Edge ── iBGP ── Core

Edge 从 ISP 学到:

1
2
8.8.8.0/24
NEXT_HOP = ISP

再通过 iBGP 告诉 Core 时,默认通常保留 NEXT_HOP:

1
2
3
4
Core:

8.8.8.0/24
NEXT_HOP = ISP

如果 Core 不知道如何到达 ISP 的地址,就会出现 NEXT_HOP 不可达。

常见解决:

1
2
router bgp 65001
neighbor <Core-IP> next-hop-self

变成:

1
2
3
4
Core:

8.8.8.0/24
NEXT_HOP = Edge

然后利用内部 OSPF/IGP 到达 Edge。

核心:

1
2
3
4
5
6
7
8
eBGP 对外通告
→ 通常修改 NEXT_HOP

iBGP 内传播
→ 通常保留 NEXT_HOP

next-hop-self
→ 主动把自己设置为 NEXT_HOP

6. iBGP Full Mesh 与 Route Reflector

iBGP 有重要规则:

从一个 iBGP Peer 学到的路由,默认不能继续通告给另一个普通 iBGP Peer。

原因之一:

在同一个 AS 内传播时不会像 eBGP 那样不断向 AS_PATH 加入新的 AS,因此不能简单依赖 AS_PATH 完成 AS 内部防环。

因此普通 iBGP 要求 Full Mesh。

如果有 n 台 iBGP Router:

1
2
3
Session 数量:

n(n-1)/2

例如:

1
2
3
4 台 Router
→ 4×3/2
→ 6 条 Session

规模增大后 Full Mesh 扩展性很差。

Route Reflector

RR 打破普通 iBGP 的传播限制。

1
2
3
4
5
        Client
|
Client ─ RR ─ Client
|
Client

RR 可以将 Client 学来的 iBGP Route 反射给其他 Client。

优点:

1
2
减少 iBGP Session 数量
降低 Full Mesh 维护复杂度

RR 防环

重要属性:

1
2
3
4
5
ORIGINATOR_ID
→ 记录路由最初的 Originator

CLUSTER_LIST
→ 记录经过的 RR Cluster

用于避免 Route Reflection 环境中的路由环路。

注意:

RR 反射的是 BGP 路由信息。

不是:

1
2
收到一个 BGP Packet
→ 原封不动转发这个 Packet

而是:

1
2
3
4
收到 BGP UPDATE
→ 处理 BGP Route
→ 在另一个 BGP Session 上生成新的 UPDATE
→ 通告给 Peer

7. BGP Best Path 主干

当同一个 Prefix 存在多条 BGP Path 时,需要进行 Best Path Selection。

Cisco 常见考试/学习主干可以记为:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
1. Weight
→ 大优

2. Local Preference
→ 大优

3. Locally Originated
→ 本地始发优

4. AS_PATH
→ 短优

5. Origin
→ i < e < ?

6. MED
→ 小优
→ 默认存在比较条件

7. eBGP > iBGP

8. 到 NEXT_HOP 的 IGP Metric
→ 小优

9. 后续 Tie-breaker
→ 继续保证最终可以确定 Best Path

实际平台/版本的完整 Best Path 流程可能包含更多条件和细节,应以对应平台文档为准。

Weight

Cisco 本地属性:

1
越大越优

特点:

1
2
只在本 Router 有效
不会通告给其他 BGP Router

Neighbor 学到的 Route:

1
Weight 通常默认 0

Cisco 本地产生的 BGP Route:

1
Weight 通常默认 32768

Local Preference

1
越大越优

在 AS 内通过 iBGP 传播。

典型用途:

控制整个 AS 更喜欢从哪个出口出去。

例如:

1
2
3
4
ISP1 → R1:LocalPref 500
ISP2 → R2:LocalPref 100

→ AS 内倾向 R1 → ISP1

一句话:

1
2
3
4
5
Weight
→ 我这台 Router 喜欢怎么走

Local Preference
→ 我整个 AS 喜欢怎么出去

AS_PATH

在前面的高优先级属性相同后:

1
AS_PATH 越短通常越优

但:

1
2
3
AS_PATH 短
≠ 物理距离一定短
≠ 延迟一定低

只表示 AS 层面的 Path 更短。

Origin

优先级:

1
i < e < ?

即:

1
2
3
i          最优
e
? 最后

常见:

1
2
3
4
5
BGP network
→ Origin 通常为 i

redistribute
→ Origin 通常为 ?

i 不代表这条路一定来自 OSPF/EIGRP。

MED

1
越小越优

典型作用:

告诉相邻 AS,希望它从哪个入口进入我的 AS。

例如:

1
2
3
4
入口 A:MED 50
入口 B:MED 200

→ 对方满足 MED 比较条件时倾向入口 A

默认情况下 MED 通常主要比较来自同一个相邻 AS 的 Path。

不同相邻 AS 的 MED 默认不一定直接比较;相关行为可以通过 BGP 配置改变。

eBGP vs iBGP

前面的属性打平后:

1
2
3
eBGP Path
优于
iBGP Path

IGP Metric to NEXT_HOP

如果前面继续打平:

1
2
3
4
5
6
7
Path A NEXT_HOP
OSPF Cost = 20

Path B NEXT_HOP
OSPF Cost = 100

→ 倾向 Path A

这体现了:

1
2
BGP 决定走哪个出口
IGP 决定内部如何到达 BGP NEXT_HOP

8. BGP Best Path、AD 与 LPM 不要混淆

这是三个不同层次。

BGP Best Path

解决:

同一个 Prefix 有多条 BGP Path,BGP 自己选哪条?

使用:

1
2
3
4
5
6
Weight
Local Preference
AS_PATH
Origin
MED
...

Administrative Distance

解决:

不同路由来源对同一个 Prefix 都提供路由,RIB 更信任谁?

Cisco 常见默认值:

1
2
3
4
5
6
Connected      0
Static 1
eBGP 20
EIGRP 90
OSPF 110
iBGP 200

AD 越小越优。

例如相同 Prefix:

1
2
3
4
eBGP AD 20
OSPF AD 110

→ 通常安装 eBGP Route

Longest Prefix Match

真正转发 Packet 时:

1
先选择最长 Prefix Match

例如:

1
2
OSPF:8.8.8.0/24
eBGP:8.8.0.0/16

访问:

1
8.8.8.8

优先匹配:

1
/24

不能因为 eBGP AD 更小就忽略更具体的 /24。

9. BGP Route Policy

Prefix-list

作用:

1
匹配 Prefix + Prefix Length

例如:

1
ip prefix-list PL-IN permit 10.0.0.0/8 ge 16 le 24

含义:

1
2
匹配 10.0.0.0/8 范围内
Prefix Length 为 /16~/24 的路由

可以直接用于 Neighbor:

1
2
router bgp 65001
neighbor 1.1.1.1 prefix-list PL-IN in

此时:

1
2
permit → 允许
deny → 拒绝

末尾存在 implicit deny。

也可以作为 Route-map 的 Match 条件:

1
2
3
route-map POLICY permit 10
match ip address prefix-list PL-IN
set local-preference 500

AS-path ACL + Filter-list

AS-path ACL:

1
2
ip as-path access-list 10 deny _65003_
ip as-path access-list 10 permit .*

用于匹配:

1
BGP AS_PATH

然后:

1
2
router bgp 65001
neighbor 1.1.1.1 filter-list 10 in

关系:

1
2
3
4
5
AS-path ACL
→ 定义匹配规则

Filter-list
→ 将 AS-path ACL 应用到 BGP Neighbor

Route-map

Route-map 核心:

1
2
3
MATCH
+
SET

即:

1
2
3
匹配哪些路由
+
对匹配路由修改什么属性

例如:

1
2
3
4
5
ip prefix-list PL1 permit 10.0.0.0/8

route-map POLICY permit 10
match ip address prefix-list PL1
set local-preference 500

按 AS_PATH 匹配:

1
2
route-map POLICY permit 10
match as-path 10

注意:

1
match as-path 10

匹配的是:

1
AS-path ACL 10

不是 filter-list。

三者快速判断

1
2
3
4
5
6
7
8
按 Prefix 过滤
→ Prefix-list

按 AS_PATH 过滤
→ AS-path ACL + Filter-list

需要复杂 Match + 修改属性
→ Route-map

10. In/Out、Multipath、配置验证与排障

In / Out 永远站在本 Router 视角

1
ISP ───── R1

R1:

1
neighbor ISP route-map POLICY in

表示:

1
ISP → R1

处理收到的 BGP Route。

而:

1
neighbor ISP route-map POLICY out

表示:

1
R1 → ISP

处理向 ISP 通告的 BGP Route。

Local Preference

典型:

1
2
3
ISP → Edge
↑
IN

收到外部 Route 后提高 Local Preference:

1
2
3
4
5
route-map SET-LP permit 10
set local-preference 500

router bgp 65001
neighbor <ISP-IP> route-map SET-LP in

控制:

1
我的 AS 怎么出去

注意:

1
2
控制的是“出站业务流量”
但 BGP Policy 通常应用在路由接收 IN 方向

业务流量方向和 BGP UPDATE 方向不能混淆。

AS-PATH Prepending

典型应用:

1
2
我的 AS → 外部 AS
OUT

通过拉长向外通告 Route 的 AS_PATH:

1
set as-path prepend 65001 65001 65001

尝试影响:

1
外部 AS 如何进入我的 AS

BGP Multipath

BGP 默认核心行为:

1
2
3
多条 Path
→ Best Path Selection
→ 选出 Best Path

如果希望安装多条符合条件的 BGP Path,需要显式启用 Multipath。

例如常见 Cisco:

1
2
router bgp 65001
maximum-paths 2

iBGP 场景可能使用:

1
maximum-paths ibgp 2

具体等价条件和命令应根据平台确认。

数据平面通常使用 Flow Hash 进行 ECMP,而不是简单逐包轮询。


基础配置示例

R1:

1
2
3
router bgp 65001
neighbor 10.0.12.2 remote-as 65002
network 192.168.10.0 mask 255.255.255.0

重要 Show 命令

1
show ip bgp summary

查看:

1
2
3
4
Neighbor
Remote AS
BGP State
收到 Prefix 数量
1
show ip bgp

查看:

1
2
3
4
5
6
BGP Table
Best Path
NEXT_HOP
AS_PATH
Origin
Weight 等

查看具体 Prefix:

1
show ip bgp 8.8.8.0/24

查看 BGP Neighbor:

1
show ip bgp neighbors

查看进入 RIB 的 BGP Route:

1
show ip route bgp

检查 NEXT_HOP:

1
show ip route <next-hop>

BGP 排障顺序

第一层:Neighbor 不起来

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
show ip interface brief
↓
接口正常?

ping Peer-IP
↓
底层 IP 可达?

show ip route Peer-IP
↓
有路由?

TCP 179 / ACL
↓
有没有被阻断?

remote-as / Neighbor IP
↓
配置正确?

show ip bgp summary
↓
FSM 状态?

长期 Active:

1
优先考虑 TCP / Reachability / BGP 参数问题

第二层:Established 但收不到 Prefix

检查:

1
2
3
4
5
6
7
对端有没有该 Prefix?
↓
network 是否与 RIB 精确匹配?
↓
Prefix-list / Filter-list / Route-map 是否过滤?
↓
Address Family 是否正确?

第三层:BGP Table 有,但 RIB 没有

检查:

1
2
3
4
5
6
7
8
9
NEXT_HOP 是否可达?
↓
Path 是否 valid?
↓
是不是 BGP Best Path?
↓
有没有其他路由来源竞争?
↓
检查 AD / RIB

第四层:RIB 有,但业务不通

进入数据平面:

1
2
3
4
5
6
7
8
9
RIB / FIB
↓
NEXT_HOP
↓
ARP / Adjacency
↓
ACL
↓
逐跳 Packet Forwarding

V6 最终核心链条

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
底层 IGP 提供 IP Reachability
↓
TCP 179
↓
BGP Neighbor Established
↓
BGP UPDATE
↓
Prefix + Path Attributes
↓
AS_PATH 防 eBGP 环路
↓
iBGP Full Mesh / RR
↓
NEXT_HOP 必须可达
↓
Best Path Selection
↓
Weight
Local Preference
Locally Originated
AS_PATH
Origin
MED
eBGP/iBGP
IGP Metric
↓
Route Policy
↓
Prefix-list / AS-path ACL / Filter-list / Route-map
↓
Best BGP Route
↓
RIB / FIB
↓
真正业务 Packet 按转发表逐跳转发

最终记忆

1
2
3
4
5
OSPF:
拓扑 + Cost → SPF

BGP:
Prefix + Path Attributes → Policy + Best Path
1
2
3
4
5
6
7
8
9
10
11
Weight
→ 本 Router 的偏好

Local Preference
→ 本 AS 的出口偏好

AS-PATH Prepending
→ 尝试影响外部 AS 的入口选择

MED
→ 告诉相邻 AS 更希望从哪个入口进入
1
2
3
4
5
6
7
8
9
10
11
Prefix-list
→ 看 Prefix

AS-path ACL
→ 看 AS_PATH

Filter-list
→ 根据 AS_PATH 直接过滤

Route-map
→ Match + Set