策略路由没生效,首要验证ip rule show是否显示from/to table规则;无则未加载,有则检查优先级是否被默认规则覆盖,再用ip route show table指定表名查路由,同时关闭rp_filter并确保直连路由存在。

策略路由没生效,八成是连规则都没加载进去——ip rule show 必须先跑一遍,别只盯着 ip route show 看 main 表。
怎么确认策略规则已加载
内核只在 ip rule 匹配成功后才查自定义路由表,所以第一步永远是验证规则是否存在、优先级是否冲突。
-
ip rule show输出里必须有from xxx table yyy或to xxx iif ethN这类条目;没有就说明规则根本没加进去 - 优先级(
priority)数字越小越先匹配,比如priority 100会覆盖priority 101;若两条规则都匹配同一源 IP,低优先级的会被跳过 - 如果看到
from all lookup local或to 0.0.0.0/0 lookup main这类默认规则排在你自定义规则前面,你的策略可能被绕过了 - 临时加的规则重启即丢,
ip rule show能立刻暴露是否漏写了持久化步骤
如何查看所有路由表内容
ip route show 默认只显示 main 表,多表环境下必须显式指定表名或 ID,否则等于没查。
PyCharm 2026.2.0.1 Linux版提供 JetBrains 官方 2026.2.0.1 版本安装包,适合需要指定 PyCharm 版本进行 Python 项目开发、运行和调试的用户。
- 查某张自定义表:例如表名是
table_eth1,运行ip route show table table_eth1 - 查所有非空表:用
ip -d route show table all | grep -E 'table|via|dev',避免漏掉未命名的表(如 ID 200) - 直连网段路由必须存在:每张自定义表里都要有类似
10.0.2.0/24 dev eth1 src 10.0.2.100的条目,否则出包时找不到出口设备 - 别信
route -n:它只读main表,对策略路由完全不可见
怎么正确配置自定义路由表
表名只是别名,真正起作用的是编号;/etc/iproute2/rt_tables 只是映射文件,删了也不影响已加载的规则,但重启后无法解析表名。
- 往
/etc/iproute2/rt_tables追加一行即可,例如:200 backup;编号避开 0、253–255 这些保留值 - 添加路由时必须带
table xxx,否则一律进main表,比如:ip route add default via 10.0.2.1 dev eth1 table backup - 源地址规则要精确:用
from 10.0.2.100/32比from 10.0.2.0/24更安全,避免子网内其他 IP 误入该表 - 表里不能只有
default via:必须补上直连子网路由,否则本地响应包发不出去
为什么策略路由查不到回包路径
最常被忽略的是 rp_filter——它不看策略表,只按 main 表做反向路径检查,一开就丢包。
- 必须关掉:
echo 0 > /proc/sys/net/ipv4/conf/all/rp_filter,同时关掉对应网卡的:echo 0 > /proc/sys/net/ipv4/conf/eth0/rp_filter -
rp_filter = 2(松散模式)不够用,它仍可能丢弃策略路由下的回包;只有= 0才彻底禁用 - 转发也要开:
echo 1 > /proc/sys/net/ipv4/ip_forward,否则跨网卡流量直接被内核截断 - 验证回包路径:用
ip route get 192.168.1.100 from 10.0.2.100 iif eth1模拟入向流量,看是否命中你设的表
策略路由不是“配完就通”,而是每个环节都得对齐:规则匹配、表里有路、rp_filter 关闭、直连路由补齐——少一个,ping 得通,别人 ping 不进来,SSH 连上就断。










