多路由表转发不生效主因是策略路由链路中断,需依次检查:策略规则是否匹配且优先级正确、目标路由表是否存在有效路由、内核转发与rp_filter是否启用或干扰、抓包验证实际路径。

多路由表转发不生效,通常不是规则没加,而是策略路由链路断在某个环节。重点检查策略规则是否匹配、对应路由表是否存在有效路由、以及内核转发和反向路径过滤(rp_filter)是否干扰。
确认策略规则是否被正确加载并匹配
策略路由依赖 ip rule 规则触发查表,若规则未生效或优先级冲突,流量根本不会进目标路由表。
- 运行
ip rule show,确认存在类似from 192.168.10.5/32 lookup 100的规则,且没有更高优先级的规则(数字越小优先级越高)将其屏蔽 - 用
ip rule get from 192.168.10.5 to 8.8.8.8模拟查规则链,看是否命中预期的 lookup 表(如lookup 100) - 注意:策略规则只对“出向”或“入向”源地址生效,
from匹配的是报文源 IP,to匹配目的 IP,二者不可混淆
验证目标路由表中是否存在可用的转发路由
即使规则命中了某张表(如表 100),若该表里没有对应下一跳或直连网络,转发仍会失败,内核默认不会 fallback 到 main 表。
- 执行
ip route show table 100(把 100 替换为你的表 ID 或名字),确认有类似default via 192.168.100.1 dev eth1或10.0.0.0/24 dev eth0 scope link的有效条目 - 确保路由中的出接口(
dev)处于UP状态,且 IP 配置与网关可达(可临时用ping -I eth1 192.168.100.1测试) - 避免仅配置
default路由却遗漏local或broadcast条目——某些场景下(如响应 ARP 或本地连接)需要显式添加ip route add local 192.168.10.5 dev eth0 table 100
检查内核转发与反向路径过滤(rp_filter)是否阻断
Linux 默认开启严格模式 rp_filter,当报文入接口与路由回程路径不一致时(常见于多宿主或多表环境),内核会直接丢弃该包,表现为“能发不能收”或连接超时。
- 查看当前设置:
sysctl net.ipv4.conf.all.rp_filter和sysctl net.ipv4.conf.eth1.rp_filter(替换为实际接口名) - 临时关闭严格反向检查:
sysctl -w net.ipv4.conf.all.rp_filter=0或设为宽松模式=2(推荐) - 同时确认
net.ipv4.ip_forward = 1已启用,否则所有跨网段转发都会被静默丢弃
抓包定位实际走哪条路径
理论配置全对,但行为异常时,必须用抓包验证真实路径——是没进策略表?进了表但没路由?还是出接口发出去但对方没响应?
- 在入接口(如 eth0)抓包:
tcpdump -i eth0 host 8.8.8.8 -nn,确认原始报文到达 - 在出接口(如 eth1)抓包:
tcpdump -i eth1 host 8.8.8.8 -nn,确认是否真从该口发出 - 对比两处抓包的 TTL、源 IP、MAC 地址,判断是否被 SNAT、策略重定向或中间设备改写
- 配合
ip route get 8.8.8.8 from 192.168.10.5 oif eth0查看内核实际选路结果,注意输出中的table字段



















