手册页部分 1M: 系统管理命令

退出打印视图

更新时间: 2014 年 7 月
 
 

route(1M)

名称

route - 手动处理路由表

用法概要

route [-fnvq] sub-command [ [modifiers] args]
route [-fnvq] [-p [-R root-dir]] add | delete [modifiers] destination gateway 
     [args]
route [-fnvq] change | get [modifiers] destination 
     [gateway [args]]
route [-fn] monitor [modifiers]
route [-fnvq] flush [modifiers]
route -p [-R root-dir] show

描述

route 手动处理网络路由表。正常情况下,这些表由系统路由守护进程(如 in.routed(1M)in.ripngd(1M))维护。

route 支持的常规选项数量有限,但支持丰富的命令语言。用户可以指定任意请求,可以通过 route(7P) 中所讨论的编程接口传递该请求。

route 使用了一个路由套接字和新的消息类型 RTM_ADDRTM_DELETERTM_GETRTM_CHANGE。虽然只有超级用户可以修改路由表,但允许非特权用户执行 RTM_GET 操作。

选项

–f

刷新所有网关条目的路由表。如果将 –f 选项与任何 route 子命令配合使用,route 将先刷新网关,然后再执行子命令。通过以下方式指定要刷新的表:将 inetinet6 修饰符紧跟在 –f 选项之后。如果未指定,则缺省刷新 IPv4 (inet) 路由。

–n

防止在报告操作时尝试以符号方式输出主机和网络名称。此选项在名称服务器不可用时很有用。

–p

更改网络路由表,并且在系统重启后更改仍然有效。该操作先应用于网络路由表,如果应用成功,再应用于与当前活动的网络配置文件(有关网络配置文件的详细信息,请参见 netcfg(1M))关联的已保存路由列表。在确定操作是否成功时,将忽略因为添加已存在路由或者删除不在路由表中的路由而失败的操作。在持久路由中使用主机或网络名称时应特别小心,因为在启动过程中添加路由时,基于网络的名称解析服务不可用。

–q

抑制所有输出。

–R root-dir

指定 route 要在其中应用更改的备用根目录。该选项仅与 –p 选项一起使用,否则将被忽略。如果指定了 –R,路由更改将仅应用于在启动时使用的已保存路由列表,而应用于网络路由表。此外,还将跳过某些检查,例如是否存在与 –ifp 一起使用的网络接口。在要修改的系统根目录所在的位置不是 / 的情况下,可从 JumpStart 脚本内部使用此选项。

–v

以详细模式输出其他详细信息。

子命令

支持以下子命令:

add

添加路由。

change

更改路由的各个方面(如路由的网关)。

delete

删除特定路由。

flush

删除路由表中的所有网关条目。

get

查找并显示到某个目标的路由。

monitor

连续报告对路由信息库、路由查找未命中次数或可疑网络分区的任何更改。

show

显示要在系统启动时应用的路由列表。只能与 –p 选项配合使用。

adddelete 子命令使用以下语法:


route [ -fnvq ] cmd destination gateway [metric/netmask]

其中 cmdadddeletedestination 是目标主机或网络,gateway 是应通过其路由包的下一中继站。“操作数”部分中所述的修饰符可以放在命令行上的任何位置。

getchange 子命令使用以下语法:


route [ -fnvq ] cmd destination [gateway [metric/netmask]]

其中 cmdgetchangedestination 是目标主机或网络,gateway 是应通过其路由包的下一中继站。“操作数”部分中所述的修饰符可以放在命令行上的任何位置。

monitor 子命令使用以下语法:


route monitor [ -inet | -inet6 ]

操作数

route 针对通过网关到达目标的路由执行其子命令。

目标和网关

缺省情况下,目标和网关地址将被解释为 IPv4 地址。首先会使用 getipnodebyname(3SOCKET) 尝试将所有符号名称作为主机名称。对于 AF_INET,如果此查找失败,getnetbyname(3SOCKET) 会将名称解释为网络名称。

可以在地址因 route 子命令而改变其解释方式之前,在命令行上加入一个可选修饰符。

支持以下修饰符:

–inet

强制将地址解释为 IPv4 地址,即属于 AF_INET 地址族。

–inet6

强制将地址解释为 IPv6 地址,即属于 AF_INET6 地址族。

对于 IPv4 地址,缺省情况下,到特定主机的路由与到网络的路由的不同之处在于,前者将指定的 Internet 地址解释为目标。如果目标的本地地址部分(即,非网络掩码部分)为 0;或者,如果目标被解析为网络的符号名称,则假定路由为网络;否则,假定其为到主机的路由。

可以通过使用以下修饰符之一来强制进行此选择:

–host

强制将目标解释为主机。

–net

强制将目标解释为网络。

例如:

目标
目标等效于
128.32
–host 128.0.0.32
128.32.130
–host 128.32.0.130
–net 128.32
128.32.0.0
–net 128.32.130
128.32.130.0

这两个修饰符可避免地址和关键字(例如用作符号主机名称的 host)之间的混淆。可以在 destination 前加上 –dst 修饰符来进行区分。可以使用 –gateway 修饰符来区分网关地址。如果目标可以通过接口直接到达而不需要中间 IP 路由器作为网关,可使用 –interface–iface 修饰符指示这一点。

在以下示例中,路由不涉及外部网关(路由器),而是通过计算机的一个接口。IP 目标地址与此类路由上的目标和掩码匹配的包会在网关地址所标识的接口上发出。对于使用 ARP 协议的接口,这种类型的路由用于指定所有匹配目标都是物理链路的本地地址。即,可以使用此命令添加缺省路由,从而将主机配置为所有地址的 ARP,而不必考虑所配置的接口网络掩码。例如:


example# route add default hostname -interface

其中网关地址 hostname 是与发送所有匹配包的网络接口关联的名称或 IP 地址。在只有一个网络接口的主机上,hostname 通常与 uname -n 命令所返回的 nodename 相同。请参见 uname(1)

为了实现与早期系统的向后兼容,也可以通过在网关地址后放一个 0 来指定可直接到达的路由:


example# route add default hostname 0 

此值曾经是一个路由度量,但现在已经不再使用该度量。如果将该值指定为 0,则目标可直接到达(等效于指定 interface)。如果是非零但不能解释为子网掩码的值,则使用网关(缺省设置)。

使用 AF_INET 地址族或 IPv4 地址时,可以指定单独的子网掩码。可以通过以下方式之一指定此值:

  • IP 地址后跟网关地址。这通常用 decimal dot 表示法指定(就像对 inet_addr(3SOCKET) 一样),而不是采用符号形式。

  • IP 地址后跟 –netmask 限定符。

  • 在目标地址后附加斜杠字符和一个十进制长度。

如果未指定子网掩码,则使用的掩码是按网关地址选择的输出接口的子网掩码,前提是目标类网与接口的类网相同。否则,将使用目标地址的类网掩码。

以下每个示例创建一个到目标 192.0.2.32 子网的 IPv4 路由,子网掩码为 255.255.255.224


example# route add 192.0.2.32/27 somegateway
example# route add 192.0.2.32 -netmask 255.255.255.224 somegateway
example# route add 192.0.2.32 somegateway 255.255.255.224

对于 IPv6,仅接受斜杠格式。以下示例创建了一个到目标 33fe:: 的 IPv6 路由,网络掩码为 16 个一位后跟 112 个零位。


example# route add -inet6 3ffe::/16 somegateway

在网络未唯一标识输出接口(例如,多个接口使用相同的地址)的情况下,可以使用 –ifp ifname 修饰符来按名称指定接口。例如,–ifp lo0 将路由与 lo0 接口关联起来。如果指定的接口是 IPMP(IP multipathing,IP 多路径)组中的底层接口,则请求添加路由时将自动转换成对应的 IPMP IP 接口,请求在底层接口上删除或更改路由将失败。

当路由表包含多个相等的路由(即到相同目标和掩码的路由)时,IP 将尝试将流量分配到这些路由上。如下:单个传输连接使用相同的路由来避免包重新排序,如 TCP 中所表现的那样。分配算法的详细信息没有记录,并且可能会随时间而演变。

路由标志

路由有关联的标志,这些标志会影响协议在发送到路由所匹配的目标时的操作。通过在命令行上包括以下修饰符可以设置这些标志(在有些情况下可以清除标志,由 ~ 指示):

修饰符
标志
说明
–interface
~RTF_GATEWAY
目标可以直接到达
–iface
~RTF_GATEWAY
接口修饰符的别名
–static
RTF_STATIC
手动添加的路由
–nostatic
~RTF_STATIC
假装路由是由内核或路由守护进程添加的
–reject
RTF_REJECT
匹配时发出 ICMP 不可访问消息
–blackhole
RTF_BLACKHOLE
无提示地丢弃包
–proto1
RTF_PROTO1
设置特定于协议的路由标志 #1
–proto2
RTF_PROTO2
设置特定于协议的路由标志 #2
–private
RTF_PRIVATE
不通告此路由
–multirt
RTF_MULTIRT
创建指定的冗余路由
–setsrc
RTF_SETSRC
分配缺省源地址
-indirect
RTF_INDIRECT
允许在网关不在链路上的情况下添加路由

可选的 –indirect 修饰符允许在网关无法直接到达的情况下添加路由。当间接路由是要发送或转发的包的最佳匹配时,IP 将继续查找该网关以寻找可直接到达的路由。即使网关可直接到达,也可使用 –indirect 修饰符。

可选的修饰符 –rtt–rttvar–sendpipe–recvpipe–mtu–hopcount–expire–ssthresh 按传输级别协议(如 TCP)提供路由条目中维护的数量的初始值。通过将 –lock 元修饰符放在每个要锁定的修饰符前面,或者指定所有后续度量都可通过 –lockrest 元修饰符锁定,可以分别锁定这些修饰符。

有些传输层协议可能仅支持其中的部分度量。支持以下可选修饰符:

–expire

条目的生命周期。当前不支持此可选修饰符。

–hopcount

最大跃点计数。当前不支持此可选修饰符。

–mtu

以字节为单位的最大 MTU。

–recvpipe

以字节为单位的接收管道大小。

–rtt

以微秒为单位的往返时间。

–rttvar

以微秒为单位的往返时间差。

–sendpipe

以字节为单位的发送管道大小。

–ssthresh

以字节为单位的发送管道大小阈值。

–secattr

路由的安全属性。仅当系统配置有 Solaris Trusted Extensions 功能时,此修饰符才可用。

–secattr 修饰符具有以下格式:

min_sl=val,max_sl=val,doi=val,cipso

或者:

sl=VAL,doi=VAL,cipso

在上面的第一种形式中,min_slmax_slval 是一个十六进制或字符串形式的敏感标签。doival 是一个非负整数。该路由将仅适用于具有由 doi 值定义的相同系统解释域并且在 min_slmax_sl 值定义的认可范围内的包。cipso 关键字为可选项,缺省为已设置。有效的 min_slmax_sldoi 关键字/值对是必需的。请注意,如果 val 包含空格,则必须将其放在双引号中。

上面的第二种形式等效于对 min_slmax_sl 用相同的 VAL 所指定的第一种形式。第二种形式应该用于 get 命令,因为 get 仅使用一个敏感标签。

兼容性

修饰符 hostnet 被视为等效于 host–net。要指定匹配其中一个名称的符号地址,可使用 dstgateway 关键字来进行区分。例如:–dst host

为了与早期的系统兼容,也接受以下两个标志,但它们没有效果。

修饰符
标志
–cloning
RTF_CLONING
–xresolve
RTF_XRESOLVE

也接受 –ifa hostname 修饰符,但它没有效果。

文件

/etc/defaultrouter

缺省路由器列表

/etc/hosts

主机名称和网络地址列表

/etc/networks

网络名称和地址列表

属性

有关下列属性的说明,请参见 attributes(5)

属性类型
属性值
可用性
system/core-os

另请参见

uname(1)in.ripngd(1M)in.routed(1M)netcfg(1M)netstat(1M)routed(1M)ioctl(2)getipnodebyname(3SOCKET)getnetbyname(3SOCKET)inet_addr(3SOCKET)defaultrouter(4)hosts(4)networks(4)attributes(5)arp(7P)ip(7P)route(7P)routing(7P)

诊断

add [ host | network ] destination:gateway flags

将指定路由添加到表中。输出的值来自于 ioctl(2) 调用中提供的路由表条目。如果使用的网关地址不是网关的主地址(getipnodebyname(3SOCKET) 返回的第一个地址),则将同时以数字形式和符号形式输出网关地址。

delete [ host | network ] destination:gateway flags
change [ host |  network ] destination:gateway flags

add 相同,但在删除或更改条目时使用。

destination done

如果指定了 –f 标志或者使用了 flush 子命令,则每删除一个路由表条目都将使用此格式的消息指示。

Network is unreachable

尝试添加路由失败,因为列出的网关不在直接连接的网络上。改为提供下一中继站。

not in table

尝试对不在表中的条目进行 delete 操作。

entry exists

尝试对已在内核中的路由进行 add 操作。

routing table overflow

尝试执行一项操作,但系统无法分配创建新条目所需的内存。

insufficient privileges

尝试添加、删除、更改或刷新路由失败,因为发出调用的进程没有相应的特权。

附注

指定目标是本地目标(使用 –interface 修饰符)时,将假设路由器将实现代理地址转换协议,即它们响应对所有可到达的目标的 ARP 查询。正常情况下,使用路由器发现或 RIP 比使用代理地址转换协议更加可靠,扩展性更好。有关 RIP 的相关信息,请参见 in.routed(1M)

将所有目标都是本地的路由与子网或网络路由组合使用可能导致不可预测的后果。与所有目标都是本地的路由相关的搜索顺序未定义,各个版本之间可能有所不同。