Linux route 与 ip route 配置案例

2次阅读

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

Linux route 与 ip route 配置案例

route 命令已被废弃,别再用它配路由

linuxroute 是 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 routeroute 只用于临时排查旧脚本兼容性
  • 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/interfacesdebian)或 /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)永远优先于任何静态路由,删不掉,只能用更精确的路由覆盖

删除路由时容易误删或删不干净

删路由不是“找得到就能删”,重点在于匹配精度。用模糊匹配(比如只写目标网络)可能删错,而用完整参数又容易漏掉 devvia 导致命令静默失败。

使用场景:清理测试添加的临时路由,或切换网关前清除旧路径。

  • 安全做法:先 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 缓存三者耦合;最容易被忽略的是:你以为删掉的那条路由,其实被另一张表里的规则悄悄兜底了。

text=ZqhQzanResources