ip rule 不生效主因是路由表未绑定或优先级冲突;Linux 按 priority 升序匹配,重复值导致后加规则被忽略;需显式指定唯一 priority、确认路由表存在有效路由,并关闭 rp_filter 干扰。

为什么 ip rule 添加后不生效?检查路由表绑定和优先级冲突
策略路由不生效,最常见原因是规则没指向正确的路由表,或新规则优先级被已有规则覆盖。Linux 按 priority 数值升序匹配规则,0 最高,32767 默认最低。执行 ip rule show 时若看到两条规则 priority 都是 100,后加的那条会被忽略。
实操建议:
- 添加规则时显式指定唯一 priority,例如:
ip rule add from 192.168.2.100/32 table 200 priority 100 - 确保目标路由表存在且含有效路由:
ip route show table 200应返回至少一条default via ... dev eth1类似条目 - 确认内核启用策略路由支持:
cat /proc/sys/net/ipv4/conf/all/rp_filter建议设为0或2,否则反向路径校验可能丢弃“非对称”路径的包
如何让某 IP 段流量强制走特定网卡?用 to 和 from 匹配方向要分清
from 控制源地址出发的流量(如本机主动访问),to 控制目标地址匹配的入向响应(如本机作为服务器时的回包)。多数分流场景只需 from;但若需保证双向路径一致(例如 SNAT 后的回程),必须同时配 to 规则。
实操建议:
- 让 192.168.10.0/24 网段所有出向流量走
eth0:ip rule add from 192.168.10.0/24 table 100,再配ip route add default via 192.168.10.1 dev eth0 table 100 - 若该网段还提供服务,且客户端在另一子网(如 10.0.0.0/24),则补一条:
ip rule add to 192.168.10.0/24 table 100,避免回包误走主表 - 注意:仅配
to不配from通常无效——内核不基于目的地址做初始路由决策
如何持久化 ip rule 和多表路由?别只靠 /etc/rc.local
重启后规则消失,是因为 ip rule 和 ip route table X 全是运行时配置。写进 /etc/rc.local 看似简单,但 systemd 下常因执行时机过早(网络未就绪)而失败。
实操建议:
- Debian/Ubuntu 推荐改
/etc/network/interfaces,在对应 iface 段加:up ip rule add from 192.168.3.50/32 table 300<br>up ip route add default via 192.168.3.1 dev eth2 table 300
- RHEL/CentOS 8+ 使用 NetworkManager 的
nmcli或配置文件/etc/sysconfig/network-scripts/rule-eth1,格式为:from 192.168.1.0/24 table 150 - 通用兜底方案:用 systemd service 依赖
network-online.target,并加入重试逻辑(如 ping 网关成功后再执行ip命令)
为什么 traceroute 显示路径不对?ip rule 不影响本地生成的探测包
traceroute 默认用 UDP 或 ICMP 发包,其源地址由主路由表(table 254)决定,不受策略规则影响。这会造成“明明配了分流,traceroute 却走错路”的误解。
实操建议:
- 验证策略路由是否真生效,改用实际业务流量测试:比如从指定 IP
curl -s --interface 192.168.2.100 http://example.com - 用
ip route get <dst> from <src></src></dst>模拟查表,例如:ip route get 8.8.8.8 from 192.168.2.100,输出应显示对应 table 和 dev - 抓包确认:在目标网卡上
tcpdump -i eth1 host 8.8.8.8,看实际发包是否出现
策略路由本质是 per-packet 决策,但调试时容易被工具链的默认行为带偏——记住:不是所有命令都尊重你的 ip rule。



















