游乐游手机版
首页/编程语言/文章详情

Linux route命令详解:查看与修改IP路由表

时间:2026-07-15 18:52
route命令源自net-tools工具包,用于查看和修改Linux内核IP路由表,但自2009年起已废弃,现代推荐使用iproute命令。由于历史惯性,route仍在生产环境大量存在,且仅能操作main表,需注意新发行版默认未安装。

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

Linux使用-route命令查看/修改IP路由表

需要注意的是,在 RHEL 8、CentOS 8 以及 Ubuntu 18.04 及以上版本中,net-tools 默认并未安装。如需使用,需要手动执行 yum install net-toolsapt install net-tools 命令进行安装。

简介

项目说明
命令全称route(已弃用)
所属包net-tools(RHEL/CentOS 默认 / Ubuntu 新版需手动安装)
现代替代ip routeiproute2 套件)
配置文件

/etc/sysconfig/network-scripts/route-IFACE(RHEL 系列)

/etc/network/interfaces(Debian 系列)

/etc/iproute2/rt_tables(策略路由表定义)

操作对象Linux 内核的 路由表(Routing Table)
默认行为显示路由表(route 相当于 route -nnetstat -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 MTCP MSS 限制
window WTCP 窗口大小(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.1
  • 10.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 Ulink-local 地址(DHCP 失败时自动分配)

一个小技巧:如果不加 -nroute 会尝试对 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/-hostgwdev
  • 现代替代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 neighARP/ND 表(替代 arp)
netstat -rn早期路由表查看(也属于 net-tools)
traceroute追踪数据包路径
ss -r显示路由缓存(推荐使用 ip route get
arp / ip neighARP 表管理
NetworkManager / nmcli高层网络管理
来源:https://www.jb51.net/jiaoben/367268xvj.htm
上一篇Python部署Scikit-learn模型为FastAPI微服务
本站内容用于信息整理与展示,如有侵权或内容问题请及时联系处理。

相关推荐

补充同频道和同主题内容,方便继续浏览更多相关内容。

同类最新

继续查看同栏目最近更新的文章。

更多
Python部署Scikit-learn模型为FastAPI微服务
编程语言 · 2026-07-15

Python部署Scikit-learn模型为FastAPI微服务

部署Scikit-learn模型为FastAPI微服务时,需用joblib加载模型,请求体应为二维数组,并添加输入校验(类型转换、维度检查、NaN过滤),生产环境使用uvicorn多worker启动,配合错误处理与日志记录,确保服务稳定高效。

CentOS系统中实现Golang日志自动轮转的配置方法
编程语言 · 2026-07-15

CentOS系统中实现Golang日志自动轮转的配置方法

在CentOS上使用logrotate管理Golang应用日志轮转:安装后编写配置文件,设置每天轮转、保留7份、压缩、不处理空日志,创建新日志权限640;手动测试配置无误后通过cron每日自动执行,实现日志按天切分、压缩与清理。

如何高效解决SQL中IN子句超过1000个元素的限制
编程语言 · 2026-07-15

如何高效解决SQL中IN子句超过1000个元素的限制

针对Oracle等数据库IN子句1000项上限,可通过子查询、分批执行、EXISTS关联子查询等方案突破限制,兼顾查询性能与可维护性,避免字符串拼接反模式,同时提升SQL灵活性与数据库兼容性。

CentOS Java日志记录速度优化与性能提升指南
编程语言 · 2026-07-15

CentOS Java日志记录速度优化与性能提升指南

在CentOS环境下优化Java日志记录速度,需采用Log4j2异步日志解耦业务线程,生产环境日志级别设为WARN或ERROR,配合日志轮转与SSD存储;调整缓冲区大小、简化格式化、优化JVM堆与GC策略,并利用无锁设计避免锁竞争。通过监控工具定位瓶颈,分布式系统可引入集中式日志收集。