菜鸟科技网

ip route命令如何配置与排查路由问题?

ip route 是什么?

ip routeiproute2 软件包中的一个工具,用于显示和操作 Linux 内核的路由表,路由表是操作系统决定如何转发数据包的“地图”,当数据包需要发送到网络中的另一个地址时,内核会查询这个路由表,以确定下一跳(next-hop)应该发往哪里。

ip route命令如何配置与排查路由问题?-图1
(图片来源网络,侵删)

基本语法

ip route [ add | del | change | replace | show | list ] SELECTOR ROUTE
  • add: 添加一条新的路由规则。
  • del: 删除一条已存在的路由规则。
  • change: 修改一条已存在的路由规则(目标网络必须完全匹配)。
  • replace: 替换或添加一条路由规则,如果规则已存在则替换,不存在则添加。
  • showlist: 显示当前的路由表(默认操作,不指定时执行此命令)。
  • SELECTOR: 用于筛选要显示、删除或修改的路由规则(to 192.168.1.0/24)。
  • ROUTE: 要添加、删除或修改的路由规则本身。

核心概念:路由的组成部分

在深入命令之前,必须理解路由条目中的几个关键字段:

  1. 目标网络 (DESTINATION): 你想要到达的网络地址,格式通常是 IP_ADDRESS/PREFIX_LENGTH (168.1.0/24),这表示一个子网。
  2. 源地址 (src): 可选,从本机发出的数据包,如果匹配此路由,将使用指定的源 IP 地址。
  3. 网关 (viagw): 可选,数据包的下一跳地址,如果目标地址不在本地网络,数据包将被发送到这个网关地址,网关本身必须是可达的(通常通过直连网络)。
  4. 输出接口 (dev): 可选,数据包应该从哪个网络接口(网卡)发出,这通常用于直连网络。
  5. 跃点数 (metric): 可选,路由的成本值,值越小,路由优先级越高,当存在到达同一目标的多条路由时,内核会选择 metric 值最小的那条。
  6. 路由类型 (TYPE): 可选,指定路由的类型,如 unicast (单播,默认)、broadcast (广播)、local (本地)、unreachable (不可达) 等。

常用命令示例

显示路由表

这是最常见的用法,不加任何参数即可。

ip route
# 或者
ip route show

输出示例解析:

default via 192.168.1.1 dev eth0 proto dhcp metric 100 
192.168.1.0/24 dev eth0 proto kernel scope link src 192.168.1.100 
169.254.0.0/16 dev eth0 scope link 
  • default via 192.168.1.1 dev eth0 proto dhcp metric 100:

    ip route命令如何配置与排查路由问题?-图2
    (图片来源网络,侵删)
    • 目标: default (默认路由,0.0.0/0),表示所有未知流量。
    • 网关: via 192.168.1.1
    • 接口: dev eth0
    • 协议: proto dhcp,表示由 DHCP 客户端自动配置。
    • 跃点数: metric 100
  • 168.1.0/24 dev eth0 proto kernel scope link src 192.168.1.100:

    • 目标: 168.1.0/24,直连的局域网。
    • 接口: dev eth0
    • 协议: proto kernel,由内核自动管理。
    • 作用域: scope link,表示此路由仅在直连的链路(网络)上有效。
    • 源地址: src 192.168.1.100
  • 254.0.0/16 dev eth0 scope link:

    • 这是 链路本地地址 (Link-Local),当你的机器无法通过 DHCP 获取 IP 地址,或者 DHCP 服务器不可用时,系统会自动配置一个 254.x.x 地址,用于与同一局域网内其他同样配置了链路本地地址的机器通信。

添加路由

添加默认路由

# 添加一个默认网关
sudo ip route add default via 192.168.1.254

添加到特定网络的路由

ip route命令如何配置与排查路由问题?-图3
(图片来源网络,侵删)
# 假设你的网络是 192.168.1.0/24,你需要访问另一个子网 10.0.0.0/24
# 该子网的网关是 192.168.1.1
sudo ip route add 10.0.0.0/24 via 192.168.1.1

通过特定接口访问网络

# 假设你有两个网卡 eth0 和 eth1
# eth0 连接 192.168.1.0/24,eth1 连接 10.10.10.0/24
# 你希望所有访问 10.10.10.0/24 的流量都从 eth1 走(即使 eth0 的网关也能到)
# 这种情况通常不需要添加路由,因为直连路由优先级最高。
# 但如果 eth1 的网关是 10.10.10.1,你想让它作为 10.10.10.0/24 的出口:
sudo ip route add 10.10.10.0/24 dev eth1 src 10.10.10.5

添加带有跃点数的路由(策略路由)

# 添加一个备用的默认网关,优先级低于主网关
# metric 值越大,优先级越低
sudo ip route add default via 192.168.1.253 metric 200

删除路由

删除路由的语法与添加类似,只需将 add 换成 del

# 删除默认路由
sudo ip route del default
# 删除到特定网络的路由
sudo ip route del 10.0.0.0/24 via 192.168.1.1
# 删除通过特定接口的路由
sudo ip route del 10.10.10.0/24 dev eth1

修改路由

使用 changereplace

  • change: 要求目标网络精确匹配,如果你想修改的 metricvia,但 todev 不变,change 很安全。
  • replace: 如果规则不存在,就添加它;如果存在,就替换它,可以修改规则的大部分属性。
# 假设存在一条路由: 10.0.0.0/24 via 192.168.1.1
# 现在想把它改成 via 192.168.1.50
sudo ip route change 10.0.0.0/24 via 192.168.1.50
# 使用 replace 实现同样的效果
sudo ip route replace 10.0.0.0/24 via 192.168.1.50

路由策略

ip route 也可以与 ip rule 结合,实现更复杂的策略路由,根据数据包的源地址选择不同的路由。

# 添加一个新的路由表,例如名为 'mytable'
echo "200 mytable" >> /etc/iproute2/rt_tables
# 为 'mytable' 添加一条路由
sudo ip route add 192.168.2.0/24 via 192.168.1.50 table mytable
# 添加一条规则:所有来自 192.168.1.100 的数据包,都使用 'mytable' 进行路由查询
sudo ip rule add from 192.168.1.100 lookup mytable

永久配置 vs. 临时配置

使用 ip route 命令添加的路由在重启系统或重启网络服务后会丢失,要实现永久配置,你需要修改相应的网络配置文件。

基于发行版的配置文件

  • Ubuntu/Debian (Netplan): 编辑 /etc/netplan/01-netcfg.yaml (或类似文件)。

    network:
      version: 2
      ethernets:
        eth0:
          dhcp4: yes
          # 添加静态路由
          routes:
            - to: 10.0.0.0/24
              via: 192.168.1.1
              metric: 101

    然后应用配置:sudo netplan apply

  • Ubuntu/Debian (ifupdown): 编辑 /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 ip route add 10.0.0.0/24 via 192.168.1.1
  • CentOS/RHEL/Fedora (NetworkManager / ifcfg): 编辑网卡配置文件,/etc/sysconfig/network-scripts/ifcfg-eth0

    DEVICE=eth0
    BOOTPROTO=static
    IPADDR=192.168.1.100
    NETMASK=255.255.255.0
    GATEWAY=192.168.1.1
    # 添加静态路由
    IPV4_ROUTE0="10.0.0.0/24 via 192.168.1.1"

    然后重启网络服务:sudo systemctl restart network

  • Systemd-networkd: 编辑 /etc/systemd/network/eth0.network

    [Match]
    Name=eth0
    [Network]
    Address=192.168.1.100/24
    Gateway=192.168.1.1
    # 添加路由
    Route=10.0.0.0/24 via 192.168.1.1

    然后重启 systemd-networkd 服务。


总结与排错技巧

  • 查看路由表: ip route 是排错网络连通性的第一步,使用 pingtraceroute/traceroute6 结合 ip route 的输出来判断数据包的走向。
  • traceroute 的妙用: traceroute 会显示数据包经过的每一跳,如果某一跳之后就断了,很可能是那个路由器之后的路由配置有问题,或者目标网络不可达。
  • 优先级: 路由的匹配顺序是:
    1. 主机路由 (/32/128):最精确,优先级最高。
    2. 网络路由 (/24, /16 等)。
    3. 默认路由 (0.0.0/0):最后的选择。
  • 跃点数 (metric): 在有多个网关或多个路径到达同一目标时,metric 决定了最佳路径,手动配置时,注意不要轻易设置比默认路由更小的 metric,否则可能导致默认路由失效。
  • arp -a: 如果网关地址配置错误,数据包无法送达,可以使用 arp -a 查看本地 ARP 缓存,确认网关的 MAC 地址是否正确。

掌握 ip route 命令是 Linux 系统和网络管理员的必备技能,它能帮助你精确地控制和诊断网络流量。

分享:
扫描分享到社交APP
上一篇
下一篇