第38篇:最长匹配原则:路由查表的核心规则

关键词:最长匹配、Longest Prefix Match、路由查找、CIDR、路由聚合


一、引言

在第37篇中,我们学习了优先级和度量值如何决定最优路由。但当路由器收到一个数据包时,它首先面临的问题是:路由表中哪条路由与目的 IP 匹配? 因为路由表中的路由通常不止一条能匹配同一个目的 IP——默认路由 0.0.0.0/0 可以匹配任何 IP。

这时,最长匹配原则(Longest Prefix Match) 发挥作用:路由器选择掩码最长(最精确)的那条路由进行转发。这是路由查表的核心规则。

二、核心概念

2.1 什么是"最长匹配"

最长匹配原则:当路由表中有多条路由都能匹配某个目的 IP 地址时,选择网络前缀最长(即掩码最长)的路由。

路由条目 前缀长度 匹配范围 精确度
10.0.0.0/8 8 位 10.0.0.0 ~ 10.255.255.255 粗
10.1.0.0/16 16 位 10.1.0.0 ~ 10.1.255.255 中
10.1.1.0/24 24 位 10.1.1.0 ~ 10.1.1.255 精确
10.1.1.128/25 25 位 10.1.1.128 ~ 10.1.1.255 更精确

2.2 匹配示例

假设路由表中有以下条目:

序号 目的网络 掩码 下一跳
1 10.0.0.0 /8 10.1.1.1
2 10.1.0.0 /16 10.2.2.1
3 10.1.1.0 /24 10.3.3.1
4 10.1.1.128 /25 10.4.4.1
5 0.0.0.0 /0 203.0.113.1

数据包的目的 IP 为 10.1.1.200 时的匹配过程:

路由 是否匹配 前缀长度 结果
10.0.0.0/8 ✓ 8 匹配
10.1.0.0/16 ✓ 16 匹配
10.1.1.0/24 ✓ 24 匹配
10.1.1.128/25 ✓ 25 最长匹配 → 选中
0.0.0.0/0 ✓ 0 匹配

最终选择:10.1.1.128/25(前缀 /25 最长),下一跳 10.4.4.1。

2.3 为什么需要最长匹配

最长匹配的存在有两个重要原因:

原因 说明
精确路由优先 具体的子网路由优先于聚合路由和默认路由
路由聚合的基石 允许同时存在聚合路由(兜底)和精确路由(特例)

三、技术细节

3.1 路由查找过程

路由查找过程 - 图示

3.2 最长匹配的应用场景

场景 说明 示例
路由聚合 + 精确例外 聚合路由覆盖大部分,精确路由覆盖特例 聚合到 /16,特殊子网用 /24
默认路由兜底 0.0.0.0/0 匹配所有 IP,但有精确路由时优先精确 出口路由器
策略路由特化 针对特定子网配置精确路由引导 关键业务服务器
NAT 重叠地址 内部私有地址与外部路由共存 私网 10.0.0.0/8

3.3 最长匹配与路由聚合的关系

路由聚合(Route Summarization)将多条具体路由合并为一条聚合路由:

具体路由 聚合路由
10.1.0.0/24
10.1.1.0/24 10.1.0.0/22
10.1.2.0/24
10.1.3.0/24
10.1.4.0/24 10.1.4.0/23
10.1.5.0/24

聚合要求"块对齐":10.1.0.0/22 只能覆盖 10.1.0.0/24 ~ 10.1.3.0/24 四个子网(10.1.0.0 ~ 10.1.3.255);10.1.4.0/24 与 10.1.5.0/24 另有对齐起点,聚合为 10.1.4.0/23。不能把 10.1.4.0/24 强行并入 10.1.0.0/22。

当目的 IP 为 10.1.2.100 时: - 如果路由表中存在 10.1.2.0/24(/24)和 10.1.0.0/22(/22) - 最长匹配:10.1.2.0/24(/24 > /22) - 流量走精确路由

3.4 最长匹配与默认路由

默认路由 0.0.0.0/0 的前缀长度为 0,是最短的可能匹配。它永远是最后的选择:

匹配优先级 路由 前缀长度
最高 精确路由(如 /32) 32
高 子网路由(如 /24) 24
中 聚合路由(如 /16) 16
低 主类路由(如 /8) 8
最低 默认路由(0.0.0.0/0) 0

四、实战配置与故障案例

4.1 案例一:最长匹配导致流量走非预期路径

故障描述:配置了默认路由指向互联网出口,同时配置了到内网服务器的精确路由。但访问某台服务器时流量走了互联网而非内网。

# 路由表
<HUAWEI> display ip routing-table
Route Flags: R - relay, D - download to fib
------------------------------------------------------------------------------
Routing Tables: Public
         Destinations : 2        Routes : 2
Destination/Mask    Proto   Pre  Cost      Flags NextHop         Interface
0.0.0.0/0           Static  60   0          D    203.0.113.1     GigabitEthernet0/0/1   ← 默认路由
10.0.0.0/24         Static  60   0          D    10.1.1.1        GigabitEthernet0/0/2   ← 内网路由

# 访问目的 IP:10.0.0.100
# 匹配分析:
# 10.0.0.0/24 匹配 10.0.0.100 → 前缀 24
# 0.0.0.0/0 匹配 10.0.0.100 → 前缀 0
# 最长匹配:10.0.0.0/24(/24 > /0)→ 走内网 ✓(正确)

# 但访问目的 IP:10.0.1.100
# 匹配分析:
# 10.0.0.0/24 不匹配 10.0.1.100(超出子网范围)
# 0.0.0.0/0 匹配 10.0.1.100 → 走默认路由 → 互联网
# 如果 10.0.1.0/24 也是内网,需要补充路由
[HUAWEI] ip route-static 10.0.1.0 24 10.1.1.1

4.2 案例二:路由聚合与精确路由共存

需求:核心路由器向 ISP 宣告聚合路由 /16,内部使用 /24 精确路由。

# ① 内部精确路由(明细,供内网转发)
[HUAWEI] ip route-static 10.1.1.0 24 10.2.2.1
[HUAWEI] ip route-static 10.1.2.0 24 10.2.2.1
[HUAWEI] ip route-static 10.1.3.0 24 10.2.2.1
[HUAWEI] ip route-static 10.1.4.0 24 10.2.2.1

# ② 向 ISP 宣告聚合:network + 黑洞静态
[HUAWEI] ip route-static 10.1.0.0 16 NULL0
[HUAWEI] bgp 65001
[HUAWEI-bgp] network 10.1.0.0 mask 255.255.0.0     # 通告聚合前缀 /16
[HUAWEI-bgp] peer 203.0.113.2 as-number 64512      # ISP 方向 eBGP 邻居(示意)
# 注1:BGP network 命令要求本地路由表中存在与通告前缀【完全一致】的条目;
#      黑洞路由正是为满足该前提而配置(本地无 10.1.0.0/16 的真实接口/明细,用 NULL0 补齐)。
# 注2:黑洞同时承担防环职责:10.1.0.0/16 内未被 /24 明细覆盖的段(如 10.1.5.0/24~10.1.255.0/24),
#      若有流量到达会命中 /16 黑洞被静默丢弃,不会回送给 ISP 形成环路。
# 注3:10.1.1.0/24~10.1.4.0/24 的最小真实聚合为 10.1.0.0/22 + 10.1.4.0/23,
#      此处用 /16 仅为示意,实际通告前缀应与明细范围对应(如 10.1.0.0/22),不宜宣告过大前缀。
# ISP 侧最终只看到 1 条 10.1.0.0/16,明细不再外发。

# ③ 内部访问 10.1.2.50(ISP 流量经 /16 进入核心后,按最长匹配转发):
# 10.1.0.0/16 匹配 → 前缀 16
# 10.1.2.0/24 匹配 → 前缀 24
# 最长匹配 → 10.1.2.0/24 → 走内网下一跳 10.2.2.1 ✓
# (若访问 10.1.200.50 这类未被明细覆盖的地址,则最长匹配命中 /16 黑洞,丢弃——符合预期防环行为)

4.3 案例三:/32 主机路由的应用

# 为关键服务器配置 /32 主机路由(最精确匹配)
[HUAWEI] ip route-static 192.168.100.10 32 10.1.1.1

# 同时存在 /24 子网路由
[HUAWEI] ip route-static 192.168.100.0 24 10.2.2.1

# 访问 192.168.100.10 → /32 最长匹配 → 走 10.1.1.1
# 访问 192.168.100.20 → /24 匹配 → 走 10.2.2.1

# 用途:
# 1. 关键服务器走专用链路
# 2. 路由重分发时控制特定路由的传播
# 3. 黑洞路由(指向 Null0 防止 spoofing)
[HUAWEI] ip route-static 192.168.100.10 32 NULL0

4.4 案例四:最长匹配排查工具

# 使用 display ip routing-table 查看命中结果
<HUAWEI> display ip routing-table 10.1.2.50
Route Flags: R - relay, D - download to fib
------------------------------------------------------------------------------
Routing Table : Public
Summary Count : 1
Destination/Mask    Proto   Pre  Cost      Flags NextHop         Interface
10.1.2.0/24         Static  60   0          D    10.2.2.1        GigabitEthernet0/0/1
# 带着具体目的IP地址时只显示该目的地址最终选中的路由(即最长匹配结果),而不是列出所有能匹配的路由

# 使用 tracert 追踪实际转发路径
<HUAWEI> tracert 10.1.2.50
traceroute to 10.1.2.50 (10.1.2.50), max hops: 30, packet length: 52
 1  10.1.1.1    1 ms    1 ms    1 ms   ← 第一跳
 2  10.2.2.1    2 ms    2 ms    2 ms   ← 第二跳
 3  10.1.2.50   3 ms    3 ms    3 ms   ← 到达目的

# 使用 ping 指定源地址验证不同路径
<HUAWEI> ping -a 10.1.1.1 10.1.2.50
# 从 10.1.1.1 源地址 ping,确认出接口和路径

4.5 案例五:CIDR 与最长匹配

CIDR(无类域间路由)是互联网路由表不爆炸的关键,它依赖最长匹配:

ISP 宣告的路由 说明
203.0.0.0/8 聚合路由(覆盖 203.x.x.x 全部)
203.0.113.0/24 精确路由(仅覆盖 203.0.113.x)

当数据包目的为 203.0.113.50 时: - 203.0.0.0/8 匹配,前缀长度 8 - 203.0.113.0/24 匹配,前缀长度 24 - 最长匹配选择 /24,精确到达目标 ISP

这就是为什么互联网路由表中有数百万条路由却能正确转发:聚合路由兜底,精确路由覆盖实际网络。

五、总结

知识点 要点
最长匹配规则 前缀最长(掩码最长)的路由优先
默认路由位置 /0 最短匹配,永远是最后选择
与优先级关系 先按最长匹配圈定候选,再在同长度候选里比优先级 → 同协议内比度量值
路由聚合 聚合路由 + 精确路由共存,精确优先
/32 主机路由 最精确匹配,用于关键路径引导
路由查找顺序 步骤
第一步 提取目的 IP
第二步 找出所有匹配的路由(前缀匹配)
第三步 选择前缀最长的路由
第四步 如多条等长 → 比优先级 → 比度量值 → 负载分担
第五步 无匹配 → 丢弃 + ICMP 不可达

思考

  1. 如果路由表中同时存在 10.1.1.0/24 和 10.1.1.0/25,目的 IP 为 10.1.1.200 时选择哪条路由?
  2. 为什么最长匹配原则能够与路由聚合完美配合?如果没有最长匹配,路由聚合还可行吗?
  3. 当路由表中有多条 /24 路由匹配同一个 IP 时,路由器如何选择?

下篇预告:第39篇:ACL 基础:标准 ACL 与扩展 ACL