route 命令主要用于查看和操作 Linux 内核的 IP 路由表。它源自 BSD 系统,是 net-tools 工具包中的经典组件,在 Linux 早期被视为管理网络路由的“事实标准”。然而,自 2009 年起,net-tools 已被标记为不推荐使用,官方更建议采用 iproute2 套件中的 ip route 命令。尽管如此,由于历史脚本和旧教材的广泛使用,route 命令在当今的生产环境中仍然普遍存在,熟练掌握它对于兼容和运维老旧系统依然非常重要。

需要注意的是,在 RHEL 8、CentOS 8 以及 Ubuntu 18.04 及以上版本中,net-tools 默认并未安装。如需使用,需要手动执行 yum install net-tools 或 apt install net-tools 命令进行安装。
简介
| 项目 | 说明 |
|---|---|
| 命令全称 | route(已弃用) |
| 所属包 | net-tools(RHEL/CentOS 默认 / Ubuntu 新版需手动安装) |
| 现代替代 | ip route(iproute2 套件) |
| 配置文件 |
|
| 操作对象 | Linux 内核的 路由表(Routing Table) |
| 默认行为 | 显示路由表(route 相当于 route -n 或 netstat -rn) |
| 权限 | 普通用户可查看,修改需 root 权限 |
为什么会有多个路由表?
Linux 内核实际上支持 多路由表(默认范围 0~255,共 256 张),这些表由 /etc/iproute2/rt_tables 文件定义。默认情况下,主要包含以下几张:
local(255):本机地址路由main(254):默认主路由表default(253):默认后备路由表
需要注意的是,route 命令只能操作 main 表。如果需要操作其他路由表,则必须使用 ip route show table 100 或策略路由 ip rule 命令。
语法
# 查看路由表 route [-nNnee] # 查看路由表 route -6 # IPv6 等效于 route -A inet6 # 修改路由 route add [-net|-host] TARGET [netmask MASK] [gw GW] [metric M] [mss M] [window W] [irtt I] [reject] [mod] [dyn] [reinstate] [[dev] Iface] route del [-net|-host] TARGET [netmask MASK] [gw GW] [metric M] [[dev] Iface]
这里有一个细节:route 的旧版语法要求将 dev eth0 放在最后,而现代版本也支持 -iface eth0 的形式。参数顺序 在新旧版本之间可能存在差异,因此一个稳妥的建议是:显式使用 -net 或 -host 来区分目标类型,这样可以避免出错。
选项
| 选项 | 简写 | 说明 |
|---|---|---|
--numeric | -n | 以数字格式显示(不进行 DNS 解析) |
--net | 目标为网络(route add -net 10.0.0.0/8 ...) | |
--host | 目标为主机(route add -host 192.168.1.5 ...) | |
--netmask MASK | 配合 -net 指定掩码(route add -net 10.0.0.0 netmask 255.0.0.0) | |
gw GW | 指定网关(gw 192.168.1.1) | |
metric M | 路由度量值(越小越优先) | |
mss M | TCP MSS 限制 | |
window W | TCP 窗口大小(KB) | |
irtt I | 初始 RTT(ms) | |
reject | 拒绝路由(blackhole) | |
mod / dyn / reinstate | 动态路由标志(已被 BGP/OSPF 取代) | |
dev Iface | 指定出口网卡(关键参数) | |
-A FAMILY | 地址族:inet(默认 IPv4)、inet6(IPv6)、ax25 等 | |
-v / --verbose | 详细输出 | |
-e | 以 netstat 格式显示(更详细) | |
-F | 显示 FIB 转发信息库(默认) | |
-C | 显示内核路由缓存(已废弃,内核 3.6+ 移除) | |
-V / --version | 版本信息 | |
-h / --help | 帮助信息 |
实战示例
示例 1:route -n 查看路由表(最常用)
# 查看路由表(以数字形式显示,不解析 DNS) $ route -n Kernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Iface 0.0.0.0 192.168.1.1 0.0.0.0 UG 100 0 0 eth0 10.0.0.0 10.0.0.1 255.0.0.0 UG 0 0 0 eth1 169.254.0.0 0.0.0.0 255.255.0.0 U 1002 0 0 eth0 192.168.1.0 0.0.0.0 255.255.255.0 U 100 0 0 eth0
字段详解:
| 字段 | 含义 | 示例解读 |
|---|---|---|
Destination | 目标网络或主机 | 0.0.0.0 表示默认路由(全匹配) |
Gateway | 下一跳网关 | 0.0.0.0 表示直连(不需要网关) |
Genmask | 子网掩码 | 0.0.0.0 用于默认路由 |
Flags | 标志位 | U(启用) G(网关) H(主机) D(动态) M(修改) A(已被 arp) C(缓存) !(拒绝) |
Metric | 距离度量 | 多路由同目标时,值越小越优先 |
Ref | 引用次数 | 已弃用(net-tools 中已无实际意义) |
Use | 查找计数 | 此路由被查找过的次数 |
Iface | 出口网卡 | 实际数据包从哪张网卡发出 |
示例路由解析:
0.0.0.0 → 192.168.1.1 UG:默认路由,所有非本地流量均经过192.168.1.110.0.0.0/8 → 10.0.0.1 UG:前往内网 10.x.x.x 的流量从eth1出口192.168.1.0/24 → 0.0.0.0 U:直连eth0网段169.254.0.0/16 → 0.0.0.0 U:link-local 地址(DHCP 失败时自动分配)
一个小技巧:如果不加 -n,route 会尝试对 Gateway 字段进行 DNS 反向查询,在网络隔离环境中可能导致数秒延迟。因此,始终记得加上 -n。
示例 2:添加与删除路由
# ========== 添加主机路由(单 IP) ==========
# 目标:到达 192.168.2.100 这台主机,走 192.168.1.254 网关,从 eth0 出
$ sudo route add -host 192.168.2.100 gw 192.168.1.254 dev eth0
# 验证
$ route -n | grep 192.168.2.100
192.168.2.100 192.168.1.254 255.255.255.255 UGH 0 0 0 eth0
# Flags 为 UGH(Up + Gateway + Host)
# ========== 添加网络路由(子网) ==========
# 目标:到达 172.16.0.0/16 网段
$ sudo route add -net 172.16.0.0 netmask 255.255.0.0 gw 192.168.1.1 dev eth0
# 等价简化写法(CIDR 格式,net-tools 新版支持)
$ sudo route add -net 172.16.0.0/16 gw 192.168.1.1 dev eth0
# 验证
$ route -n | grep 172.16
172.16.0.0 192.168.1.1 255.255.0.0 UG 0 0 0 eth0
# ========== 设置默认路由 ==========
$ sudo route add default gw 192.168.1.1 dev eth0
# 等价
$ sudo route add -net 0.0.0.0 netmask 0.0.0.0 gw 192.168.1.1 dev eth0
# ========== 带 metric 的多路由 ==========
# 同一目标两条路由,metric 小者优先
$ sudo route add -net 10.10.0.0/16 gw 192.168.1.2 metric 100
$ sudo route add -net 10.10.0.0/16 gw 192.168.1.3 metric 200
# 10.10.x.x 优先走 192.168.1.2;该网关不可用时才走 .3
$ ip route get 10.10.5.5
10.10.5.5 via 192.168.1.2 dev eth0 src 192.168.1.100 uid 0
cache
# ========== 删除路由 ==========
$ sudo route del -net 172.16.0.0/16 gw 192.168.1.1
# 注意:删除时的网关和目标需匹配
$ sudo route del default gw 192.168.1.1
# ========== 添加黑洞路由(丢弃数据包) ==========
$ sudo route add -host 10.1.2.3 reject
$ ping 10.1.2.3
connect: Network is unreachable
示例 3:route 与 ip route 对比
# 同一操作,net-tools vs iproute2 # 1. 查看路由表 $ route -n # net-tools(旧) $ ip route show # iproute2(新,等价) $ ip -4 route # 仅显示 IPv4 $ ip -6 route # 仅显示 IPv6 $ ip route show table main # 查看 main 表 # 2. 查看默认路由 $ route -n | grep ^0.0.0.0 $ ip route show default default via 192.168.1.1 dev eth0 # 3. 添加默认路由 $ route add default gw 192.168.1.1 $ ip route add default via 192.168.1.1 # 4. 添加网络路由 $ route add -net 10.0.0.0/8 gw 192.168.1.1 $ ip route add 10.0.0.0/8 via 192.168.1.1 # 5. 删除路由 $ route del -net 10.0.0.0/8 $ ip route del 10.0.0.0/8 # 6. 添加黑洞路由 $ route add -host 10.1.2.3 reject $ ip route add blackhole 10.1.2.3 # 7. 查看路由来源(OSPF/BGP/静态) $ ip route show proto static # route 不支持 # 8. 添加策略路由 $ echo "100 custom" >> /etc/iproute2/rt_tables $ ip route add 10.20.0.0/16 dev eth1 table custom $ ip rule add from 192.168.1.100/32 lookup custom # route 完全不支持策略路由
那么,为什么推荐迁移到 ip route? 下面这个对比表格应该能说明问题:
| 维度 | route (net-tools) | ip route (iproute2) |
|---|---|---|
| 维护 | 已停止维护(自 2009 年起) | 持续维护,netlink 接口 |
| 策略路由 | ❌ 不支持 | ✅ 支持多表(ip rule) |
| 高级特性 | ❌ 无 | ✅ 黑洞、均衡、ECMP、tunnel |
| 性能 | 解析慢、需重启网络 | 实时生效,异步更新 |
| 推荐 | 仅作兼容用途 | 生产首选 |
示例 4:持久化路由配置
重要:
route add只是临时修改,网络重启或系统重启后就会丢失。在生产环境里,必须将其持久化。
方法 1:RHEL/CentOS - /etc/sysconfig/network-scripts/route-IFACE
# 文件名必须与网卡名对应,如 route-eth0、route-bond0 $ sudo vim /etc/sysconfig/network-scripts/route-eth0 # 格式 1(传统 net-tools 风格): 10.10.0.0/16 via 192.168.1.1 dev eth0 172.16.0.0/12 via 192.168.1.1 dev eth0 # 格式 2(iproute2 风格,RHEL 7.4+ 推荐): 10.10.0.0/16 via 192.168.1.1 172.16.0.0/12 via 192.168.1.1 # 重新加载网络 $ sudo nmcli connection reload # 或 $ sudo systemctl restart NetworkManager
方法 2:Debian/Ubuntu - /etc/network/interfaces
# 旧版 /etc/network/interfaces
auto eth0
iface eth0 inet static
address 192.168.1.100
netmask 255.255.255.0
gateway 192.168.1.1
up route add -net 10.10.0.0/16 gw 192.168.1.1 dev eth0
down route del -net 10.10.0.0/16 gw 192.168.1.1 dev eth0
# up/down 钩子在网卡启停时执行
方法 3:Netplan(Ubuntu 18.04+ 推荐)
# /etc/netplan/01-netcfg.yaml
network:
version: 2
renderer: networkd
ethernets:
eth0:
addresses:
- 192.168.1.100/24
gateway4: 192.168.1.1
routes:
- to: 10.10.0.0/16
via: 192.168.1.1
- to: 172.16.0.0/12
via: 192.168.1.1
方法 4:NetworkManager 命令行
# 添加永久路由(NM 自动写入配置) $ sudo nmcli connection modify eth0 +ipv4.routes "10.10.0.0/16 192.168.1.1" $ sudo nmcli connection up eth0 $ ip route show
示例 5:诊断网络不可达(实战案例)
# 问题:能 ping 通网关 192.168.1.1,但 ping 不到外网 8.8.8.8 # 1. 查看路由表 $ route -n Kernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Iface 0.0.0.0 192.168.1.1 0.0.0.0 UG 100 0 0 eth0 192.168.1.0 0.0.0.0 255.255.255.0 U 100 0 0 eth0 # ⚠️ 没有默认路由!或者默认路由网关不对 # 2. 修复:添加正确默认路由 $ sudo route add default gw 192.168.1.1 dev eth0 # 3. 验证 $ ping -c 2 8.8.8.8 PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data. 64 bytes from 8.8.8.8: icmp_seq=1 ttl=119 time=12.3 ms 64 bytes from 8.8.8.8: icmp_seq=2 ttl=119 time=11.8 ms # ====== 进阶案例:多网卡路由冲突 ====== # 两张网卡都配置了 0.0.0.0 默认路由,metric 相同 → 流量乱跳 # 解决:调整 metric $ sudo route add default gw 192.168.1.1 dev eth0 metric 100 $ sudo route add default gw 10.0.0.1 dev eth1 metric 200 # 优先走 eth0
示例 6:配合 traceroute 验证路由生效
# 修改路由后,验证数据包实际走的路由 $ traceroute -n 8.8.8.8 traceroute to 8.8.8.8 (8.8.8.8), 30 hops max 1 192.168.1.1 0.512 ms 2 10.0.0.1 5.234 ms 3 202.96.209.1 12.456 ms ... # 添加一条到 8.8.8.8 的特殊路由(测试用) $ sudo route add -host 8.8.8.8 gw 10.0.0.1 dev eth1 # 走 eth1(备用线路) $ traceroute -n 8.8.8.8 traceroute to 8.8.8.8 (8.8.8.8), 30 hops max 1 10.0.0.1 1.234 ms # ← 走了新路由 2 ... # 测试完删除 $ sudo route del -host 8.8.8.8 gw 10.0.0.1 dev eth1
注意事项
1. 修改路由的影响
错误的 route del default 命令会立即断网(若在 SSH 会话中执行,务必谨慎),强烈建议在 物理机或控制台 上操作,或添加超时机制。
2. route 命令在主流新发行版缺失
RHEL 8+ 和 Ubuntu 18.04+ 默认不安装 net-tools,因此 route 命令会找不到。新编写的脚本直接使用 ip route 即可。如果为了兼容旧系统,可考虑如下简化处理:
command -v route >/dev/null || alias route='ip route' # 简易兼容方案
3. route add 不带 dev 可能选错网卡
当系统有多个网络接口时(例如 eth0 为公网、eth1 为内网),一定要显式添加 dev IFACE,以免系统选错出口。
4. 内核路由缓存已移除
早期内核使用的 route -C(内核缓存)已在 3.6 版本之后被移除,改用 ip route show cache(如果支持)或 ss -r。
5. 路由与策略路由的取舍
对于简单场景,route add 已经足够。但如果涉及多 ISP 出口、内外网隔离、源地址控制等复杂情况,则必须使用 ip rule + ip route table 策略路由。
6. ECMP 负载均衡
route 命令只能逐条添加路由,而 ip route add ... nexthop 才能实现多路径等价负载均衡,示例如下:
ip route add 0.0.0.0/0 nexthop via 192.168.1.1 dev eth0 nexthop via 10.0.0.1 dev eth1
7. 防火墙联动
一个常见的误区:添加了路由,但数据包仍被 iptables -j DROP 拦截。路由只负责“数据包该往哪走”,而防火墙决定“是否允许通行”,排错时这两个方面都需要检查。
总结
route 命令堪称 Linux 网络领域的“历史教科书”。虽然现在不推荐在新场景中使用,但在维护老脚本时,必须能够看懂并临时操作。本节的重点可归纳为以下几点:
- 核心参数:
-n(数字显示,始终添加)、add/del -net/-host、gw、dev。 - 现代替代:
ip route/ip rule,net-tools 已经 deprecated。 - 持久化:临时修改用
route add,永久生效则写入配置文件,例如 RHEL 下的/etc/sysconfig/network-scripts/route-IFACE,或 Ubuntu 18.04+ 下的 Netplan。 - 故障排查:先执行
route -n查看默认网关,再用traceroute验证路径。 - 安全提示:修改默认路由前,务必确认控制台可达,避免 SSH 自己把自己“断网”。
最终建议:新服务器、新脚本统一使用 ip route;如果遇到 route 命令报错 command not found,临时安装 net-tools 包补齐即可。
相关命令
| 命令 | 用途 |
|---|---|
ip route | 现代推荐命令(iproute2) |
ip rule | 策略路由规则(多表) |
ip addr | 管理 IP 地址 |
ip link | 管理网卡链路层 |
ip neigh | ARP/ND 表(替代 arp) |
netstat -rn | 早期路由表查看(也属于 net-tools) |
traceroute | 追踪数据包路径 |
ss -r | 显示路由缓存(推荐使用 ip route get) |
arp / ip neigh | ARP 表管理 |
NetworkManager / nmcli | 高层网络管理 |
