3. 路由表与转发表不一致故障排查

在 Junos 设备上,“路由表里有这条路由”并不等于“报文真的会按这条路由转发”。前者属于控制平面,由路由协议进程(rpd)维护,通常称为 RIB(Routing Information Base);后者属于转发平面,由内核与 PFED 下发到 PFE,通常称为 FIB(Forwarding Information Base)。当 RIB 与 FIB 不一致时,典型现象是:show route 能看到某条前缀,但 show route forwarding-table 查不到对应表项,或者下一跳、出接口、标签栈与 RIB 中的预期不同,导致流量被丢弃、走错路径或回退到默认路由。

要排查这类问题,先要理解 RIB 到 FIB 的同步链路。以 Junos 为例,路由进程计算出最优路由后,会把“活跃路由”写入内核路由表(kernel route),内核再通过 PFED 将转发信息编程到 PFE 的转发表中。因此,RIB、kernel route、forwarding-table 三者是逐级下发的:RIB 是路由决策结果,kernel route 是内核视角的转发条目,forwarding-table 是 PFE 实际执行的转发表。任何一级出现丢失、延迟或属性偏差,都会造成“表里有、转发无”的故障。

RIB → Kernel → FIB 同步链路与差异定位 RIB(路由表) rpd 计算最优路由 show route table inet.0 含协议、优先级、下一跳 Kernel Route 内核路由表 show route forwarding-table (含 kernel 标志) FIB(转发表) PFE 硬件转发表 show route forwarding-table 实际转发依据 下发 编程 差异定位与修复路径 ① RIB 有,Kernel 无 rpd 未下发 / 内核拒绝 检查 rpd 日志、路由策略 ② Kernel 有,FIB 无 PFED 编程失败 / 资源不足 检查 PFED、硬件表项 ③ 三者都有但属性不同 下一跳 / 接口 / 标签不一致 检查 ECMP、LAG、隧道 修复动作 clear route forwarding-table / restart routing / 检查策略与硬件资源 / 必要时重启 PFED 或 PFE

一、先确认“不一致”到底发生在哪一级

排查时不要一上来就重启路由进程,而应按“RIB → kernel → FIB”的顺序逐级比对。第一步,用 show route table inet.0 <prefix> 确认 RIB 中该前缀是否存在、是否活跃(* 标记)、下一跳和出接口是什么。第二步,用 show route forwarding-table destination <prefix> 查看转发表中是否有对应条目,并注意条目类型:user 表示由路由进程下发,kernel 表示内核路由,perm 表示永久表项。第三步,如果 forwarding-table 中有条目但属性与 RIB 不符,重点比对下一跳、出接口、标签栈和权重。

一个常见的误区是只看 show route 的输出就下结论。实际上,show route 默认展示的是 RIB 中的路由,而 show route forwarding-table 展示的是内核与 PFE 视角的转发表。两者查询的是不同平面,必须分别确认。

二、典型差异场景与定位方法

场景一:RIB 有路由,forwarding-table 无条目。这通常意味着 rpd 没有把该路由下发到内核,或者内核拒绝安装。常见原因包括:路由被策略(export policy)过滤、下一跳不可达导致路由不活跃、内核路由表已满、或 rpd 与内核通信异常。此时应检查 show route <prefix> detail 中的 Next hop 和 State 字段,并用 show log messages 查找 rpd 或 kernel 相关报错。

场景二:kernel 有,但 PFE 转发表无。这通常与 PFED 编程失败有关,例如硬件表项资源耗尽、下一跳索引冲突、或 PFE 与 PFED 之间通信中断。可以查看 show pfe statistics error 和 show chassis fpc 确认是否有硬件级异常。如果只是个别前缀丢失,可尝试 clear route forwarding-table 触发重新下发;若大面积丢失,则需考虑重启 PFED 或对应 PFE。

场景三:三张表都有,但下一跳或出接口不一致。这类问题多出现在 ECMP、LAG、隧道或 MPLS 场景中。例如 RIB 中显示两条等价下一跳,但 forwarding-table 只保留了一条;或者 RIB 中出接口是 ge-0/0/0.0,forwarding-table 中却指向 ge-0/0/1.0。此时应检查 show route forwarding-table destination <prefix> extensive,确认 Next hop、Interface、Index 等字段,并与 show route <prefix> extensive 逐项比对。

三、修复与验证

定位到具体层级后,修复动作应对症下药。如果是策略过滤导致未下发,应调整 export policy 并重新应用;如果是下一跳不可达,应先解决下一跳可达性;如果是 PFED 编程失败,可先尝试 clear route forwarding-table,再观察是否恢复。对于顽固性不一致,可执行 restart routing 重启路由进程,但需注意这会短暂中断路由协议会话,应在维护窗口内操作。

修复后必须验证三张表是否重新一致。建议按以下顺序复查:

show route table inet.0 10.10.10.0/24 detail
show route forwarding-table destination 10.10.10.0/24 extensive
show route forwarding-table destination 10.10.10.0/24 | match "Next hop|Interface|Index"

如果三张表中的下一跳、出接口和标签栈完全一致,且流量实际转发路径符合预期,才可判定故障恢复。若仍不一致,应回到差异定位区,重新判断是 RIB 未下发、内核未安装,还是 PFE 未编程,避免盲目重启。

在 Junos 中,show route forwarding-table 默认显示的是内核转发表,加上 extensive 可看到更详细的下一跳索引和接口信息。若需查看 PFE 硬件表项,可结合 show pfe route 或 show route forwarding-table 的 detail 输出综合判断。
重启 routing 进程会清除所有路由协议会话并重新收敛,生产环境务必谨慎。优先尝试 clear route forwarding-table 或针对特定前缀的重新下发,只有在确认 rpd 与内核同步异常时才考虑重启路由进程。