linux route命令

简介:route命令用于显示和操作内核IP路由表。它可以查看当前系统的路由配置、添加/删除静态路由、设置默认网关等,是网络配置和故障排查的重要工具。
路由表基本概念

路由表是存储在网络设备(包括计算机)中的一张表,用于决定数据包如何转发。路由表包含以下关键信息:

  • 目标网络:数据包要到达的网络地址
  • 网关:下一跳的IP地址
  • 子网掩码:目标网络的掩码
  • 接口:发送数据包的网络接口
  • 度量值:路由的优先级(越小越优先)
  • 路由类型:U(可用)、G(网关)、H(主机)等
  • 路由来源:静态配置或动态学习
  • 老化时间:动态路由的存活时间

语法格式

route [选项] [命令] [参数]

常用选项和命令

选项/命令 说明
-n 以数字形式显示地址(不进行DNS解析)
-v 详细模式,显示更多信息
-e 以netstat格式显示路由表
-C 显示路由缓存
-F 显示内核FIB路由表(转发信息库)
add 添加路由条目
del 删除路由条目
show 显示路由表(默认)
flush 清除所有路由表
-h 显示帮助信息
-V 显示版本信息

路由表标志说明

标志 含义 说明
U (Up) 路由可用 该路由条目是活动的
G (Gateway) 网关路由 需要经过网关转发
H (Host) 主机路由 目标是一个主机而不是网络
R (Reinstate) 恢复路由 动态路由恢复的标志
D (Dynamic) 动态路由 通过路由守护进程动态学习
M (Modified) 修改路由 由路由守护进程或ICMP重定向修改
A (Installed by addrconf) 地址配置 由IPv6地址配置安装
C (Cache entry) 缓存条目 路由缓存条目
! (Reject route) 拒绝路由 丢弃匹配的数据包

使用示例

示例1:查看路由表
# 显示完整的路由表
route

# 以数字形式显示(不解析主机名)
route -n

# 以netstat格式显示
route -e

# 显示详细路由信息
route -v
# 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
172.17.0.0      0.0.0.0         255.255.0.0     U     0      0        0 docker0
示例2:添加路由条目
# 添加默认网关(需要root权限)
sudo route add default gw 192.168.1.1

# 指定网关和网络接口
sudo route add default gw 192.168.1.1 eth0

# 添加网络路由
sudo route add -net 10.0.0.0 netmask 255.0.0.0 gw 192.168.1.1

# 添加主机路由(到特定主机的路由)
sudo route add -host 203.0.113.5 gw 192.168.1.1

# 添加网络路由并指定度量值(优先级)
sudo route add -net 172.16.0.0/16 gw 192.168.1.1 metric 100
注意:通过route命令添加的路由在重启后会丢失,永久配置需要写入配置文件。
示例3:删除路由条目
# 删除默认网关
sudo route del default

# 删除特定网络路由
sudo route del -net 10.0.0.0 netmask 255.0.0.0

# 删除主机路由
sudo route del -host 203.0.113.5

# 删除指定网关的路由
sudo route del default gw 192.168.1.1

# 清除所有路由表(危险!)
sudo route flush
警告:route flush会删除所有路由,可能导致网络连接中断!仅在了解后果的情况下使用。
示例4:特殊路由配置
# 添加拒绝路由(丢弃到特定网络的数据包)
sudo route add -net 192.168.2.0 netmask 255.255.255.0 reject

# 添加黑洞路由(静默丢弃数据包)
sudo route add -net 192.168.3.0 netmask 255.255.255.0 blackhole

# 添加本地网络路由
sudo route add -net 192.168.1.0 netmask 255.255.255.0 dev eth0

# 添加多路径路由
sudo route add default scope global nexthop via 192.168.1.1 dev eth0 weight 1 \
                               nexthop via 192.168.2.1 dev eth1 weight 2
示例5:路由表输出详解
$ 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
172.17.0.0      0.0.0.0         255.255.0.0     U     0      0        0 docker0
169.254.0.0     0.0.0.0         255.255.0.0     U     1000   0        0 eth0
字段说明:
字段 说明 示例
Destination 目标网络或主机 0.0.0.0(默认路由)
Gateway 网关地址(0.0.0.0表示直连) 192.168.1.1
Genmask 网络掩码 255.255.255.0
Flags 路由标志(U=可用,G=网关等) UG(可用网关路由)
Metric 路由度量值(越小优先级越高) 100
Ref 路由引用计数 0
Use 路由查找次数 0
Iface 网络接口 eth0

实战应用场景

场景1:多网卡路由配置
服务器配置双网卡,实现网络分流:
#!/bin/bash
# multi_nic_routing.sh

# eth0: 192.168.1.100/24,用于管理流量
# eth1: 10.0.0.100/24,用于业务流量

# 添加默认网关(管理网络)
sudo route add default gw 192.168.1.1 eth0

# 添加特定业务网络路由
sudo route add -net 10.0.0.0 netmask 255.255.255.0 dev eth1

# 添加数据中心路由(通过业务网络)
sudo route add -net 172.16.0.0/12 gw 10.0.0.1 eth1

# 查看路由表
echo "=== 当前路由表 ==="
route -n

# 测试路由策略
echo ""
echo "=== 路由策略测试 ==="
echo "到互联网的流量走 eth0 (192.168.1.1)"
echo "到数据中心的流量走 eth1 (10.0.0.1)"
场景2:VPN路由配置
配置VPN客户端,实现分流路由:
#!/bin/bash
# vpn_routing.sh

VPN_GATEWAY="10.8.0.1"
VPN_INTERFACE="tun0"
LOCAL_GATEWAY="192.168.1.1"

echo "配置VPN路由..."

# 添加默认路由到VPN(将所有流量通过VPN)
# sudo route add default gw $VPN_GATEWAY $VPN_INTERFACE

# 更常见的:只将特定流量通过VPN(分流路由)
# 保留本地网络的直接路由
sudo route add -net 192.168.1.0 netmask 255.255.255.0 dev eth0

# 添加公司内网路由通过VPN
sudo route add -net 10.0.0.0 netmask 255.255.0.0 gw $VPN_GATEWAY $VPN_INTERFACE
sudo route add -net 172.16.0.0 netmask 255.240.0.0 gw $VPN_GATEWAY $VPN_INTERFACE

# 其他所有流量走本地网关
sudo route add default gw $LOCAL_GATEWAY eth0

echo "路由配置完成:"
echo "- 本地网络 (192.168.1.0/24): 直连"
echo "- 公司内网 (10.0.0.0/16, 172.16.0.0/12): 通过VPN"
echo "- 其他流量: 通过本地网关"
场景3:安全路由配置
配置路由实现网络隔离和安全策略:
#!/bin/bash
# security_routing.sh

echo "配置安全路由策略..."

# 1. 阻止到恶意IP的访问
sudo route add -host 203.0.113.100 reject
sudo route add -net 192.0.2.0 netmask 255.255.255.0 blackhole

# 2. 限制特定网络只能通过指定网关
sudo route add -net 10.10.0.0 netmask 255.255.0.0 gw 192.168.1.254 eth0

# 3. 配置多路径路由(负载均衡和冗余)
# sudo ip route add default scope global \
#     nexthop via 192.168.1.1 dev eth0 weight 1 \
#     nexthop via 192.168.2.1 dev eth1 weight 1

# 4. 添加监控路由
echo "添加路由监控..."
while true; do
    # 检查默认路由是否存在
    if ! route -n | grep -q "^0\.0\.0\.0"; then
        echo "警告:默认路由丢失!尝试恢复..."
        sudo route add default gw 192.168.1.1 eth0
    fi
    sleep 60
done
最佳实践
  • 使用-n选项避免DNS解析延迟
  • 永久路由配置写入网络配置文件
  • 添加路由前检查是否已存在
  • 使用度量值控制路由优先级
  • 定期检查路由表完整性
  • 备份重要路由配置
  • 测试路由变更后的网络连通性
  • 使用脚本自动化路由管理
注意事项
  • route命令已逐渐被ip route取代
  • 临时路由重启后会丢失
  • 错误的网关配置会导致网络中断
  • 多条默认路由可能引起混乱
  • 需要root权限进行修改操作
  • 不同Linux发行版可能有差异
  • 路由缓存可能影响立即生效
  • 避免在生产环境直接测试
永久路由配置方法
方法1:使用network-scripts(RHEL/CentOS 7及以下)
# 在 /etc/sysconfig/network-scripts/route-eth0 中添加:
# 格式1:网络/掩码 via 网关
192.168.2.0/24 via 192.168.1.254
10.0.0.0/8 via 192.168.1.254

# 格式2:网络/掩码 dev 接口
172.16.0.0/16 dev eth1

# 重启网络服务
sudo systemctl restart network
方法2:使用netplan(Ubuntu 18.04+)
# 编辑 /etc/netplan/01-netcfg.yaml
network:
  version: 2
  ethernets:
    eth0:
      addresses: [192.168.1.100/24]
      routes:
        - to: 10.0.0.0/8
          via: 192.168.1.254
        - to: 172.16.0.0/12
          via: 192.168.1.254
      nameservers:
        addresses: [8.8.8.8, 8.8.4.4]

# 应用配置
sudo netplan apply
方法3:使用systemd-networkd(现代Linux)
# 创建 /etc/systemd/network/10-static-route.network
[Match]
Name=eth0

[Route]
Gateway=192.168.1.254
Destination=10.0.0.0/8

[Route]
Gateway=192.168.1.254
Destination=172.16.0.0/12

# 重启服务
sudo systemctl restart systemd-networkd
常见问题解答
Q: route命令和ip route命令有什么区别?

A: 主要区别:

特性 route命令 ip route命令
出现时间 传统工具,来自net-tools 现代工具,来自iproute2
功能范围 基本路由管理 完整路由功能,包括策略路由
输出格式 固定格式,可读性好 更灵活,信息更详细
IPv6支持 有限 完全支持
推荐程度 逐步淘汰 现代Linux系统推荐
Q: 如何永久保存路由配置?

A: 根据发行版选择合适的方法:

# Debian/Ubuntu (旧版) - /etc/network/interfaces
up route add -net 10.0.0.0 netmask 255.0.0.0 gw 192.168.1.254

# 通用方法 - /etc/rc.local
route add -net 10.0.0.0 netmask 255.0.0.0 gw 192.168.1.254

# 使用cron定时任务(@reboot)
@reboot root /sbin/route add -net 10.0.0.0 netmask 255.0.0.0 gw 192.168.1.254
Q: 路由度量值(Metric)有什么作用?

A: 度量值决定路由的优先级,当有多条路由到达同一目标时:

  • 度量值越小,优先级越高
  • 默认路由通常使用100或更小值
  • VPN路由可能使用更大的度量值
  • 可以在多路径路由中实现负载均衡
# 添加低优先级路由(高度量值)
sudo route add -net 10.0.0.0/8 gw 192.168.1.254 metric 200

# 添加高优先级路由(低度量值)
sudo route add -net 172.16.0.0/12 gw 192.168.1.254 metric 50
Q: 如何解决"SIOCADDRT: Network is unreachable"错误?

A: 这个错误通常表示网关不可达,解决方法:

  1. 检查网关IP是否正确
  2. 确认网关与主机在同一网络
  3. 检查网络接口是否已启用
  4. 确认网关设备可以访问
  5. 使用ping 网关IP测试连通性
ip route命令参考

现代Linux推荐使用ip route命令代替route命令:

# 查看路由表
ip route show

# 添加默认网关
sudo ip route add default via 192.168.1.1 dev eth0

# 添加网络路由
sudo ip route add 10.0.0.0/8 via 192.168.1.254 dev eth0

# 添加主机路由
sudo ip route add 203.0.113.5/32 via 192.168.1.254 dev eth0

# 删除路由
sudo ip route del 10.0.0.0/8

# 添加多路径路由
sudo ip route add default \
    nexthop via 192.168.1.1 weight 1 \
    nexthop via 192.168.2.1 weight 1

# 清空路由表
sudo ip route flush all
ip route命令功能更强大,支持更多高级功能如策略路由、多路径路由、路由表管理等。