route命令已废弃,应改用ip route;ip route添加静态路由必须显式指定via或dev,删除需精确匹配参数,验证须用ip route get而非show。

route 命令已被废弃,别再用它配路由
linux 里 route 是 sysvinit 时代遗留的工具,底层调用的是过时的 ioctl 接口,不支持 IPv6、策略路由、多路径等现代特性。新系统(尤其是 systemd + iproute2 默认环境)运行 route 可能看似成功,但实际路由表更新不生效,或与 ip route 输出不一致。
常见错误现象:route add -net 10.20.0.0/16 gw 192.168.1.1 执行后 ip route show 看不到新增项;或重启网络服务后消失。
- 所有新配置一律改用
ip route,route只用于临时排查旧脚本兼容性 -
route -n查看当前路由可以,但不要依赖它的输出做判断——它可能缓存旧状态 - centos 8+/RHEL 8+、ubuntu 18.04+ 默认已不安装 net-tools(含
route),装了也建议卸载避免干扰
ip route add 的核心参数组合怎么写才生效
加一条静态路由,关键不是“能不能敲出来”,而是“是否进入内核路由表且不被覆盖”。最常漏掉的是设备(dev)或下一跳(via)的显式指定,尤其当主机有多个网卡时。
使用场景:给某网段走特定出口,比如让容器流量绕过默认网关。
- 必须指定出接口或下一跳:
ip route add 172.16.100.0/24 via 10.0.2.2 dev eth1(推荐同时写,明确意图) - 不写
dev时,内核会自动查 FIB 表选接口,可能选错;不写via且目标非直连网段,会报Network is unreachable - 加
src参数可指定回程包源地址,避免 asymmetric routing:ip route add 192.168.5.0/24 via 192.168.1.254 src 192.168.1.100 - 临时路由重启即丢,要持久化得写进
/etc/network/interfaces(debian)或/etc/sysconfig/network-scripts/route-eth0(RHEL)
为什么 ip route show 看到的路由顺序和预期不一样
Linux 路由查找是“最长前缀匹配 + 表优先级”,不是按 ip route show 输出顺序执行。你看到的顺序只是内核按表(main、local、default)和前缀长度排序后的展示结果,不代表匹配顺序。
常见错误现象:加了一条 /24 路由,但发往该网段的包仍走默认路由;或者 ip route get 10.1.1.1 返回的结果和 show 里排第一的不一致。
- 用
ip route get 10.1.1.1验证实际走向,它模拟内核查找过程,比show更真实 - 不同路由表(如
table 100)默认不参与 main 表查找,需配合策略规则(ip rule)才生效 -
metric值只在同一表内影响同前缀路由的优先级,跨表无效;proto kernel路由优先级永远高于proto Static - 直连路由(
proto kernel scope link)永远优先于任何静态路由,删不掉,只能用更精确的路由覆盖
删除路由时容易误删或删不干净
删路由不是“找得到就能删”,重点在于匹配精度。用模糊匹配(比如只写目标网络)可能删错,而用完整参数又容易漏掉 dev 或 via 导致命令静默失败。
使用场景:清理测试添加的临时路由,或切换网关前清除旧路径。
- 安全做法:先
ip route show复制整行,再把via/dev/src全部带上执行ip route del - 只写
ip route del 10.20.0.0/16会删掉该前缀下所有匹配路由(包括不同via的),高风险 - 删不掉?检查是否属于 local 表(如主机地址路由),
ip route show table local查,删要用ip route del ... table local - 删完立刻用
ip route get验证,别只信show输出——有时删了但内核缓存未刷新,get才反映真实状态
复杂点在于路由表、策略规则、FIB 缓存三者耦合;最容易被忽略的是:你以为删掉的那条路由,其实被另一张表里的规则悄悄兜底了。