mobile wallpaper 1mobile wallpaper 2mobile wallpaper 3mobile wallpaper 4
4433 字
13 分钟
BGP与域间路由:互联网的外交系统
2022-04-19

数据包在 域内路由 的 OSPF/IS-IS 网络里已经能找到最短路径,但那是在一个组织内部。当数据包需要从中国电信的网络跨到中国联通的网络,从 AWS 的 AS 跨到 Google 的 AS——谁来决定走哪条路?IGP 只关心”怎么走最快”,但跨组织转发从来不是纯粹的最短路径问题。运营商之间有商业合同,有结算关系,有”我的流量不给你白嫖”的策略需求。

BGP(Border Gateway Protocol,边界网关协议)就是互联网的”外交系统”。它不追求全局最优,而是让每个组织按自己的策略决定流量怎么进出。理解 BGP,才能理解互联网为什么是今天这个样子——为什么有些路径看起来绕远却偏偏那么走,为什么一次 BGP 配置错误能让半个互联网断线。

一、自治系统:互联网的”国家”#

1.1 AS 的概念与编号#

自治系统(Autonomous System,AS)是互联网路由的基本行政单位。一个 AS 是一组在统一管理下运行相同路由策略的 IP 网络集合。每个 AS 拥有一个由 IANA 分配的唯一编号——ASN(Autonomous System Number)。

ASN 有两种格式:

格式范围可用数量状态
2-byte ASN0 ~ 6553565536(实际可用约 64000)已耗尽
4-byte ASN0 ~ 42949672954,294,967,296当前使用

2-byte ASN 中,64512 ~ 65534 是私有 ASN(类似 RFC 1918 私有 IP),不会出现在全球 BGP 路由表中。4-byte ASN 的私有范围是 4200000000 ~ 4294967294。

# 查询某个 ASN 的归属信息
whois -h whois.radb.net AS4134
# 输出节选:
# as-name: CHINANET-BACKBONE
# descr: No.31,Jin-rong Street
# descr: Beijing 100032, China
# 中国电信骨干网
# 查询某个 IP 前缀所属的 AS
whois -h whois.radb.net 202.97.0.0
# 输出:origin: AS4134

4-byte ASN 的表示方式有两种:ASPLAIN(直接写数字,如 AS199509)和 ASDOT(点分格式,如 AS3.10037)。

1.2 为什么需要 AS#

互联网不是一台超级路由器管理的全局网络,而是上万个组织各自运营的网络互联而成。AS 划分的三个核心动机:

  1. 规模:全球 BGP 路由表已超过 100 万条前缀。如果用 OSPF 算全局最短路径,LSDB 会膨胀到任何单台路由器都无法承受。AS 把路由问题分层——AS 内部用 IGP,AS 之间用 BGP。

  2. 策略独立:中国电信和中国联通之间怎么交换流量,是两家公司之间的商业决策。AS 让每个组织独立制定路由策略,不必把内部拓扑暴露给外部。

  3. 管理边界:AS 内部怎么跑路由协议是自己的事——用 OSPF 也好,IS-IS 也好,静态路由也好,外部不关心也不需要知道。AS 边界就是管理边界。

1.3 AS 之间的关系#

AS 之间的商业关系决定了路由策略。三种基本关系:

graph TB subgraph Tier1["Tier 1 运营商"] T1A["AS3356<br/>Level 3"] T1B["AS174<br/>Cogent"] end subgraph Tier2["Tier 2 运营商"] T2A["AS4134<br/>中国电信"] T2B["AS4837<br/>中国联通"] end subgraph Stub["Stub AS(末端)"] S1["AS45090<br/>某企业"] S2["AS38019<br/>某高校"] end T1A ---|"Peer<br/>对等互联"| T1B T2A ---|"Peer<br/>对等互联"| T2B T1A ---|"Transit<br/>提供商"| T2A T1B ---|"Transit<br/>提供商"| T2B T2A ---|"Customer<br/>客户"| S1 T2B ---|"Customer<br/>客户"| S2 style Tier1 fill:#e3f2fd,stroke:#1565c0 style Tier2 fill:#e8f5e9,stroke:#2e7d32 style Stub fill:#fff3e0,stroke:#e65100
关系含义路由策略结算
Transit(提供商-客户)客户付费购买互联网可达性提供商向客户通告全表(或默认路由),客户向提供商通告自己的前缀客户付费
Peer(对等互联)双方平等交换流量只通告自己的客户前缀给对方,不充当对方的 Transit通常免费
Customer(客户-提供商)Transit 的反向视角同上,只是视角不同同上
Warning

“Peer 不传 Transit 流量”是互联网经济的基本规则。如果 AS4134 和 AS4837 是 Peer 关系,AS4134 不会把从 AS3356 学到的路由传给 AS4837——否则 AS4837 就免费获得了到全球的 Transit,而 AS4134 的上游提供商 AS3356 也不会答应。这就是 BGP 策略路由的核心驱动力。

二、BGP 协议基础#

2.1 BGP 的设计哲学#

BGP 和 IGP 有根本性的设计差异。OSPF/IS-IS 追求最短路径,BGP 追求策略可控。这源于一个现实:互联网不是一台路由器,没有全局最优——每个 AS 有自己的利益诉求。

BGP 选择**路径矢量(Path Vector)**而非距离矢量,核心区别是通告的信息从”距离是多少”变成了”经过哪些 AS”。AS_PATH 属性记录了到达目的地经过的所有 AS 编号——收到更新时检查自己的 ASN 是否已在路径中,在则丢弃,从而从根本上避免了路由环路。

维度距离矢量(RIP)路径矢量(BGP)
通告信息目的网络 + 距离目的网络 + AS 路径 + 属性
防环机制水平分割/毒性逆转(不完整)AS_PATH 检查(完整)
策略支持几乎没有丰富(属性 + 策略)
收敛速度慢(计数到无穷)较慢(策略计算复杂)
规模小网络全球互联网

2.2 BGP 会话建立#

BGP 运行在 TCP 之上,端口 179。两台路由器先建立 TCP 连接,然后交换 BGP 消息协商参数。BGP 会话分为两种:

  • eBGP(External BGP):不同 AS 之间的 BGP 会话,用于交换 AS 间路由信息
  • iBGP(Internal BGP):同一 AS 内部的 BGP 会话,用于在 AS 内传播外部路由
# FRR 中配置 eBGP 会话
vtysh
configure terminal
router bgp 65001
neighbor 10.0.1.2 remote-as 65002
neighbor 10.0.1.2 description "eBGP to AS65002"
# FRR 中配置 iBGP 会话
router bgp 65001
neighbor 192.168.1.2 remote-as 65001
neighbor 192.168.1.2 description "iBGP within AS65001"
neighbor 192.168.1.2 update-source lo0

eBGP 邻居默认要求直连(TTL=1),iBGP 邻居可以跨多跳(TTL=255)。iBGP 通常使用 Loopback 地址建立会话,这样即使物理链路故障,只要 IGP 还能到达对方的 Loopback,BGP 会话就不会断。

2.3 BGP 消息类型#

BGP 定义了四种消息类型:

消息类型功能触发条件关键字段
OPEN协商 BGP 会话参数TCP 连接建立后Version, My AS, Hold Time, BGP Identifier
KEEPALIVE维持会话存活每 1/3 Hold Time 发送一次无(仅 BGP 头部)
UPDATE通告/撤销路由路由变化时NLRI, Path Attributes, Withdrawn Routes
NOTIFICATION报告错误并关闭会话检测到错误时Error Code, Error Subcode, Data

OPEN 消息协商的 Hold Time 取双方配置的较小值。如果 Hold Time 超时未收到 KEEPALIVE 或 UPDATE,会话断开。

# 查看 BGP 邻居状态
show bgp summary
# 典型输出:
# Neighbor V AS MsgRcvd MsgSent TblVer InQ OutQ Up/Down State/PfxRcd
# 10.0.1.2 4 65002 125 118 5 0 0 00:45:32 3
# 192.168.1.2 4 65001 98 95 5 0 0 00:32:15 3

State/PfxRcd 列显示邻居状态——数字表示从该邻居学到的路由前缀数量。如果显示 IdleConnectActive 等状态,说明会话未建立成功。

2.4 BGP 有限状态机#

BGP 会话建立过程遵循一个六状态有限状态机:

stateDiagram-v2 [*] --> Idle Idle --> Connect : Start事件<br/>初始化资源 Connect --> OpenSent : TCP连接成功<br/>发送OPEN Connect --> Active : TCP连接失败 Active --> Connect : ConnectRetry计时器到期 Active --> OpenSent : TCP连接成功<br/>发送OPEN OpenSent --> OpenConfirm : 收到OPEN<br/>发送KEEPALIVE OpenSent --> Active : 收到非期望OPEN OpenConfirm --> Established : 收到KEEPALIVE OpenConfirm --> Idle : Hold Timer超时 Established --> Idle : 收到NOTIFICATION<br/>或Hold Timer超时 note right of Idle: 初始状态,拒绝所有连接 note right of Established: 会话建立完成,可以交换UPDATE

各状态含义:

状态含义关键动作
Idle初始状态拒绝所有入站连接,等待 Start 事件
Connect等待 TCP 连接建立主动发起 TCP 连接
Active主动尝试建立 TCPConnectRetry 到期后重试
OpenSent已发送 OPEN,等待对方 OPEN检查对方 OPEN 参数
OpenConfirmOPEN 参数协商完成等待 KEEPALIVE 确认
Established会话建立完成可以交换 UPDATE/KEEPALIVE
Note

如果 BGP 邻居一直卡在 Active 状态,最常见的原因是 TCP 连接无法建立——检查路由是否可达、ACL 是否放行 TCP 179、对端是否配置了正确的 neighbor 语句。如果卡在 Idle,通常是配置错误或被对端拒绝。

三、BGP 路由通告与属性#

3.1 NLRI 与路由通告#

BGP UPDATE 消息是路由信息交换的核心载体。一条 UPDATE 消息可以通告可达路由、撤销不可达路由,或两者兼有:

BGP UPDATE 消息结构:
┌──────────────────────────┐
│ Withdrawn Routes Length │ ← 撤销路由的长度
├──────────────────────────┤
│ Withdrawn Routes │ ← 被撤销的前缀列表
├──────────────────────────┤
│ Total Path Attr Length │ ← 路径属性总长度
├──────────────────────────┤
│ Path Attributes │ ← 路径属性(AS_PATH, NEXT_HOP 等)
├──────────────────────────┤
│ NLRI │ ← 网络层可达信息(通告的前缀)
└──────────────────────────┘

NLRI(Network Layer Reachability Information)就是被通告的 IP 前缀,比如 203.119.0.0/22。路径属性描述了到达该前缀的”路径特征”——经过哪些 AS、下一跳是谁、优先级多高。

3.2 AS_PATH 属性#

AS_PATH 是 BGP 最重要的属性之一,记录了路由更新经过的所有 AS。它有两个核心功能:防环和选路。

AS_PATH 有两种类型段:

类型含义示例
AS_SEQUENCE有序的 AS 列表65003 65002 65001(按经过顺序排列)
AS_SET无序的 AS 集合{65001, 65002}(聚合路由时使用)

防环机制:路由器收到 UPDATE 后,检查 AS_PATH 中是否包含自己的 ASN。如果在,说明这条路由曾经经过自己,丢弃——环路不可能形成。

# 模拟 AS_PATH 防环检查
def check_as_path(local_asn, as_path):
"""检查 AS_PATH 是否包含本地 ASN"""
if local_asn in as_path:
print(f"AS_PATH {as_path} 包含本地 ASN {local_asn},丢弃该路由")
return False
print(f"AS_PATH {as_path} 不包含本地 ASN {local_asn},接受该路由")
return True
# AS65001 收到一条 AS_PATH 为 65003 65002 65001 的路由
check_as_path(65001, [65003, 65002, 65001])
# 输出:AS_PATH [65003, 65002, 65001] 包含本地 ASN 65001,丢弃该路由
# AS65004 收到同一条路由
check_as_path(65004, [65003, 65002, 65001])
# 输出:AS_PATH [65003, 65002, 65001] 不包含本地 ASN 65004,接受该路由

eBGP 路由器向外部邻居通告路由时,会在 AS_PATH 前部 prepend 自己的 ASN。iBGP 路由器向同一 AS 内的邻居通告时,不修改 AS_PATH——因为还没出 AS 边界。

3.3 NEXT_HOP 属性#

NEXT_HOP 指示到达目的前缀的下一跳 IP 地址。eBGP 和 iBGP 对 NEXT_HOP 的处理规则不同:

  • eBGP:NEXT_HOP 设为发送 UPDATE 的路由器的接口 IP(即 eBGP 邻居地址)
  • iBGP:NEXT_HOP 不改变——从 eBGP 学到的路由传给 iBGP 邻居时,NEXT_HOP 仍然是 eBGP 邻居的地址

这会导致一个问题:iBGP 路由器收到的路由 NEXT_HOP 指向外部 AS 的路由器,如果 IGP 不知道怎么到达那个 NEXT_HOP,路由就不可用。解决方案是 next-hop-self

# 在 AS 边界路由器上配置 next-hop-self
router bgp 65001
neighbor 192.168.1.2 remote-as 65001
neighbor 192.168.1.2 next-hop-self
# 将 NEXT_HOP 改为自己的 Loopback 地址
# 这样 iBGP 邻居通过 IGP 就能到达下一跳

3.4 LOCAL_PREF 属性#

LOCAL_PREF(本地优先级)是 AS 内部使用的属性,只在 iBGP 之间传递,不会传出 AS。它决定 AS 的出口选择——LOCAL_PREF 越高越优先。

# 配置 LOCAL_PREF 策略
router bgp 65001
neighbor 10.0.1.2 route-map SET-LOCALPREF in
route-map SET-LOCALPREF permit 10
match ip address prefix-list PREFERRED
set local-preference 200
route-map SET-LOCALPREF permit 20
set local-preference 100

典型场景:AS65001 同时从 AS65002 和 AS65003 学到同一前缀,但和 AS65002 的链路带宽更大。给从 AS65002 学到的路由设置更高的 LOCAL_PREF,AS 内所有路由器都会优先选择 AS65002 作为出口。

3.5 MED 属性#

MED(Multi-Exit Discriminator,多出口鉴别器)用于告诉邻居 AS:“如果你有多个出口到我这个 AS,请优先走 MED 值较小的那个出口”。MED 是唯一一个可以影响邻居 AS 选路决策的属性。

维度LOCAL_PREFMED
作用方向影响 AS 内出口选择影响邻居 AS 入口选择
传递范围AS 内(iBGP 传递,eBGP 不传)AS 间(eBGP 传递给邻居 AS)
默认值1000
选路规则越大越优先越小越优先
配置位置入方向 route-map出方向 route-map
# 配置 MED 策略
router bgp 65001
neighbor 10.0.1.2 route-map SET-MED out
route-map SET-MED permit 10
match ip address prefix-list PRIMARY-PREFIX
set metric 50 # MED = 50,优先选择
route-map SET-MED permit 20
set metric 200 # MED = 200,次优选择
Tip

MED 只在两个 AS 有多个互联点时才有意义。如果 AS65001 和 AS65002 只有一个互联点,MED 没有作用——因为只有一个入口。MED 的比较默认只在来自同一 AS 的多条路径之间进行(bgp always-compare-med 可以改变这一行为)。

3.6 Community 属性#

Community 是一个 32 位的标记,格式为 AA:NN(前 16 位是 ASN,后 16 位是编号),用于对路由进行分组和策略实施。它不像 AS_PATH 或 LOCAL_PREF 直接影响选路,而是作为一种”标签”让路由策略更灵活。

# 配置 Community
router bgp 65001
network 192.168.1.0/24 route-map ADD-COMMUNITY
route-map ADD-COMMUNITY permit 10
set community 65001:100 65001:200
# 常见 Well-known Community
# no-export: 不传出 AS(不发给 eBGP 邻居)
# no-advertise: 不通告给任何 BGP 邻居
# local-AS: 不传出本地 AS(Confederation 内使用)
# internet: 正常通告(默认行为)
# 基于 Community 过滤路由
ip community-list standard BLOCKED permit 65001:666
route-map FILTER-BLOCKED deny 10
match community BLOCKED
route-map FILTER-BLOCKED permit 20
router bgp 65002
neighbor 10.0.1.1 route-map FILTER-BLOCKED in

Community 的典型应用:上游运营商告诉客户”标记了 65001:100 的路由我给你做优先处理”,客户只需在出方向设置 Community,无需和上游协商复杂的策略。

3.7 其他属性#

属性类别含义
ORIGINWell-known mandatory路由来源:IGP(i)、EGP(e)、Incomplete(?)
ATOMIC_AGGREGATEWell-known discretionary标记该路由是聚合路由,丢失了路径细节
AGGREGATOROptional transitive记录执行聚合的 ASN 和路由器 IP
ORIGINATOR_IDOptional non-transitiveRR 场景中记录路由的发起者(防环)
CLUSTER_LISTOptional non-transitiveRR 场景中记录经过的 Cluster(防环)

ORIGIN 属性的选路优先级:IGP > EGP > Incomplete。network 命令通告的路由 ORIGIN 为 IGP,redistribute 引入的路由 ORIGIN 为 Incomplete。

四、BGP 选路决策#

4.1 13 步选路过程#

当 BGP 路由器从多个邻居学到同一前缀的多条路径时,需要选择最优路径。BGP 的选路过程是一个 13 步的逐级比较——每一步只比较一个属性,能分出胜负就停止,不能则进入下一步:

步骤比较属性优先规则说明
1Weight越大越优先Cisco 私有属性,FRR 不支持
2LOCAL_PREF越大越优先AS 内出口选择
3本地生成的路由优先networkaggregate-address 生成的
4AS_PATH越短越优先经过 AS 数量少的优先
5ORIGINIGP > EGP > Incomplete路由来源可信度
6MED越小越优先多出口选择
7eBGP > iBGPeBGP 优先外部路由优先于内部路由
8IGP 下一跳代价越小越优先到 NEXT_HOP 的 IGP 代价
9最长 BGP 存活时间越长越优先老路由优先
10Router ID越小越优先邻居的 BGP Router ID
11邻居 IP越小越优先邻居的 IP 地址
12Cluster List 长度越短越优先RR 场景
13Neighbor IP越小越优先最终决胜

实际工作中,前 8 步覆盖了绝大多数选路场景。步骤 9-13 基本只在理论中出现——如果选路需要走到第 11 步才分出胜负,说明配置有问题。

4.2 选路实战示例#

假设 AS65001 从三个方向学到前缀 203.0.113.0/24

graph TB R1["R1<br/>AS65001<br/>边界路由器"] R2["R2<br/>AS65001<br/>边界路由器"] R3["R3<br/>AS65001<br/>内部路由器"] AS2["AS65002<br/>路径1: AS_PATH=65002<br/>LOCAL_PREF=200<br/>MED=50"] AS3["AS65003<br/>路径2: AS_PATH=65003 65004<br/>LOCAL_PREF=200<br/>MED=100"] AS4["AS65004<br/>路径3: AS_PATH=65004<br/>LOCAL_PREF=100<br/>MED=0"] AS2 -->|"eBGP"| R1 AS3 -->|"eBGP"| R2 AS4 -->|"eBGP"| R1 R1 ---|"iBGP"| R3 R2 ---|"iBGP"| R3 style R1 fill:#e3f2fd,stroke:#1565c0 style R2 fill:#e8f5e9,stroke:#2e7d32 style R3 fill:#fff3e0,stroke:#e65100 style AS2 fill:#fce4ec,stroke:#c62828 style AS3 fill:#f3e5f5,stroke:#6a1b9a style AS4 fill:#efebe9,stroke:#4e342e

R3 的选路过程:

  1. 步骤2 LOCAL_PREF:路径1(200)= 路径2(200)> 路径3(100),路径3 淘汰
  2. 步骤4 AS_PATH:路径1 长度 1 < 路径2 长度 2,路径2 淘汰
  3. 结果:选择路径1,经 AS65002 到达

如果路径1 和路径2 的 AS_PATH 长度相同,则进入步骤5 比较 ORIGIN,再到步骤6 比较 MED——MED 小的优先。

4.3 路由过滤与策略#

BGP 的策略能力很大程度上来自路由过滤。FRR 支持三种过滤机制:

# === prefix-list:基于前缀匹配 ===
ip prefix-list CUSTOMER seq 5 permit 192.168.1.0/24 le 32
ip prefix-list CUSTOMER seq 10 permit 10.0.0.0/8 le 24
ip prefix-list BOGON seq 5 deny 0.0.0.0/8 le 32
ip prefix-list BOGON seq 10 deny 10.0.0.0/8 le 32
ip prefix-list BOGON seq 15 deny 127.0.0.0/8 le 32
ip prefix-list BOGON seq 20 deny 169.254.0.0/16 le 32
ip prefix-list BOGON seq 25 deny 192.168.0.0/16 le 32
ip prefix-list BOGON seq 30 deny 224.0.0.0/4 le 32
ip prefix-list BOGON seq 35 permit 0.0.0.0/0 le 32
# === route-map:组合匹配和动作 ===
route-map FROM-CUSTOMER permit 10
match ip address prefix-list CUSTOMER
set local-preference 150
set community 65001:100
route-map FROM-CUSTOMER deny 20
match ip address prefix-list BOGON
# === 应用到 BGP 邻居 ===
router bgp 65001
neighbor 10.0.1.2 route-map FROM-CUSTOMER in
neighbor 10.0.1.2 filter-list 1 out
# filter-list 基于 AS_PATH 正则匹配
ip as-path access-list 1 permit ^65001$
# 只通告起源于本 AS 的路由
Warning

Bogon 前缀(RFC 1918 私有地址、未分配地址空间等)绝不能出现在全球 BGP 路由表中。但现实中,由于配置错误或恶意行为,Bogon 路由泄漏时有发生。入方向过滤 Bogon 是 BGP 安全的基本功——在 BGP安全与路由信任 中会深入讨论路由泄漏防护。

五、eBGP 与 iBGP#

5.1 eBGP 会话#

eBGP 会话连接不同 AS 的边界路由器。默认行为:

  • TTL = 1:eBGP 消息只能传一跳,要求邻居直连
  • 修改 NEXT_HOP:向 eBGP 邻居通告路由时,NEXT_HOP 设为自己的出口地址
  • 修改 AS_PATH:向 eBGP 邻居通告路由时,在 AS_PATH 前部 prepend 自己的 ASN

如果 eBGP 邻居不在直连链路上(比如通过 IGP 可达的远端邻居),需要配置 multihop:

# eBGP multihop 配置
router bgp 65001
neighbor 192.168.100.2 remote-as 65002
neighbor 192.168.100.2 ebgp-multihop 5
neighbor 192.168.100.2 update-source lo0
# TTL 设为 5,使用 Loopback 接口建立会话

5.2 iBGP 全互联问题#

iBGP 有一个核心规则:从 iBGP 邻居学到的路由不再传给其他 iBGP 邻居(iBGP 水平分割)。这条规则的目的是防止 AS 内部路由环路——因为没有 ASN 变化来标识路径。

但这带来了一个扩展性问题:AS 内有 N 台边界路由器时,需要 N×(N-1)/2 条 iBGP 会话才能保证所有路由器学到完整路由。10 台路由器需要 45 条会话,100 台需要 4950 条——不可接受。

两种解决方案:

方案原理优点缺点
Route Reflector指定 RR 服务器,允许其反射 iBGP 路由扩展性好,配置简单RR 是单点故障,需要冗余
Confederation将 AS 内部划分为子 AS,子 AS 间用 eBGP不需要额外设备配置复杂,子 AS 间 AS_PATH 处理特殊

5.3 Route Reflector 详解#

Route Reflector(RR)是解决 iBGP 全互联的标准方案。RR 打破 iBGP 水平分割规则,允许将从 iBGP 客户端学到的路由反射给其他 iBGP 客户端。

graph TB subgraph AS65001["AS65001"] RR1["RR1<br/>Route Reflector"] RR2["RR2<br/>Route Reflector<br/>(冗余)"] C1["Client 1<br/>边界路由器"] C2["Client 2<br/>边界路由器"] C3["Client 3<br/>边界路由器"] NC["Non-Client<br/>边界路由器"] C1 ---|"iBGP<br/>Client"| RR1 C2 ---|"iBGP<br/>Client"| RR1 C3 ---|"iBGP<br/>Client"| RR2 RR1 ---|"iBGP<br/>RR间全互联"| RR2 RR1 ---|"iBGP<br/>Non-Client"| NC end AS2["AS65002"] AS3["AS65003"] AS2 -->|"eBGP"| C1 AS3 -->|"eBGP"| C3 style RR1 fill:#e3f2fd,stroke:#1565c0 style RR2 fill:#e3f2fd,stroke:#1565c0 style C1 fill:#e8f5e9,stroke:#2e7d32 style C2 fill:#e8f5e9,stroke:#2e7d32 style C3 fill:#e8f5e9,stroke:#2e7d32 style NC fill:#fff3e0,stroke:#e65100

RR 的反射规则:

从谁学到反射给 Client反射给 Non-Client反射给 eBGP
Client
Non-Client
eBGP

RR 防环机制使用两个属性:

  • ORIGINATOR_ID:记录路由的发起者(Client 的 Router ID),收到自己 ORIGINATOR_ID 的路由时丢弃
  • CLUSTER_LIST:记录路由经过的 RR Cluster ID,重复则丢弃

5.4 FRR 配置示例#

AS65001 内部用 RR,外部和 AS65002、AS65003 互联:

# ===== RR1 配置(Route Reflector)=====
vtysh
configure terminal
interface lo0
ip address 1.1.1.1/32
router ospf
ospf router-id 1.1.1.1
network 10.0.0.0/8 area 0
router bgp 65001
bgp router-id 1.1.1.1
neighbor 2.2.2.2 remote-as 65001
neighbor 2.2.2.2 update-source lo0
neighbor 2.2.2.2 route-reflector-client
neighbor 3.3.3.3 remote-as 65001
neighbor 3.3.3.3 update-source lo0
neighbor 3.3.3.3 route-reflector-client
neighbor 4.4.4.4 remote-as 65001 # 另一个 RR,全互联
neighbor 4.4.4.4 update-source lo0
network 192.168.1.0/24
# ===== Client 1 配置(边界路由器,连接 AS65002)=====
vtysh
configure terminal
interface lo0
ip address 2.2.2.2/32
router ospf
ospf router-id 2.2.2.2
network 10.0.0.0/8 area 0
router bgp 65001
bgp router-id 2.2.2.2
neighbor 1.1.1.1 remote-as 65001
neighbor 1.1.1.1 update-source lo0
neighbor 1.1.1.1 next-hop-self
neighbor 10.0.12.2 remote-as 65002
neighbor 10.0.12.2 route-map FROM-65002 in
network 192.168.2.0/24
route-map FROM-65002 permit 10
set local-preference 200
# ===== Client 2 配置(边界路由器,连接 AS65003)=====
vtysh
configure terminal
interface lo0
ip address 3.3.3.3/32
router ospf
ospf router-id 3.3.3.3
network 10.0.0.0/8 area 0
router bgp 65001
bgp router-id 3.3.3.3
neighbor 1.1.1.1 remote-as 65001
neighbor 1.1.1.1 update-source lo0
neighbor 1.1.1.1 next-hop-self
neighbor 10.0.13.2 remote-as 65003
network 192.168.3.0/24

验证配置:

# 在 RR1 上查看 BGP 邻居
show bgp summary
# 查看路由的详细属性(注意 Originator 和 Cluster list)
show bgp ipv4 unicast 192.168.2.0/24 detail
# BGP routing table entry for 192.168.2.0/24
# 65002
# 10.0.12.2 from 2.2.2.2 (2.2.2.2)
# Origin IGP, localpref 200, valid, internal, best
# Originator: 2.2.2.2, Cluster list: 1.1.1.1

六、BGP 路由聚合#

6.1 聚合的必要性#

全球 BGP 路由表的增长是互联网面临的核心扩展性挑战:

年份BGP 路由表条目增长率
2000~100,000
2010~350,000250%
2020~860,000146%
2025~1,100,00028%

每条路由都需要被全球所有 BGP 路由器存储和处理。路由聚合通过将多条具体前缀合并为一条更宽泛的前缀,减少路由表规模。比如 256 条 /24 前缀可以聚合为一条 /16 前缀——路由表条目减少 255 条。

6.2 聚合方法#

BGP 聚合使用 aggregate-address 命令:

# 基本聚合(summary-only:抑制具体路由)
router bgp 65001
aggregate-address 192.168.0.0/16 summary-only
# 只通告 192.168.0.0/16,不通告其下的具体 /24 前缀
# 聚合但保留部分具体路由(suppress-map)
router bgp 65001
aggregate-address 192.168.0.0/16 suppress-map SUPPRESS-THESE
ip prefix-list SUPPRESS-LIST seq 5 permit 192.168.1.0/24
ip prefix-list SUPPRESS-LIST seq 10 permit 192.168.2.0/24
route-map SUPPRESS-THESE permit 10
match ip address prefix-list SUPPRESS-LIST
# 被匹配的前缀被抑制,其余具体前缀正常通告
# 聚合路由的属性继承
router bgp 65001
aggregate-address 192.168.0.0/16 as-set
# as-set: 使用 AS_SET 记录被聚合路由的 AS_PATH
# 不加 as-set: 聚合路由的 AS_PATH 为空,丢失路径信息

6.3 聚合与路由泄漏#

聚合是一把双刃剑——减少了路由表规模,但也可能引入问题:

# 场景:AS65001 聚合 192.168.0.0/16
# 但其中 192.168.100.0/24 实际属于 AS65002(已被 AS65001 收回)
# 如果用 summary-only,192.168.100.0/24 的更精确路由不会通告
# 流量会被错误地导向 AS65001
# 解决方案:使用 suppress-map 保留需要精确通告的前缀
router bgp 65001
aggregate-address 192.168.0.0/16 summary-only
network 192.168.100.0/24 # 单独通告,利用最长前缀匹配优先
# 或者使用 route-map 设置 Community
router bgp 65001
aggregate-address 192.168.0.0/16 attribute-map AGG-ATTR
route-map AGG-ATTR permit 10
set community no-export
# 聚合路由不传出 AS,具体路由正常通告
Note

BGP 选路遵循最长前缀匹配原则——更具体的前缀总是优先于聚合路由。这意味着即使聚合路由指向错误的方向,只要更精确的路由正确,流量仍然会走正确的路径。聚合路由相当于”兜底路由”。

七、动手实践:GNS3 搭建 BGP 拓扑#

7.1 实验拓扑#

搭建一个 3 个 AS 的拓扑,模拟运营商互联场景:

graph LR subgraph AS65001["AS65001 — 模拟客户"] R1["R1<br/>1.1.1.1<br/>10.0.12.1"] R2["R2<br/>2.2.2.2<br/>10.0.12.2<br/>10.0.23.2"] R1 ---|"10.0.12.0/24"| R2 end subgraph AS65002["AS65002 — 模拟运营商"] R3["R3<br/>3.3.3.3<br/>10.0.23.3<br/>10.0.34.3"] R4["R4<br/>4.4.4.4<br/>10.0.34.4<br/>10.0.45.4"] R3 ---|"10.0.34.0/24"| R4 end subgraph AS65003["AS65003 — 模拟对端"] R5["R5<br/>5.5.5.5<br/>10.0.45.5"] R6["R6<br/>6.6.6.6"] R5 ---|"内网"| R6 end R2 ---|"eBGP<br/>10.0.23.0/24"| R3 R4 ---|"eBGP<br/>10.0.45.0/24"| R5 style AS65001 fill:#e3f2fd,stroke:#1565c0 style AS65002 fill:#e8f5e9,stroke:#2e7d32 style AS65003 fill:#fff3e0,stroke:#e65100

7.2 FRR 配置#

# ===== R1 配置(AS65001 内部路由器)=====
vtysh
configure terminal
interface eth0
ip address 10.0.12.1/24
interface lo0
ip address 1.1.1.1/32
router ospf
ospf router-id 1.1.1.1
network 10.0.12.0/24 area 0
network 1.1.1.1/32 area 0
router bgp 65001
bgp router-id 1.1.1.1
neighbor 2.2.2.2 remote-as 65001
neighbor 2.2.2.2 update-source lo0
neighbor 2.2.2.2 next-hop-self
network 172.16.1.0/24
# ===== R2 配置(AS65001 边界路由器)=====
vtysh
configure terminal
interface eth0
ip address 10.0.12.2/24
interface eth1
ip address 10.0.23.2/24
interface lo0
ip address 2.2.2.2/32
router ospf
ospf router-id 2.2.2.2
network 10.0.12.0/24 area 0
network 2.2.2.2/32 area 0
router bgp 65001
bgp router-id 2.2.2.2
neighbor 1.1.1.1 remote-as 65001
neighbor 1.1.1.1 update-source lo0
neighbor 1.1.1.1 next-hop-self
neighbor 10.0.23.3 remote-as 65002
neighbor 10.0.23.3 route-map FROM-65002 in
network 172.16.1.0/24
network 10.0.12.0/24
route-map FROM-65002 permit 10
set local-preference 200
### 7.3 观察 BGP 选路
```bash
# 在 R1 上查看 BGP 路由表
show bgp ipv4 unicast
# traceroute 追踪跨 AS 路径
traceroute 172.16.2.1
# 用 tcpdump 抓 BGP UPDATE
sudo tcpdump -i eth1 -vv tcp port 179 and 'tcp[tcpflags] & tcp-push != 0'
# 用 Wireshark 过滤 BGP UPDATE:bgp.message_type == 2
# 查看 BGP 路由的详细属性
show bgp ipv4 unicast 172.16.2.0/24 detail
---
## 参考
- [RFC 1918](https://www.rfc-editor.org/rfc/rfc1918) — Address Allocation for Private Internets
- [IANA Service Name and Transport Protocol Port Number Registry](https://www.iana.org/assignments/service-names-port-numbers/)

支持与分享

如果这篇文章对你有帮助,欢迎支持作者或分享给更多人

BGP与域间路由:互联网的外交系统
https://blog.souloss.com/posts/internet-architecture/bgp-and-inter-domain-routing/
作者
Souloss
发布于
2022-04-19
许可协议
CC BY-NC-SA 4.0

部分信息可能已经过时

相关文章 智能推荐