Linux命令-route(查看/修改 IP 路由表)
-
- [🔰 简介](#🔰 简介)
- [📖 语法](#📖 语法)
- [⚙️ 选项](#⚙️ 选项)
- [💡 实战示例](#💡 实战示例)
-
- [示例 1:route -n 查看路由表(最常用)](#示例 1:route -n 查看路由表(最常用))
- [示例 2:添加与删除路由](#示例 2:添加与删除路由)
- [示例 3:route 与 ip route 对比](#示例 3:route 与 ip route 对比)
- [示例 4:持久化路由配置](#示例 4:持久化路由配置)
- [示例 5:诊断网络不可达(实战案例)](#示例 5:诊断网络不可达(实战案例))
- [示例 6:配合 traceroute 验证路由生效](#示例 6:配合 traceroute 验证路由生效)
- [⚠️ 注意事项](#⚠️ 注意事项)
- [📝 总结](#📝 总结)
- [📚 相关命令](#📚 相关命令)
快速参考 route 命令用于查看与操作 Linux 内核的 IP 路由表 。它起源于 BSD 系统,在 net-tools 工具包中,是 Linux 早期管理网络路由的事实标准。但 从 2009 年起,net-tools 被标记为 deprecated,官方推荐使用 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 套件) |
| 配置文件 | /etc/sysconfig/network-scripts/route-IFACE(RHEL) /etc/network/interfaces(Debian) /etc/iproute2/rt_tables(策略路由表定义) |
| 操作对象 | 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。
📖 语法
bash
# 查看路由表
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 查看路由表(最常用)
bash
# 显示路由表(数字形式,不解析 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 = 默认路由(catch-all) |
Gateway |
下一跳网关 | 0.0.0.0 = 直连(不需要网关) |
Genmask |
子网掩码 | 0.0.0.0 用于默认路由 |
Flags |
标志位 | U(up启用) 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会尝试 DNS 反查Gateway字段,在网络隔离环境会卡顿数秒。永远记得加-n。
示例 2:添加与删除路由
bash
# ========== 添加主机路由(单 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 对比
bash
# 同一个操作,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 |
| 性能 | 解析慢、需重启 net | 实时生效,异步更新 |
| 推荐 | 仅作兼容 | 生产首选 |
示例 4:持久化路由配置
重要:
route add是临时修改,重启网络或系统后会丢失。生产环境必须持久化。
方法 1:RHEL/CentOS - /etc/sysconfig/network-scripts/route-IFACE
bash
# 文件名必须与网卡名对应: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
bash
# 旧版 /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+ 推荐)
yaml
# /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 命令行
bash
# 添加永久路由(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:诊断网络不可达(实战案例)
bash
# 问题:能 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 验证路由生效
bash
# 修改路由后,验证包实际走的路径
$ 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,如需兼容旧系统:
bashcommand -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才能做多路径等价负载:
baship 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,永久写/etc/sysconfig/network-scripts/route-IFACE(RHEL)或 Netplan(Ubuntu 18.04+) - 故障排查 :先
route -n看默认网关,再traceroute验证路径 - 安全提示 :修改默认路由前确认控制台可达,别让 SSH 自杀
最终建议 :新服务器、新脚本统一使用
ip route;遇到route命令报错command not found时,yum install net-tools或apt install 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 |
高层网络管理 |