# routed.8

ROUTED(8)

ROUTED(8)

FreeBSD System Manager's Manual

ROUTED(8)

## [名称](#__u540D___u79F0_)

`routed`, `rdisc` —

网络 RIP 和路由器发现路由守护进程

## [概要](#__u6982___u8981_)

`routed` \[`-isqdghmpAtv`] \[`-T` tracefile] \[`-F` net\[/mask\[,metric]]] \[`-P` parms]

## [描述](#__u63CF___u8FF0_)

`routed` 实用程序是一个在引导时调用的守护程序，用于管理网络路由表。 它使用路由信息协议、RIPv1 (RFC 1058)、RIPv2 (RFC 1723) 和 Internet 路由器发现协议 (RFC 1256) 来维护内核路由表。 RIPv1 协议基于参考 4.3BSD 守护进程。

它在 udp(4) 套接字上侦听路由信息协议数据包的 route(8) 服务（请参阅 services(5) ）。 它还发送和接收多播路由器发现 ICMP 消息。 如果主机是路由器，则 `routed` 会定期将其路由表的副本提供给任何直接连接的主机和网络。 它还使用路由器发现 ICMP 消息通告或请求默认路由。

启动时（或稍后打开网络接口时）， `routed` 使用 AF\_ROUTE 地址系列工具来查找配置到系统中并标记为 "up" 的那些直接连接的接口。 它将接口的必要路由添加到内核路由表。 在第一次启动后不久，如果至少有一个接口没有禁用 RIP， `routed` 会删除内核表中所有预先存在的非静态路由。 如果内核表中的静态路由具有有效的 RIP 跳数（请参阅 route(8) ），则会保留并包含在 RIP 响应中。

如果存在多个接口（不包括环回接口），则假定主机应在连接的网络之间转发数据包。 在新接口上传输 RIP 请求和路由器发现广告或请求后，守护程序进入一个循环，侦听来自其他主机的 RIP *request* 和响应以及路由器发现数据包。

当接收到 *request* 包时， `routed` 根据其内部表中维护的信息制定回复。 生成的 *response* 数据包包含一个已知路由列表，每个路由都标有 "hop count" 度量（16 或更大的计数被认为是 "infinite" ）。 路由的通告度量反映了与接收和发送路由的接口关联的度量（参见 ifconfig(8) ），因此在接口上设置度量是引导流量的有效方法。 另请参见下面的 `adj_inmetric` 和 `adj_outmetric` 参数。

响应不包括在请求网络上具有第一跳以部分实现 *split-horizon* 的路由。 来自查询程序（例如 rtquery(8) ）的请求会使用完整的表来回答。

守护进程维护的路由表包括用于每个目的地的多个网关的空间，以加快从故障路由器中恢复的速度。 接收到的 RIP *response* 数据包用于更新路由表，前提是它们来自几个当前公认的网关之一，或者宣传比至少一个现有网关更好的度量标准。

当应用更新时， `routed` 会在其自己的表中记录更改，并在到达目的地的最佳路由发生更改时更新内核路由表。 内核路由表的变化反映在下一批发送的 *response* 包中。 如果有一段时间没有安排下一个响应，则发送仅包含最近更改的路由的 *flash update* 响应。

除了处理传入的数据包， `routed` 还定期检查路由表条目。 如果条目 3 分钟未更新，则条目的度量将设置为无穷大并标记为删除。 删除会延迟，直到使用无限量度来通告路由，以确保在整个本地 Internet 中传播无效。 这是 *poison reverse* 的一种形式。

由于 ICMP 重定向消息而添加或更改的内核表中的路由会在一段时间后被删除，以最大限度地减少 *black-holes* 。 当 TCP 连接超时时，内核告诉 `routed` ，它会删除所有通过相关网关的重定向路由，提前通过网关的所有 RIP 路由的年龄以允许选择备用路由，并提前任何相关路由器的年龄发现协议默认路由。

充当互联网络路由器的主机每 30 秒免费向所有直接连接的主机和网络提供其路由表。 这些 RIP 响应被发送到支持广播的网络上的广播地址、点对点链路上的目标地址以及其他网络上的路由器自己的地址。 如果启用 RIPv2，组播数据包将在支持组播的接口上发送。

如果在远程接口上没有收到响应，如果在发送响应时出现错误，或者如果错误多于输入或输出（请参阅 netstat(1) ），则假定电缆或接口的其他部分断线或断线，并适当调整路线。

*Internet 路由器发现协议* 的处理方式类似。 当守护程序提供 RIP 路由时，它还会侦听路由器发现请求并发送广告。 当它安静并侦听其他 RIP 路由器时，它会发送请求并侦听广告。 如果它接收到一个好的广告并且它不是多宿主的，它就会停止侦听广播或多播 RIP 响应。 当当前选择的路由器死机时，它会跟踪几个广告路由器以加快恢复速度。 如果所有发现的路由器都消失了，守护程序将继续侦听 RIP 响应。 如果使用多宿主，它会在使用路由器发现的同时继续侦听 RIP，以确保使用所有接口。

路由器发现标准要求广告的默认 "lifetime" 为 30 分钟。 这意味着如果发生某些事情，客户可能会在 30 分钟内没有好的路线。 使用命令行上的 `-P` `rdisc_interval=45` 或 /etc/gateways 文件中的 `rdisc_interval=45` 将默认值减少到 45 秒是个好主意。

在使用路由器发现时（默认情况下，当系统具有单个网络接口并接收到路由器发现广告时会发生这种情况），内核表中有一个默认路由和可变数量的重定向主机路由。 在具有多个网络接口的主机上，此默认路由将仅通过其中一个接口。 因此，使用 `-q` 运行的多宿主主机可能需要下面描述的 `no_rdisc` 。

请参阅下面描述的 `pm_rdisc` 工具，以支持既不能处理 RIPv2 也不能处理路由器发现的 "legacy" 系统。

默认情况下，Router Discovery 通告和请求都不会通过点对点链路（例如 PPP）发送。 当使用 RIPv1 时， `routed` 使用与点对点链接（例如 SLIP 或 PPP，带有 IFF\_POINTOPOINT 标志）关联的网络掩码来推断远程系统使用的网络掩码。

可以使用以下选项：

[`-i`](#i)

允许 `routed` 接受来自非路由器节点的 RIP 请求。 当指定一次时， `routed` 回复来自邻居节点的路由信息查询。 当指定两次时，它会另外回复来自远程节点的查询。 rtquery(8) 实用程序可用于发送请求。

由于反射攻击的风险，此功能默认禁用，尽管它对于调试目的很有用。

[`-s`](#s)

强制 `routed` 以提供路由信息。 如果存在多个未禁用 RIP 或路由器发现的网络接口，并且内核开关 ipforwarding=1，则这是默认设置。

[`-q`](#q)

与 `-s` 选项相反。 这是仅存在一个接口时的默认设置。 使用这个显式选项，守护程序对于 RIP 始终处于 "quiet-mode" ，并且不向其他计算机提供路由信息。

[`-d`](#d)

不要在后台运行。 此选项用于交互使用。

[`-g`](#g)

用于互联网络路由器以提供到 "default" 目的地的路由。 它等效于 `-F` `0/0,1` 并且主要出于历史原因而存在。 更好的选择是命令行上的 `-P` `pm_rdisc` 或 /etc/gateways 文件中的 `pm_rdisc` ，因为将使用更大的度量标准，从而减少潜在危险的默认路由的传播。 这通常用在通往 Internet 的网关上，或者用在使用另一个路由协议的网关上，该协议的路由不会报告给其他本地路由器。 请注意，因为使用了 1 的度量，所以这个特性是危险的。 与解决问题相比，它更常意外地用于在路由循环中造成混乱。

[`-h`](#h)

导致主机或点对点路由不被通告，前提是有一个网络路由指向相同的方向。 这是一种有限的聚合。 此选项在以太网网关上非常有用，该网关具有通过点对点链路（例如 SLIP）连接的其他网关机器。

[`-m`](#m)

导致机器向其主接口通告主机或点对点路由。 它在 NFS 服务器等多宿主机器上很有用。 除非它生成的主机路由的成本可以通过服务器的受欢迎程度来证明，否则不应使用此选项。 只有在机器提供路由信息时才有效，因为接口不止一个。 `-m` 选项在广播主机路由的有限范围内覆盖 `-q` 选项。

[`-A`](#A)

如果我们不关心 RIPv2 身份验证，请不要忽略 RIPv2 身份验证。 此选项是符合 RFC 1723 所必需的。 但是，当这台机器不关心身份验证时，使用 RIP 作为发现协议来忽略所有携带身份验证的 RIPv2 数据包是没有意义的并且会中断。

[`-t`](#t)

提高调试级别，这会导致更多信息被记录到使用 `-T` 或标准输出指定的跟踪文件中。 调试级别可以通过 *SIGUSR1* 或 *SIGUSR2* 信号或 rtquery(8) 命令增加或减少。

[`-T`](#T) tracefile

将调试级别增加到至少 1 并导致调试信息附加到跟踪文件。 请注意，出于安全考虑，最好不要在跟踪定向到文件的情况下常规运行 `routed` 。

[`-v`](#v)

显示并记录守护进程的版本。

[`-F`](#F) net\[/mask]\[,metric]

通过地址与 *net/mask* 匹配的接口最小化传输中的路由，并用 *metric* 合成到这台机器的默认路由。 其目的是通过用包含 "fake" 默认路由的单个小数据包替换许多包含 RIP 信息的大 UDP 数据包来减少慢速点对点链路（如 PPP 链路）上的 RIP 流量。 如果 *metric* 不存在，则假定值为 14 以限制 "fake" 默认路由的传播。 这是一个危险的功能，如果不小心使用会导致路由循环。 另请注意，多个接口可以匹配指定的网络号和掩码。 另见 `-g` 。

[`-P`](#P) parms

相当于将参数行 *parms* 添加到 /etc/gateways 文件中。

提供的任何其他参数都被解释为应该记录 `routed` 操作的文件的名称。 最好使用 `-T` 而不是将跟踪文件的名称附加到命令中。

`routed` 实用程序还支持 "distant" *passive* 或 *active* 网关的概念。 当 `routed` 启动时，它会读取文件 /etc/gateways 以查找仅使用来自路由套接字的信息可能无法定位的远程网关，以发现某些本地网关是否是 *passive* ，并获取其他参数。 如果以这种方式指定的网关不希望交换路由信息，则应将其标记为被动，而标记为活动的网关应愿意交换 RIP 数据包。 通过 *passive* 网关的路由在启动时安装在内核的路由表中，并且不包含在传输的 RIP 响应中。

远程活动网关被视为网络接口。 RIP 响应被发送到远程 *active* 网关。 如果没有收到响应，则从内核表中删除关联的路由，并通过其他接口发布 RIP 响应。 如果远程网关恢复发送 RIP 响应，则相关路由将恢复。

此类网关在不支持广播或多播但在其他方面类似于经典共享媒体（如以太网，例如某些 ATM 网络）的媒体上可能很有用。 可以使用一系列 "host" 行在 /etc/gateways 中列出 HIPPI 或 ATM 网络上所有可访问的 RIP 路由器。 请注意，在这种情况下通常需要使用 RIPv2 以避免生成推断的主机路由列表。

标记为 *external* 的网关也是被动的，但不放置在内核路由表中，也不包含在路由更新中。 外部条目的作用是指示另一个路由进程在必要时将安装这样的路由，并且到该目的地的其他路由不应被 `routed` 安装。 只有当两个路由器都可以获知到同一目的地的路由时，才需要此类条目。

/etc/gateways 文件由一系列行组成，每行都采用以下两种格式之一或由稍后描述的参数组成。 以 '#' 开头的空行和行是注释。

`net` Nname\[/mask] `gateway` Gname `metric` value <`passive` | `active` | `extern`>

`host` Hname `gateway` Gname `metric` value <`passive` | `active` | `extern`>

Nname 或 Hname 是目标网络或主机的名称。 它可以是符号网络名称或以 "dot" 表示法指定的 Internet 地址（请参阅 inet(3) ）。 （如果是名称，那么它必须在 /etc/networks 或 /etc/hosts 中定义，或者 named(8), 必须在 `routed` 之前启动。）

Mask 是一个介于 1 和 32 之间的可选数字，表示与 Nname 关联的网络掩码。

Gname 是应该转发 RIP 响应的网关的名称或地址。

Value 是到目标主机或网络的跳数。

`Host` hname 相当于 `net` nname/32 。

必须出现关键字 `passive`, `active` 或 `external` 之一，以指示网关应被视为 `passive` 还是 `active` （如上所述），或者网关是否在 RIP 协议范围 `external` 。

当使用 `-t` 打开调试时可以看出，这些行创建了伪接口。 要为远程或外部接口设置参数，应使用以 `if=alias(Hname)`, `if=remote(Hname)` 等开头的行。

### [参数](#__u53C2___u6570_)

既不以 "net" 也不以 "host" 开头的行必须包含以下一项或多项参数设置，以逗号或空格分隔：

[`if`](#if)=ifname

表示该行的其他参数适用于接口名称 ifname 。

[`subnet`](#subnet)=nname\[/mask]\[,metric]

使用掩码 mask 和提供的度量（默认为 1）通告到网络 nname- 的路由。 这对于填补 CIDR 分配中的 "holes" 很有用。 该参数必须单独出现在一行中。 网络号必须指定一个完整的 32 位值，如 192.0.2.0 而不是 192.0.2。

除非必要，否则不要使用此功能。有危险。

[`ripv1_mask`](#ripv1_mask)=nname/mask1,mask2

指定以 nname/mask1 为子网的网络的网络掩码应为 mask2 。 例如， “`ripv1_mask=192.0.2.16/28,27`” 将 192.0.2.16/28 标记为 192.0.2.0/27 的子网，而不是 192.0.2.0/24。 最好打开 RIPv2 而不是使用此工具，例如使用 `ripv2_out` 。

[`passwd`](#passwd)=XXX\[|KeyID\[start|stop]]

指定将包含在所有发送的 RIPv2 响应中的 RIPv2 明文密码，并检查收到的所有 RIPv2 响应。 密码中的任何空格、制表符、逗号或 '#', '|', 或 NULL 字符都必须使用反斜杠 (\\) 进行转义。 常见的转义序列 \n, \r, \t, \b 和 \xxx 具有它们通常的含义。 `KeyID` 必须是唯一的，但对于明文密码将被忽略。 如果存在，则 `start` 和 `stop` 是格式为 year/month/day\@hour:minute 的时间戳。 他们指定密码何时有效。 输出数据包使用最远的有效密码，除非所有密码都已过期，在这种情况下使用最近过期的密码，或者除非还没有有效密码，在这种情况下不输出密码。 传入的数据包可以携带任何有效的密码，将在接下来的 24 小时内有效，或者在前 24 小时内有效。 为了保护机密，passwd 设置仅在 /etc/gateways 文件中有效，并且仅当该文件只能由 UID 0 读取时才有效。

[`md5_passwd`](#md5_passwd)=XXX|KeyID\[start|stop]

指定 RIPv2 MD5 密码。 除了需要 `KeyID` 外，此关键字与 `passwd` 类似。

[`no_ag`](#no_ag)

关闭 RIPv1 和 RIPv2 响应中的子网聚合。

[`no_super_ag`](#no_super_ag)

在 RIPv2 响应中关闭网络聚合成超网。

[`passive`](#passive)

将该接口标记为不在通过其他接口发送的更新中通告，并关闭所有通过该接口的 RIP 和路由器发现。

[`no_rip`](#no_rip)

禁用指定接口上的所有 RIP 处理。 如果不允许任何接口处理 RIP 数据包，则 `routed` 纯粹充当路由器发现守护进程。

请注意，在不使用 `rdisc_adv` 或 `-s` 显式打开路由器发现通告的情况下关闭 RIP 会导致 `routed` 充当客户端路由器发现守护进程，而不是通告。

[`no_rip_mcast`](#no_rip_mcast)

导致 RIPv2 数据包被广播而不是多播。

[`no_rip_out`](#no_rip_out)

导致不发送 RIP 更新。

[`no_ripv1_in`](#no_ripv1_in)

导致 RIPv1 收到的响应被忽略。

[`no_ripv2_in`](#no_ripv2_in)

导致 RIPv2 收到的响应被忽略。

[`ripv2_out`](#ripv2_out)

打开 RIPv2 输出并尽可能多播 RIPv2 通告。

[`ripv2`](#ripv2)

相当于 `no_ripv1_in` 和 `no_ripv1_out` 。这将启用 RIPv2。

[`no_rdisc`](#no_rdisc)

禁用 Internet 路由器发现协议。

[`no_solicit`](#no_solicit)

禁用路由器发现请求的传输。

[`send_solicit`](#send_solicit)

指定应发送路由器发现请求，即使是在点对点链路上，默认情况下仅侦听路由器发现消息。

[`no_rdisc_adv`](#no_rdisc_adv)

禁用路由器发现广告的传输。

[`rdisc_adv`](#rdisc_adv)

指定应该发送路由器发现广告，即使在点对点链路上，默认情况下只收听路由器发现消息。

[`bcast_rdisc`](#bcast_rdisc)

指定应该广播路由器发现数据包而不是多播。

[`rdisc_pref`](#rdisc_pref)=N

将 Router Discovery Advertisements 中的首选项设置为可选的有符号整数 N 。 默认首选项为 0。 客户端首选具有较小或更多负面偏好的默认路由。

[`rdisc_interval`](#rdisc_interval)=N

将传输路由器发现广告的标称间隔设置为 N 秒，并将其生命周期设置为 3\*N 。

[`fake_default`](#fake_default)=metric

与来自指定接口的网络和掩码具有相同的效果 `-F` net\[/mask]\[=metric] 。

[`pm_rdisc`](#pm_rdisc)

类似于 `fake_default` 。 当 RIPv2 路由是多播时，RIPv1 侦听器无法接收它们，此功能会导致将 RIPv1 默认路由广播到 RIPv1 侦听器。 除非使用 `fake_default` 进行修改，否则默认路由以 14 的度量值进行广播。 这是一个 "穷人的路由器发现" 协议。

[`adj_inmetric`](#adj_inmetric)=delta

按 delta 调整接收到的 RIP 路由的跳数或度量。 每条接收到的 RIP 路由的度量值都会增加与接口关联的两个值的总和。 一个是 adj\_inmetric 值，另一个是使用 ifconfig(8) 设置的接口度量。

[`adj_outmetric`](#adj_outmetric)=delta

按 delta 调整发布的 RIP 路由的跳数或度量。 每个接收到的 RIP 路由的度量值增加与接收它的接口关联的度量值，如果接口没有非零度量值，则增加 1。 然后，接收到的路由的度量会增加与接口关联的 adj\_outmetric。 每个通告的路由总共增加四个值，使用 ifconfig(8) 为接收它的接口设置的度量值，接收接口的 `adj_inmetric` delta ，使用 ifconfig 传输它的接口设置的 ifconfig(8), 以及传输接口的 `adj_outmetric` delta 。

[`trust_gateway`](#trust_gateway)=rname\[|net1/mask1|net2/mask2|...]

导致来自路由器 rname 和其他以其他 `trust_gateway` 关键字命名的路由器的 RIP 数据包被接受，而来自其他路由器的数据包被忽略。 如果指定了网络，那么从该路由器到其他网络的路由将被忽略。

[`redirect_ok`](#redirect_ok)

允许内核在系统充当路由器并转发数据包时侦听 ICMP Redirect 消息。 否则，当系统充当路由器时，ICMP 重定向消息将被覆盖并删除。

## [文件](#__u6587___u4EF6_)

/etc/gateways

用于远程网关

## [参见](#__u53C2___u89C1_)

icmp(4), udp(4), rtquery(8) Internet Transport Protocols, XSIS 028112, Xerox System Integration Standard.

## [历史](#__u5386___u53F2_)

`routed` 实用程序出现在 4.2BSD 中。

## [缺陷](#__u7F3A___u9677_)

它并不总是检测网络接口中的单向故障，例如，当输出端发生故障时。

August 26, 2014

FreeBSD 13.1-RELEASE
