linux: ip route 与 route 用法详解与对比

发布时间:2023年12月20日


1. 引言

本文主要介绍 ip route 以及 route 的用法和区别。

2. ip route

2.1 描述

用于管理静态路由表。linux 系统中,可以自定义从 1-252个路由表。其中,linux系统维护了4个路由表:

  • 0 表: 系统保留表
  • 253 表: default table 没特别指定的默认路由都放在该表
  • 254 表: main table 没指明路由表的所有路由放在该表
  • 255 表: local table 保存本地接口地址,广播地址、NAT地址 由系统维护,用户不得更改

2.2 语法

ip route help

# 以下是输出:
Usage: ip route { list | flush } SELECTOR
       ip route save SELECTOR
       ip route restore
       ip route showdump
       ip route get [ ROUTE_GET_FLAGS ] ADDRESS
                            [ from ADDRESS iif STRING ]
                            [ oif STRING ] [ tos TOS ]
                            [ mark NUMBER ] [ vrf NAME ]
                            [ uid NUMBER ] [ ipproto PROTOCOL ]
                            [ sport NUMBER ] [ dport NUMBER ]
       ip route { add | del | change | append | replace } ROUTE
SELECTOR := [ root PREFIX ] [ match PREFIX ] [ exact PREFIX ]
            [ table TABLE_ID ] [ vrf NAME ] [ proto RTPROTO ]
            [ type TYPE ] [ scope SCOPE ]
ROUTE := NODE_SPEC [ INFO_SPEC ]
NODE_SPEC := [ TYPE ] PREFIX [ tos TOS ]
             [ table TABLE_ID ] [ proto RTPROTO ]
             [ scope SCOPE ] [ metric METRIC ]
             [ ttl-propagate { enabled | disabled } ]
INFO_SPEC := { NH | nhid ID } OPTIONS FLAGS [ nexthop NH ]...
NH := [ encap ENCAPTYPE ENCAPHDR ] [ via [ FAMILY ] ADDRESS ]
	    [ dev STRING ] [ weight NUMBER ] NHFLAGS
FAMILY := [ inet | inet6 | mpls | bridge | link ]
OPTIONS := FLAGS [ mtu NUMBER ] [ advmss NUMBER ] [ as [ to ] ADDRESS ]
           [ rtt TIME ] [ rttvar TIME ] [ reordering NUMBER ]
           [ window NUMBER ] [ cwnd NUMBER ] [ initcwnd NUMBER ]
           [ ssthresh NUMBER ] [ realms REALM ] [ src ADDRESS ]
           [ rto_min TIME ] [ hoplimit NUMBER ] [ initrwnd NUMBER ]
           [ features FEATURES ] [ quickack BOOL ] [ congctl NAME ]
           [ pref PREF ] [ expires TIME ] [ fastopen_no_cookie BOOL ]
TYPE := { unicast | local | broadcast | multicast | throw |
          unreachable | prohibit | blackhole | nat }
TABLE_ID := [ local | main | default | all | NUMBER ]
SCOPE := [ host | link | global | NUMBER ]
NHFLAGS := [ onlink | pervasive ]
RTPROTO := [ kernel | boot | static | NUMBER ]
PREF := [ low | medium | high ]
TIME := NUMBER[s|ms]
BOOL := [1|0]
FEATURES := ecn
ENCAPTYPE := [ mpls | ip | ip6 | seg6 | seg6local | rpl ]
ENCAPHDR := [ MPLSLABEL | SEG6HDR ]
SEG6HDR := [ mode SEGMODE ] segs ADDR1,ADDRi,ADDRn [hmac HMACKEYID] [cleanup]
SEGMODE := [ encap | inline ]
ROUTE_GET_FLAGS := [ fibmatch ]
# 操作 Linux 系统中路由表的命令。
# 具体来说,这个命令可以列出或清除符合特定条件的路由。
# SELECTOR 可以是一个具体的 IP 地址、一个 IP 地址范围,或者一个特定的网络接口。
# list:列出符合 SELECTOR 条件的路由。
# flush:清除符合 SELECTOR 条件的路由。
ip route { list | flush } SELECTOR

SELECTOR := [ root PREFIX ] [ match PREFIX ] [ exact PREFIX ]
            [ table TABLE_ID ] [ proto RTPROTO ]
            [ type TYPE ] [ scope SCOPE ]
# 用于从先前保存的路由表中恢复原有的路由表。
# 请注意,该命令需要读取用 ip route save 保存的数据流。
ip route restore
# 将当前符合 SELECTOR 条件的路由保存到系统中,以便在将来可以恢复或回滚到这些路由。
ip route save SELECTOR
# 用于显示路由表中的路由记录。帮助查看路由表中存储的路由信息,包括目标地址、网关、接口等
ip route showdump
# 用于获取特定 IP 地址的路由信息。这个命令可以帮助了解从当前主机到指定 IP 地址的数据包路由路径。
ip route get ADDRESS [ from ADDRESS iif STRING ]
                    [ oif STRING ]  [ tos TOS ]
                    [ mark NUMBER ]
可选的 option:
- to ADDRESS (default):目的地址
- from ADDRESS:源地址
- tos TOS:服务类型
- iif NAME:此数据包预期从中到达的设备
- oif NAME:强制将此数据包路由到的输出设备
- connected:如果未给出源地址(选项from),则重新查找源设置为从第一次查找收到的首选地址的路由。 如果使用策略路由,则可能是其他路由
# 常用命令
ip route delete # 删除路由
ip route flush  # 清空路由表或删除特定目标的路由

ip route add/change/replace
可选的 option:
- to TYPE PREFIX (default):路由的目标前缀。如果省略TYPE,则ip采用unicast类型。上面列出了其他类型的值。前缀是一个IP或IPv6地址,后跟斜杠和前缀长度。如果前缀的长度丢失,ip将采用全长主机路由。还有一个特殊的前缀默认值-相当于IP 0/0或IPv6::/0。
- tos TOS:服务类型(TOS)密钥。这个密钥没有相关的掩码,最长的匹配被理解为:首先,比较路由和包的TOS。如果它们不相等,则分组仍然可以匹配具有零TOS的路由。TOS是8位十六进制数或/etc/iproute2/rt_dsfield中的标识符。
- metric :跳数,该条路由记录的质量,一般情况下,如果有多条到达相同目的地的路由记录,路由器会采用metric值小的那条路由
- table TABLEID:要将此路由添加到的表。TABLEID可以是文件/etc/iproute2/rt_tables中的数字或字符串。如果省略此参数,ip将采用主表,但本地、广播和nat路由除外,默认情况下,这些路由将放入本地表中
- dev NAME:输出设备名称
- via ADDRESS:下一跳路由器的地址。 实际上,此字段的含义取决于路由类型。 对于普通的单播路由,它要么是真正的下一跳路由器,要么是以BSD兼容模式安装的直接路由,它可以是接口的本地地址。 对于NAT路由,它是已转换IP目标块的第一个地址
- src ADDRESS:发送到路由前缀所覆盖的目的地时首选的源地址
- realm REALMID:此路由被分配到的领域。REALMID可以是/etc/iproute2/rt_realms文件中的数字或字符串。
- mtu MTU/mtu lock MTU:到达目的地的路径上的MTU。 如果未使用修饰符锁定,则由于路径MTU发现,内核可能会更新MTU。 如果使用了修饰符锁定,则将不尝试任何路径MTU发现,在IPv4情况下,所有数据包将在没有DF位的情况下发送,或者将其分片到IPv6的MTU
- window NUMBER:TCP播发到这些目的地的最大窗口,以字节为单位。它限制了允许TCP对等方发送给我们的最大数据突发
- rtt TIME:初始RTT(“往返时间”)估算值。 如果未指定后缀,则这些单位是直接传递到路由代码的原始值,以保持与先前版本的兼容性。 否则,如果使用后缀s,sec或secs来指定秒数,而使用ms,msec或msecs的后缀来指定毫秒。
- rttvar TIME (2.3.15+ only):初始RTT方差估算值。 与上面的rtt一样指定值
- rto_min TIME (2.6.23+ only):与此目标通信时要使用的最小TCP重新传输超时。值的指定与上面的rtt相同
- ssthresh NUMBER (2.3.15+ only):初始慢启动阈值的估计值
- cwnd NUMBER (2.3.15+ only):锁定标志,如果不使用锁定标志,则忽略该选项
- initcwnd NUMBER (2.5.70+ only):到此目标的连接的初始拥塞窗口大小。 实际窗口大小是该值乘以相同连接的MSS(``最大段大小'')。 默认值为零,表示使用RFC2414中指定的值。
- initrwnd NUMBER (2.6.33+ only):到此目标的连接的初始接收窗口大小。 实际窗口大小是此值乘以连接的MSS。 默认值为零,表示使用慢启动值。
- features FEATURES (3.18+only):启用或禁用每路由功能。此时唯一可用的特性是ecn,它可以在启动到给定目标网络的连接时启用显式拥塞通知。当响应来自给定网络的连接请求时,即使net.ipv4.tcp_ecn sysctl设置为0
- congctl NAME/congctl lock NAME (3.20+ only):仅针对给定的目的地设置特定的TCP拥塞控制算法。 如果未指定,Linux将保留当前的全局默认TCP拥塞控制算法或应用程序中的一种。 如果未使用修饰符锁定,则应用程序仍可能会覆盖该目的地的建议拥塞控制算法。 如果使用了修饰符锁,则不允许应用程序覆盖该目的地的指定拥塞控制算法,因此将强制/保证使用建议的算法
- advmss NUMBER (2.3.15+ only):在建立TCP连接时向这些目标播发的MSS(“最大段大小”)。如果没有给定,Linux将使用从第一跳设备MTU计算的默认值
- reordering NUMBER (2.3.15+ only):到此目的地的路径上的最大重新排序。 如果未给出,则Linux使用通过sysctl变量net/ipv4/tcp_reordering选择的值
- nexthop NEXTHOP:多路径路由的下一跳。 NEXTHOP是一个复杂值,其语法类似于顶级参数列表:
	- via ADDRESS:下一跳路由
	- dev NAME:输出设备名称
	- weight NUMBER:是多路径路由的此元素的权重,反映其相对带宽或质量
- scope SCOPE_VAL:路由前缀所覆盖的目的地范围。 SCOPE_VAL可以是数字/etc/iproute2/rt_scopes中的字符串。 如果省略此参数,则ip假定所有网关单播路由的作用域是全局范围,直接单播和广播路由的作用域链接以及本地路由的作用域主机
- protocol RTPROTO:该路由的路由协议标识符。 RTPROTO可以是文件/ etc / iproute2 / rt_protos中的数字或字符串。如果未提供路由协议ID,则ip会采用协议引导方式(即假定路由是由不了解自己在做什么的人添加的)。 几个协议值具有固定的解释。
	- redirect: 路由是由于ICMP重定向而安装的
	- kernel:路由是在自动配置期间由内核安装的
	- boot:路由是在启动过程中安装的。如果路由守护进程启动,它将清除所有这些守护进程
	- static:该路由由管理员安装,以覆盖动态路由。 路由守护程序将尊重它们,甚至可能将它们通告给其对等端。
	- ra:路由是通过路由器发现协议安装的
ip route show # 该命令显示路由表的内容或按某些条件选择的路由

可选的 option:
- to SELECTOR (default):仅从给定的目的地范围内选择路线。 SELECTOR由一个可选的修饰符(root 、match、exact)和一个前缀组成。 root PREFIX选择前缀不小于PREFIX的路由。 F.e. 根0/0选择整个路由表。 match PREFIX选择前缀不超过PREFIX的路由。 比如: 匹配10.0/16选择10.0/16、10/8和0/0,但不选择10.1/16和10.0.0/24。 精确的PREFIX(或仅PREFIX)选择具有此精确前缀的路由。 如果这两个选项都不存在,则ip假定根目录为0/0,即列出整个表。
- tos TOS:仅选择具有给定TOS的路线
- table TABLEID:显示此表中的路由。默认设置是显示主表。TABLEID可以是实表的ID,也可以是特殊值之一:
	- all:列出所有表
	- cache:转储路由缓存
- cloned:缓存列表克隆的路由,即由于某些路由属性(例如MTU)已更新而从其他路由动态分叉的路由。 实际上,它等效于表缓存。
- from SELECTOR:与to的语法相同,但它绑定的是源地址范围而不是目的地。请注意,from选项仅适用于克隆路由
- protocol RTPROTO:只列出该协议的路由
- scope SCOPE_VAL:仅列出具有此范围的路由
- type TYPE:仅列出该类型的路由
- dev NAME:仅列出通过此设备的路由
- via PREFIX:仅列出通过前缀选择的nexthop路由器的路由
- src PREFIX:仅列出具有按前缀选择的首选源地址的路由
- realms FROMREALM/TOREALM/REALMID:仅列出具有这些领域的路由。

2.3 参数

# 一些用到的参数解释
SELECTOR := [ root PREFIX ] [ match PREFIX ] [ exact PREFIX ]
            [ table TABLE_ID ] [ proto RTPROTO ]
            [ type TYPE ] [ scope SCOPE ]
ROUTE := NODE_SPEC [ INFO_SPEC ]
NODE_SPEC := [ TYPE ] PREFIX [ tos TOS ]
             [ table TABLE_ID ] [ proto RTPROTO ]
             [ scope SCOPE ] [ metric METRIC ]
INFO_SPEC := NH OPTIONS FLAGS [ nexthop NH ]...
NH := [ via ADDRESS ] [ dev STRING ] [ weight NUMBER ] NHFLAGS
OPTIONS := FLAGS [ mtu NUMBER ] [ advmss NUMBER ]
           [ rtt TIME ] [ rttvar TIME ] [reordering NUMBER ]
           [ window NUMBER ] [ cwnd NUMBER ] [ initcwnd NUMBER ]
           [ ssthresh NUMBER ] [ realms REALM ] [ src ADDRESS ]
           [ rto_min TIME ] [ hoplimit NUMBER ] [ initrwnd NUMBER ]
           [ features FEATURES ] [ quickack BOOL ] [ congctl NAME ]
           [ expires TIME ]
TYPE := { unicast | local | broadcast | multicast | throw |
          unreachable | prohibit | blackhole | nat }
TABLE_ID := [ local | main | default | all | NUMBER ]
SCOPE := [ host | link | global | NUMBER ]
NHFLAGS := [ onlink | pervasive ]
RTPROTO := [ kernel | boot | static | NUMBER ]
TIME := NUMBER[s|ms]
BOOL := [1|0]
FEATURES := ecn
Route TYPE 类型及解释:
unicast:描述了由路由前缀覆盖的目标的真实路径。
unreachable:这些目标不可达。丢弃数据包并生成ICMP消息“主机不可达”。本地发送者收到“EHOSTUNREACH”错误。
blackhole:这些目标不可达。静默地丢弃数据包。本地发送者收到“EINVAL”错误。
prohibit:这些目标不可达。丢弃数据包并生成管理上禁止的ICMP消息“通信被禁止”。本地发送者收到“EACCES”错误。
local:目标被分配给此主机。数据包被环回并在本地传递。
broadcast:目标是一个广播地址。数据包作为链接广播发送。
throw:与策略规则一起使用的特殊控制路由。如果选择了这种路由,则会在未找到路由的情况下终止此表中的查找。没有策略路由时,相当于路由表中没有路由。丢弃数据包并生成ICMP消息“net unreachable”。本地发送者收到“ENETUNREACH”错误。
NAT:一个特殊的NAT路由。前缀所覆盖的目标被认为是虚拟(或外部)地址,在转发之前需要将其转换为真实(或内部)地址。使用属性via选择要转换的地址。但请注意,Linux 2.6版本不再支持Route NAT。
anycast:这种路由类型尚未实现。目标是被分配给此主机的任播地址。主要等效于本地,但有一个区别:当用作任何数据包的源地址时,这些地址是无效的。
multicast:该路由类型是用于多播路由的特殊类型。

2.4 例子

  1. 查询路由
# 以下三种显示系统路由
ip r
ip route
ip route show
ip route list	 	

在这里插入图片描述

# 精准匹配某一条路由,ip 是目的地址
ip route show 172.17.0.0/16
# 模糊匹配某一条路由,ip 是目的地址	
ip route show match 192.168											

在这里插入图片描述
在这里插入图片描述

# 查询经由网卡 ens33 的路由
ip route show dev ens33
# 查询源地址为 192.168.127.128 的路由
ip route show src 192.168.127.128
# 查询下一跳为192.168.127.2的路由							
ip route show via 192.168.127.2
# 查看本地路由表						
ip route show table local
ip route list table local

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  1. 添加路由
# 在1号表中添加默认路由为192.168.127.1
ip route add default via 192.168.127.1 table 1
# 在1号表中添加目的为192.168.127.0网段的路由为192.168.127.2
ip route add 192.168.127.0/24 via 192.168.127.2 table 1
# 设置系统默认路由	
ip route add default via 192.168.127.1
# 设置目的为192.168.127.0网段的网关为192.168.127.254,通过网卡 eth33 出去
ip route add 192.168.127.0/24 via 192.168.0.254 dev eth33
# 设置默认网关为 192.168.127.254,通过网卡 eth33 出去
ip route add default via 192.168.127.254 dev eth33
# 设置请求的目地192.168.127.130不可达的路由
ip route add prohibit 192.168.127.130
# 设置源IP 192.168.127.129到达192.168.127.130不可达				
ip route add prohibit 192.168.127.130 from 192.168.127.129	
# 更改默认路由。此操作等同于先删除,后新增	
ip route change default via 192.168.127.1 dev eth33
  1. 删除路由
# 删除默认路由
ip route del default
# 删除通往192.168.127.0/24的路由
ip route del 192.168.127.0/24
# 删除经由网卡 ens33 通往192.168.127.0/24的路由
ip route del 192.168.127.0/24 dev eth33
# 清空路由表
ip route flush table main								

3. route

3.1 描述

用于显示和操作IP静态路由表。

直接执行 route 命令来添加路由不会永久保存,当网卡重启或者机器重启之后,该路由就失效了。要想永久保存,可以保存到配置文件。

  1. /etc/sysconfig/static-routes文件为路由固化文件,但是 linux 系统一般不会自动生成,需要手动创建。
  2. 在文件内编辑路由,路由格式是固定的:
    • 添加默认路由:any net 0.0.0.0 netmask 0.0.0.0 gw 10.60.60.1
    • 添加网络路由:any net 1.1.1.0 netmask 255.255.255.0 gw 10.60.60.1

3.2 语法

route -h

# 以下是输出:
Usage: route [-nNvee] [-FC] [<AF>]           List kernel routing tables
       route [-v] [-FC] {add|del|flush} ...  Modify routing table for AF.

       route {-h|--help} [<AF>]              Detailed usage syntax for specified AF.
       route {-V|--version}                  Display version/author and exit.

        -v, --verbose            be verbose
        -n, --numeric            don't resolve names
        -e, --extend             display other/more information
        -F, --fib                display Forwarding Information Base (default)
        -C, --cache              display routing cache instead of FIB

  <AF>=Use -4, -6, '-A <af>' or '--<af>'; default: inet
  List of possible address families (which support routing):
    inet (DARPA Internet) inet6 (IPv6) ax25 (AMPR AX.25)
    netrom (AMPR NET/ROM) ipx (Novell IPX) ddp (Appletalk DDP)
    x25 (CCITT X.25)

3.3 参数

可选 option:
-v:显示详细的处理信息
-A family:用指定的地址族(如inet,inet6)
-n:以数字形式代替解释主机名形式来显示地址
-e:用netstat(8)的格式来显示选路表
-ee:使用更详细的资讯来显示
-net:到一个网络的路由表
-host:到一个主机的路由表
-F:显示内核的FIB选路表。其格式可以用-e 和 -ee选项改变
-C:显示内核的路由缓存
del :删除一条路由
add:添加一条路由
target:指定目标网络或主机。可以用点分十进制形式的IP地址或主机/网络名
netmask Nm:为添加的路由指定网络掩码
gw Gw:为发往目标网络/主机的任何分组指定网关。注意:指定的网关首先必须是可达的。也就是说必须为该网关预先指定一条静态路由。如果你为本地接口之一指定这个网关地址的话,那么此网关地址将用于决定此接口上的分组将如何进行路由
metric M:把选路表中的路由值字段(由选路进程使用)设为M
mss M:把基于此路由之上的连接的TCP最大报文段长度设为M字节。这通常只用于优化选路设置。默认值为536
window W:把基于此路由之上的连接的TCP窗口长度设为W字节。这通常只用于AX.25网络和不能处理背对背形式的帧的设备
irtt I:把基于此路由之上的TCP连接的初始往返时间设为I毫秒(1-12000)。这通常也只用于AX.25网络。如果省略此选项,则使用RFC1122的缺省值300ms
reject:设置一条阻塞路由以使一条路由查找失败。这用于在使用缺省路由前先屏蔽掉一些网络。但这并不起到防火墙的作用
mod, dyn, reinstate:设置一条动态的或更改过的路由。这些标志通常只由选路进程来设置。这只用于诊断目的
dev If:强制使路由与指定的设备关联,因为否则内核会自己来试图检测相应的设备(通常检查已存在的路由和加入路由的设备的规格)。在多数正常的网络上无需使用

3.4 例子

  1. 查询路由
# 以数字形式展现路由表
route -n

在这里插入图片描述

route 输出结果解析:

  • Destination:目标网络或目标主机
  • Gateway:网关地址或 ‘*’ (如未设置)
  • Genmask:目标网络的子网掩码;'255.255.255.255’为主机,'0.0.0.0’为缺省路由
  • Flags:路由标志
    • U (route is up) :路由正常
    • H (target is a host) :主机路由
    • G (use gateway) :使用网关的间接路由
    • R (reinstate route for dynamic routing) :为动态选路恢复路由
    • D (dynamically installed by daemon or redirect) :该路由由选路进程或重定向动态创建
    • M (modified from routing daemon or rederict) :该路由已由选路进程或重定向修改
    • ! (reject route) :阻塞路由
  • Metric:通向目标的距离(通常以跳来计算)
  • Ref:使用此路由的活动进程个数(Linux内核并不使用)
  • Use:查找此路由的次数。根据-F 和 -C的使用,此数值是路由缓存的损失数或采样数
  • Iface:使用此路由发送分组的接口(网卡名字)
  • MSS:基于此路由的TCP连接的缺省最大报文段长度
  • Window:基于此路由的TCP连接的缺省窗口长度
  • irtt:初始往返时间。内核用它来猜测最佳TCP协议参数而无须等待(可能很慢的)应答
  • HH (cached only):为缓存过的路由而访问硬件报头缓存的ARP记录和缓存路由的数量。如果缓存过路由的接口(如lo)无须硬件地址则值为-1
  • Arp (cached only):无论缓存路由所用的硬件地址情况如何都进行更新
  1. 添加路由
# 添加一条默认路由。使用此路由的所有分组将通过网关 default-gw 进行传输。							
route add default gw default-gw
# 添加一条目的网络192.168.127.0/24,经由 ens33 的路由
route add -net 192.168.127.0 netmask 255.255.255.0 dev eth33 	
# 添加到主机192.168.127.128的路由
route add -host 192.168.127.128 gw 192.168.127.1
# 拒绝网络192.168.x.x											
route add 192.168.0.0 netmask 255.255.0.0 reject										
  1. 删除路由
# 删除192.168.127.0的路由								
route del -net 192.168.127.0 netmask 255.255.255.0 dev eth33
# 删除默认路由		
route del default gw 192.168.127.1 eth33	

4. 对比

route 和 ip route的区别:

  1. ip route 支持多种查询显示方式,而 route 命令没有其他的查询显示方式。
  2. ip route add 提供了更多route命令无法实现的选项,如prohibitfromsrc
  3. ip route 功能更加强大,推荐使用。

5. 参考

ip route命令详解
route 命令详解

文章来源:https://blog.csdn.net/qq_36803941/article/details/135044459
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。