linux shell

关注公众号 jb51net

关闭
首页 > 脚本专栏 > linux shell > Linux -route查看/修改IP路由表

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

作者:RisunJan

还在用route命令管理Linux路由,本文详细解析route的用法、参数及实战示例,教你查看路由表、添加删除静态路由,并对比现代替代ip route,无论维护老脚本还是学习网络基础,都能帮你快速掌握,避免踩坑,需要的朋友可以参考下

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-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 -n 配合 netstat -rn
权限查看普通用户即可,修改需 root

为什么会有多个路由表?

Linux 内核支持 多路由表(默认 0~255 共 256 张),由 /etc/iproute2/rt_tables 定义。默认有:

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 = 默认路由(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出口网卡实际数据包走哪张网卡

示例路由解析

小技巧:如果不加 -nroute 会尝试 DNS 反查 Gateway 字段,在网络隔离环境会卡顿数秒。永远记得加 -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
性能解析慢、需重启 net实时生效,异步更新
推荐仅作兼容生产首选

示例 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-toolsroute 命令找不到。新脚本直接用 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 网络的"历史教科书",虽然不再推荐新写,但维护老脚本时必须会看、能临时操作。本节重点:

最终建议新服务器、新脚本统一使用 ip route;遇到 route 命令报错 command not found 时,yum install net-toolsapt install 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高层网络管理

以上就是Linux使用-route命令查看/修改IP路由表的详细内容,更多关于Linux -route查看/修改IP路由表的资料请关注脚本之家其它相关文章!

您可能感兴趣的文章:
阅读全文