Skip to content

路由基础、策略路由与 ECMP ​

内容摘要:路由回答“一个 IP 包下一步发给谁”。本章从单台主机或路由器的转发路径出发,讲清路由信息库(Routing Information Base,RIB)、转发信息库(Forwarding Information Base,FIB)、最长前缀匹配、静态与默认路由、路由递归、策略路由(Policy-Based Routing,PBR)、等价多路径(Equal-Cost Multi-Path,ECMP)与路由汇总;随后比较距离矢量与链路状态算法,解释收敛、环路与 RIP 的适用边界。

难度:中级 | 前置知识:07 IPv4 编址、08 IPv6、09 ICMP 与路径发现 | 所属层次:网络层控制平面与数据平面

一、路由、转发与三张“表” ​

日常交流常把“路由”和“转发”混用,但生产排障必须区分:

  • 路由(routing):控制平面通过直连、静态配置或动态协议学习候选路径,并选出最佳路径。
  • 转发(forwarding):数据平面对每个数据包查询 FIB,决定出接口与下一跳。
  • 策略(policy):决定哪些路由可进入 RIB、哪些可发布、优先级如何计算。
数据结构典型内容所属平面故障表现
RIB前缀、来源协议、度量、下一跳、属性控制平面路由没学到、优选错误
FIB可直接查找的前缀与下一跳集合数据平面RIB 有路由但实际不转发
邻接/邻居表下一跳 IP 对应的 MAC 与出接口数据平面路由正确但 ARP/NDP 未解析(06)

排障原则:不能只看 ip route 就断言数据面正常。至少同时验证 ip route get 的实际选路、ip neigh 的下一跳解析,以及抓包中的真实出接口与回程路径。

二、路由表字段与选路顺序 ​

一条典型 Linux 路由:

text
192.0.2.0/24 via 198.51.100.1 dev eth1 proto static metric 100
字段含义典型问题
192.0.2.0/24目的前缀前缀或掩码写错
via 198.51.100.1下一跳下一跳不可达或邻居解析失败
dev eth1出接口接口 down、VLAN/MTU 不一致
proto static路由来源静态、kernel、OSPF、BGP 等
metric 100同类路由的度量/优先级依据不同系统语义不同

对一个目的地址,选路通常分两类比较:

  1. 先做最长前缀匹配(Longest Prefix Match,LPM):/32 优于 /24,/24 优于 /0。
  2. 对相同前缀长度的候选路由,再按管理优先级、协议度量、策略或实现规则选优。

重要边界:Cisco 等设备常把“管理距离(Administrative Distance,AD)”作为不同协议来源间的本地优先级;Linux 使用 route metric、协议 preference 与规则优先级。AD 不是 IETF 跨厂商协议字段,不能把某厂商默认值当成通用标准。

最长前缀匹配示例 ​

本机已验证的确定性计算:

bash
python3 - <<'PY'
import ipaddress

routes = [
    ("0.0.0.0/0", "gw-default"),
    ("192.0.2.0/24", "gw-a"),
    ("192.0.2.128/25", "gw-b"),
    ("192.0.2.130/32", "local"),
]
dst = ipaddress.ip_address("192.0.2.130")
matches = [
    (ipaddress.ip_network(prefix), next_hop)
    for prefix, next_hop in routes
    if dst in ipaddress.ip_network(prefix)
]
print("selected", max(matches, key=lambda item: item[0].prefixlen))
PY

实测输出(macOS 26.6.2 / Python 3,2026-09-07):

text
selected (IPv4Network('192.0.2.130/32'), 'local')

三、逐包转发数据路径 ​

RFC 1812 描述的 IPv4 路由器转发核心可归纳为:

注意:

  • 路由器通常不修改端到端源/目的 IP;NAT 是额外功能(19)。
  • 每跳都会改写源/目的 MAC、递减 TTL/Hop Limit。
  • 正向路由正确不代表回程正确;状态防火墙、NAT 和连接跟踪尤其依赖双向路径(防火墙与访问控制、分层故障排查)。

四、直连、静态、默认与黑洞路由 ​

类型产生方式适用场景优点风险
直连路由接口地址启用后由内核产生本地网段自动、可信接口 down 即撤销
静态路由管理员配置小网络、稳定出口、特殊前缀可控、无协议开销拓扑变化不自动收敛
默认路由0.0.0.0/0、::/0叶子网络统一出口表项少错配会把所有未知流量导错
黑洞路由指向 blackhole/Null0丢弃聚合泄漏、DDoS 缓解明确、低成本丢弃误配会静默丢业务

Linux 隔离环境示例:

bash
# 需要 root/CAP_NET_ADMIN;远程主机修改前必须准备带外访问与回滚
sudo ip route add 203.0.113.0/24 via 192.0.2.1 dev eth0
sudo ip route add default via 192.0.2.1
sudo ip route add blackhole 198.51.100.0/24 metric 42760

# 验证实际选择
ip route get 203.0.113.10

# 回滚
sudo ip route del 203.0.113.0/24
sudo ip route del default via 192.0.2.1
sudo ip route del blackhole 198.51.100.0/24

防失联红线:通过 SSH 修改默认路由前,先保存配置、准备带外控制台,并使用带超时自动回滚的方式。不要先删旧默认路由再“试试看”。

五、路由递归与下一跳解析 ​

路由的下一跳本身可能不是直连地址,需要再查一次路由表,这叫递归路由解析(recursive lookup):

text
203.0.113.0/24 via 198.51.100.9
198.51.100.0/24 via 192.0.2.1 dev eth0
192.0.2.0/24 dev eth0 scope link

解析链:

失败模式:

  • 下一跳没有可达路由,候选路由可能处于 inactive/unreachable。
  • 递归链形成环或因策略表不同而解析不一致。
  • BGP NEXT_HOP 未通过 IGP 可达,BGP 路由存在但不能装入 FIB(11)。

六、策略路由与多路由表 ​

普通路由只看目的地址;策略路由可以按源地址、入接口、标记等先选择一张路由表。

双出口示例:192.0.2.0/24 的流量走 ISP-A,198.51.100.0/24 走 ISP-B。

bash
# [未在当前 macOS 执行] Linux 隔离环境
sudo ip route add default via 203.0.113.1 dev eth1 table 100
sudo ip rule add priority 100 from 192.0.2.0/24 lookup 100

ip rule show
ip route show table 100
ip route get 8.8.8.8 from 192.0.2.10

# 清理
sudo ip rule del priority 100
sudo ip route flush table 100

常见坑:只配置正向策略,没有保证回包从同一出口返回,导致非对称路由。无状态转发可能仍通,但状态防火墙、NAT、云安全设备可能因回程不匹配而丢包(19、防火墙与访问控制)。

七、ECMP:等价路径不等于逐包轮询 ​

当多条路径具有相同前缀和等价成本时,可组成 ECMP(Equal-Cost Multi-Path):

现代实现通常按流哈希(源/目的 IP、端口、协议)选下一跳,而不是逐包轮询:

  • 同一五元组稳定走同一路径,避免乱序。
  • 一条大流只能使用其中一个成员的带宽;多流才能摊开。
  • 成员数变化会重新映射部分流,短时间产生乱序或状态设备路径变化。
  • 不同设备的哈希字段、种子、权重和弹性哈希能力不同,属于实现差异。

Linux 示例:

bash
# [未在当前 macOS 执行] 两个等价下一跳
sudo ip route replace 203.0.113.0/24 \
  nexthop via 192.0.2.1 dev eth0 weight 1 \
  nexthop via 198.51.100.1 dev eth1 weight 1

ip route get 203.0.113.10 ipproto tcp sport 40000 dport 443
sudo ip route del 203.0.113.0/24

traceroute 在 ECMP 网络中可能因探测包五元组变化而显示不同路径;它不能证明业务流实际走同一路径(09)。

八、路由汇总 ​

路由汇总(route aggregation/summarization) 将多个连续小前缀合成一个大前缀,减少表项与控制平面更新:

text
192.0.2.0/26
192.0.2.64/26
192.0.2.128/26
192.0.2.192/26
         ↓
192.0.2.0/24

收益与风险:

  • 减小 RIB/FIB、降低协议更新与 SPF 计算压力。
  • 隔离内部拓扑抖动。
  • 若汇总覆盖了实际不存在的子网,流量会被吸入形成黑洞;通常在汇总节点配一条指向 Null0/blackhole 的汇总路由,避免转发环路。
  • 只有连续、按二进制边界对齐的前缀才能无损汇总。

九、单播、广播、组播与任播 ​

模式英文发送关系典型场景路由特点
单播Unicast一对一Web、SSH、数据库目的地址选路
广播Broadcast一对同广播域所有节点IPv4 ARP/DHCP Discover路由器默认隔离;IPv6 无广播
组播Multicast一对加入组的多个接收者IPTV、行情、路由协议 Hello需 IGMP/MLD 与 PIM 等组播路由
任播Anycast多地节点宣告同一地址,路由到“拓扑最近”实例DNS/CDN、全球入口通常用 BGP 宣告同一前缀

任播不保证地理最近,也不保证会话粘性。 路由变化可把后续包导向另一实例,应用要做到无状态或共享状态,并用健康路由撤回而非只依赖应用探活。

1、IGMP 如何管理 IPv4 组播成员 ​

互联网组管理协议(Internet Group Management Protocol,IGMP)用于 IPv4 主机向本地组播路由器表达“加入或离开哪个组播组”:

  • IGMPv1 提供基本成员报告。
  • IGMPv2 增加显式 Leave 和组特定查询。
  • IGMPv3 支持源过滤,是源特定组播(Source-Specific Multicast,SSM)的基础。
  • IPv6 使用组播侦听发现(Multicast Listener Discovery,MLD),不是 IGMP。

IGMP 只管理本地链路成员关系,不负责把组播流量跨路由网络送到接收者;跨网段组播还需要 PIM 等组播路由机制。二层交换机可通过 IGMP Snooping 观察成员报文,避免把组播数据泛洪到所有端口。

排查组播时分别验证:

  1. 主机是否加入正确组;
  2. Query/Report 是否在 VLAN 内双向可见;
  3. Snooping 表和 Querier 是否正常;
  4. 组播路由是否存在;
  5. 防火墙是否允许 IGMP 和目标组播数据。

十、动态路由算法:距离矢量与链路状态 ​

1、距离矢量(Distance Vector) ​

每台路由器只告诉邻居“我到各目的有多远”,基于 Bellman-Ford 迭代:

text
D_x(y) = min_v { cost(x,v) + D_v(y) }

优点是简单、资源少;缺点是视野局部、收敛慢,故障时可能数到无穷与形成环路。缓解手段:

  • 分割地平线(split horizon)
  • 毒性逆转(poison reverse)
  • 触发更新(triggered update)
  • 抑制定时器(hold-down,具体实现)

RIP 是典型距离矢量协议:以跳数为度量,16 表示不可达,因此最大有效 15 跳。RIPv2(RFC 2453)支持 CIDR 与认证,但仍只适合小型、简单网络,不适合现代大型生产骨干。

每台路由器把自己的链路状态可靠泛洪,使同一区域内设备获得近似一致的链路状态数据库(Link-State Database,LSDB),再独立运行 Dijkstra SPF:

优点是收敛快、拓扑视图完整;代价是 LSDB 内存、泛洪与 SPF CPU 开销。OSPF 与 IS-IS 是典型链路状态协议(11)。

维度距离矢量链路状态
交换内容到目的的距离/下一跳本地链路状态
拓扑视图局部区域内完整
计算Bellman-Ford 式迭代Dijkstra SPF
收敛较慢,易计数到无穷较快,但可能 SPF 风暴
典型协议RIPOSPF、IS-IS
适用小型简单网络企业、运营商、数据中心 IGP

十一、最小可复现实验 ​

1、实验目标 ​

  1. 验证主机对真实目的的实际选路、出接口与 MTU。
  2. 在隔离 Linux 环境验证静态路由、默认路由与路由递归。
  3. 观察错误路由与回程缺失的失败现象。

2、本机已验证:实际路由查询 ​

bash
# macOS
route -n get example.com
# Linux
ip route get 104.20.23.154

本机实测(2026-09-07,地址已省略,只保留结构):

text
route to: 104.20.23.154
destination: 64.0.0.0
interface: utun4
flags: <UP,DONE,CLONING,STATIC>
mtu: 1280

结论边界:这是启用隧道接口 utun4 时的本机单次观测,只能证明该目的在当时选中该接口与 MTU 1280,不能推广到其他主机或时刻。

3、Linux 隔离实验(当前 macOS 未执行) ​

沿用 20 统一实验:

bash
# client 到 server 的静态路由与查询
sudo ip netns exec cli ip route replace 198.51.100.0/24 via 192.0.2.1
sudo ip netns exec cli ip route get 198.51.100.2
sudo ip netns exec cli ping -c 3 198.51.100.2

# 失败注入:删除 server 回程默认路由
sudo ip netns exec srv ip route del default
# 预期:client 发包到达 server,但回包无路由;单侧抓包不能断言中间丢包

# 恢复并验证
sudo ip netns exec srv ip route add default via 198.51.100.1
sudo ip netns exec cli ping -c 3 198.51.100.2

抓包点:

bash
sudo ip netns exec rtr tcpdump -i any -nn -c 40 \
  'host 192.0.2.2 and host 198.51.100.2'

预期证据:失败注入前请求与应答双向可见;删除回程路由后只看到 client→server 请求,无 server→client 应答;恢复后双向重新出现。

4、清理与恢复 ​

bash
sudo ip netns exec cli ip route del 198.51.100.0/24 via 192.0.2.1 2>/dev/null || true
# 统一拓扑若不再使用,执行 30 章 lab-down 清理

十二、常见故障与排查 ​

现象优先假设验证
本机访问某网段失败LPM 选到错误更具体路由ip route get <dst>
请求发出无响应回程路由缺失/非对称两端路由查询 + 双点抓包
多出口偶发失败策略路由只配正向,状态设备不接受非对称ip rule、各表、conntrack
ECMP 下部分连接失败某成员路径故障或 MTU 不同固定五元组探测、逐下一跳验证
路由表有但业务不通邻居未解析、FIB 未下发、ACL/NATip neigh、硬件 FIB、抓包
动态路由反复变化邻接抖动或错误重分发协议邻居、更新日志、变更记录

十三、性能与容量 ​

  • FIB 查询通常由 trie、TCAM 或 ASIC 完成;性能关注**每秒包数(pps)**而非仅带宽。
  • ECMP 提升多流总吞吐,不保证单流叠加带宽。
  • 过量更具体路由增加控制平面内存、FIB/TCAM 消耗和更新压力。
  • 路由抖动会触发反复收敛、缓存失效和流重映射;不要在无证据时只调大定时器掩盖根因。

十四、安全风险与加固 ​

  • 静态/策略路由误配可造成黑洞、流量劫持或绕过安全设备;变更必须有评审、回滚、带外访问。
  • 启用源地址验证(BCP 38/uRPF)需考虑非对称路由,严格模式可能误杀合法流量。
  • 动态协议要做邻居认证、被动接口、控制平面 ACL;路由导入/重分发必须显式过滤(11)。
  • 黑洞路由用于 DDoS 缓解时要限定前缀、审批与自动过期,避免永久误伤。

十五、版本、平台与实现差异 ​

  • RFC 1812 是 IPv4 路由器要求;IPv6 转发遵循 RFC 8200 等文档(08)。
  • Linux 使用 RPDB(ip rule)+ 多路由表;macOS/Windows 命令与规则模型不同。
  • ECMP 哈希、权重、弹性哈希、管理距离均有厂商/内核差异,必须查目标版本官方文档。
  • 本章 FRR/BIRD 动态协议实验未运行:本机虽有 Docker 29.6.1,但未发现可直接使用的 FRR 镜像,且不为验证文档而拉取未经锁定版本的镜像。第 11 章给出明确的未验证实验。

十六、关联章节 ​

检索关键词 ​

RIB FIB 邻接表区别 路由转发流程 最长前缀匹配 LPM 静态路由 默认路由 黑洞路由 路由递归 next hop Linux 策略路由 ip rule ECMP 五元组哈希 路由汇总 单播广播组播任播 距离矢量 链路状态 RIP 15 跳 数到无穷 非对称路由

权威来源 ​

协议与转发语义已于 2026-09-07 对照 RFC Editor 正文核验。本机路由查询与 LPM 脚本已实际执行;需要 Linux iproute2、网络命名空间或动态路由守护进程的实验已明确标记“未在当前环境执行”。

ICP 备案号待补充 · Gitee 主页