系统管理指南:IP 服务

第 16 章 配置和管理 DHCP 客户机

本章介绍属于 Oracle Solaris : 的动态主机配置协议 (Dynamic Host Configuration Protocol, DHCP) 客户机。同时还说明客户机的 DHCPv4 和 DHCPv6 协议如何工作,以及您如何可以影响客户机的行为。

协议之一 DHCPv4 长期以来是 Oracle Solaris : 的一部分,通过它 DHCP 服务器可以将配置参数(如 IPv4 网络地址)传递到 IPv4 节点。

通过另一协议 DHCPv6,DHCP 服务器可以将配置参数(如 IPv6 网络地址)传递到 IPv6 节点。DHCPv6 是与“IPv6 无状态地址自动配置”(RFC 2462) 对应的有状态协议。它既可以单独使用,也可以与无状态地址自动配置同时使用,来获取配置参数。

本章包含以下信息:

关于 Oracle Solaris : DHCP 客户机

Oracle Solaris : DHCP 客户机为 dhcpagent 守护进程,是 Oracle Solaris : 的一部分。安装 Oracle Solaris : 时,系统会提示您使用 DHCP 来配置网络接口。如果您为 DHCPv4 指定“是”,则会在安装 Oracle Solaris : 期间在系统上启用该协议。没有专用于 DHCPv6 的安装时选项。但是,有一个与 IPv6 相关的问题。如果启用 IPv6,则在支持 DHCPv6 的本地网络上也将启用 DHCPv6。

无需为了使用 DHCP 而对 Oracle Solaris : 客户机执行其他任何操作。DHCP 服务器配置会确定为使用 DHCP 服务的 DHCP 客户机系统提供的信息。

如果客户机系统已经运行 Oracle Solaris :,但是没有使用 DHCP,则可以将客户机系统重新配置为使用 DHCP。您还可以重新配置 DHCP 客户机系统,以使其停止使用 DHCP 而使用您提供的静态网络信息。有关更多信息,请参见启用和禁用 Oracle Solaris : DHCP 客户机

DHCPv6 服务器

Sun Microsystems 在 Oracle Solaris : 中未提供 DHCPv6 服务器。由第三方提供的服务器与 Sun 的 DHCPv6 兼容;如果网络中存在 DHCPv6 服务器,则 Sun 的 DHCPv6 客户机将使用它。

有关 Sun DHCPv4 服务器的信息,请参见Oracle Solaris : DHCP 服务器

DHCPv4 和 DHCPv6 之间的差异

DHCPv4 和 DHCPv6 之间的两个主要差异如下:

管理模型

DHCPv4 需要显式客户机配置。必须设置 DHCPv4 系统以便在需要时进行寻址,这通常是在初始系统安装期间完成或通过使用 ifconfig(1M) 选项动态完成。

DHCPv6 不需要显式客户机配置。相反,使用 DHCP 是网络的特性,并且使用 DHCP 的信号在来自本地路由器的路由器通告消息中传送。DHCP 客户机根据需要自动创建和销毁逻辑接口。

DHCPv6 机制与现有的 IPv6 无状态(自动)地址配置在管理方面非常类似。对于无状态地址配置,可以在本地路由器上设置一个标志以指明:如果有一组给定的前缀,每个客户机都应使用通告前缀以及本地接口标记或随机数独立地自动配置一个地址。对于 DHCPv6,需要相同的前缀,但地址是通过 DHCPv6 服务器而不是“随机”指定来获取和管理的。

MAC 地址和客户机 ID

为了方便指定地址,DHCPv4 使用 MAC 地址和可选的客户机 ID 来标识客户机。每次同一客户机到达网络时,它都会获取同一地址(如果可能)。

DHCPv6 使用基本相同的方案,但是它必须使用客户机 ID,并强制它采用特定结构。DHCPv6 中的客户机 ID 由以下两部分组成: DHCP 唯一标识符 (DHCP Unique Identifier, DUID) 和身份关联标识符 (Identity Association Identifier, IAID)。DUID 标识客户机系统(而不是如 DHCPv4 中那样仅标识接口),而 IAID 标识该系统上的接口。

如 RFC 3315 中所述,身份关联是服务器和客户机用来标识、分组和管理一组相关 IPv6 地址的方法。客户机必须将至少一个不同 IA 与其每个网络接口关联,然后使用指定的 IA 从服务器获取该接口的配置信息。有关 IA 的其他信息,请参见下一节“协议详细信息”。

DUID+IAID 也可以用于 DHCPv4。可以明确地将它们串联在一起,以便它们可以用作客户机 ID。由于兼容性原因,没有对常规 IPv4 接口执行此操作。但是,对于逻辑接口 ("hme0:1"),如果未配置客户机 ID,则使用 DUID+IAID。

与 IPv4 DHCP 不同,DHCPv6 未提供“客户机名称”选项,因此无法仅基于 DHCPv6 来命名系统。相反,如果需要知道与 DHCPv6 提供的地址相配的 DNS 名称,请使用 DNS 反向解析(通过 getaddrinfo(3SOCKET) 函数的地址到名称查询)查找对应的名称信息。这意味着,如果仅使用 DHCPv6 且希望节点具有特定的名称,则必须在系统上设置 /etc/nodename

协议详细信息

如果使用 DHCPv4,DHCP 服务器会提供要用于已指定地址的子网掩码。如果使用 DHCPv6,子网掩码(也称为“前缀长度”)由路由器通告指定,且不受 DHCP 服务器的控制。

DHCPv4 有一个用于设置系统范围节点名称的主机名选项。DHCPv6 没有这样的选项。

要为 DHCPv6 配置客户机 ID,必须指定 DUID,而不是允许系统自动选择一个。对于守护进程,可以按全局方式执行此操作,也可以基于每个接口来执行。使用以下格式设置全局 DUID(请注意初始点):

.v6.CLIENT_ID=<DUID>

将特定接口设置为使用给定 DUID(并使系统看起来是 DHCPv6 服务器的多个独立客户机):

hme0.v6.CLIENT ID=<DUID>

每种身份关联 (Identity Association, IA) 持有一种类型的地址。例如,临时地址的身份关联 (identity association for temporary addresses, IA_TA) 持有临时地址,而非临时地址的身份关联 (identity association for non-temporary addresses, IA_NA) 持有指定的永久性地址。本指南介绍的 DHCPv6 版本仅提供 IA_NA 关联。

Oracle Solaris : 根据需要仅为每个接口指定一个 IAID,并将 IAID 存储在根文件系统的文件中,以便它在计算机的使用期限内保持不变。

逻辑接口

在 DHCPv4 客户机中,每个逻辑接口都是独立的,而且是一个管理单元。除了第零个逻辑接口(缺省情况下是作为标识符的接口 MAC 地址)外,用户还可以通过在 dhcpagent 配置文件中指定 CLIENT_ID,将特定的逻辑接口配置为运行 DHCP。例如:

hme0:1.CLIENT_ID=orangutan

DHCPv6 以不同的方式工作。与 IPv4 不同,IPv6 接口上的第零个逻辑接口始终是本地链路。在没有其他可用的指定方法(如 DHCP 服务器)时,将使用本地链路自动将 IP 地址指定给 IP 网络中的设备。第零个逻辑接口不能由 DHCP 控制,因此,虽然 DHCPv6 在第零个逻辑接口(也称为“物理”接口)上运行,但是它仅在非零逻辑接口上指定地址。

作为对 DHCPv6 客户机请求的响应,DHCPv6 服务器返回客户机要配置的地址的列表。

选项协商

在 DHCPv6 中存在“选项请求”选项,该选项为服务器提供关于客户机首选查看内容的提示。如果所有的可能选项都是从服务器发送到客户机,则可以发送的信息如此之多,以致于必须在发往客户机的过程中删除其中一些信息。服务器可能会使用该提示从要包括在答复中的选项中进行选择。或者,服务器可能忽略提示,而选择要包括的其他项。例如,在 Oracle Solaris : 上,首选选项可能包括 Oracle Solaris : DNS 地址域或 NIS 地址域,但不大可能包括网络 bios 服务器。

为 DHCPv4 也提供了相同类型的提示,但是未提供特殊的“选项请求”选项。DHCPv4 改用 /etc/default/dhcpagent 中的 PARAM_REQUEST_LIST

配置语法

如果使用 /etc/default/dhcpagent,则配置 DHCPv6 客户机的方式与配置现有 DHCPv4 客户机的方式非常类似。

通过在接口名称(如果有)和要配置的参数之间增加一个 ".v6" 标记。例如,可以按以下所示设置全局 IPv4 选项请求列表:

PARAM_REQUEST_LIST=1,3,6,12,15,28,43

可以按以下所示将单个接口配置为省略主机名选项:

hme0.PARAM_REQUEST_LIST=1,3,6,15,28,43

要为 DHCPv6 设置全局请求列表,请注意前导点:

.v6.PARAM_REQUEST_LIST=23,24

或者,要设置单个接口,请按照以下示例操作:

hme0.v6.PARAM_REQUEST_LIST=21,22,23,24

以下是 DHCPv6 配置的实际 /etc/default/dhcpagent 文件,供您参考:


# The default DHCPv6 parameter request list has preference (7), unicast (12),
# DNS addresses (23), DNS search list (24), NIS addresses (27), and
# NIS domain (29).  This may be changed by altering the following parameter- 
# value pair.  The numbers correspond to the values defined in RFC 3315 and 
# the IANA dhcpv6-parameters registry. 
.v6.PARAM_REQUEST_LIST=7,12,23,24,27,29

DHCP 客户机启动

大多数情况下,在 DHCPv6 客户机启动时您无需执行任何操作。如果需要,in.ndpd 守护进程会自动启动 DHCPv6。您可能需要编辑 /etc/hostname6.$IFNAME 以配置在引导时要为 IPv6 检测的接口。但是,如果安装时在系统上启用了 IPv6,则安装程序已执行此操作。

不过,对于 DHCPv4,如果在 Oracle Solaris : 安装过程中未执行此操作,则必须请求客户机启动。请参见如何启用 Oracle Solaris : DHCP 客户机

dhcpagent 守护进程可获取引导系统时所涉及的其他进程所需的配置信息。因此,系统启动脚本会在引导过程前期启动 dhcpagent 并处于等待状态,直到来自 DHCP 服务器的网络配置信息到达。

虽然缺省设置是运行 DHCPv6,但是可以选择不运行 DHCPv6。DHCPv6 开始运行后,您可以使用 ifconfig 命令停止它。也可以通过修改 /etc/inet/ndpd.conf 文件禁用 DHCPv6,以便在重新引导时它不会启动。

例如,在名为 "hme0" 的接口上立即关闭 DHCPv6。


ex# echo ifdefault StatefulAddrConf false >> /etc/inet/ndpd.conf  
ex# pkill -HUP -x in.ndpd   
ex# ifconfig hme0 inet6 dhcp release

如果存在 /etc/dhcp.interface 文件(例如,Sun Fire 880 系统上的 /etc/dhcp.ce0),则意味着向启动脚本指明要在指定接口上使用 DHCPv4。找到 dhcp.interface 文件后,启动脚本便会启动 dhcpagent

启动之后,dhcpagent 便会处于等待状态,直到收到配置网络接口的指令。启动脚本将发出 ifconfig interface dhcp start 命令,此命令指示 dhcpagent 按照DHCP 的工作原理中所述来启动 DHCPv4。如果这些命令包含在 dhcp.interface 文件中,则会将它们附加到 ifconfigdhcp start 选项后面。有关用于 ifconfig interface dhcp 命令的选项的更多信息,请参见 ifconfig(1M) 手册页。

DHCPv6 通信

与通过手动配置调用的 DHCPv4 不同,DHCPv6 是通过路由器通告 (Router Advertisement, RA) 调用的。根据配置路由器的方式,系统在收到路由器通告消息的接口上自动调用 DHCPv6,并使用 DHCP 获取地址和其他参数,或者系统通过 DHCPv6 仅请求除地址之外的数据(例如 DNS 服务器)。

in.ndpd 守护进程接收路由器通告消息。在系统中为 IPv6 检测的所有接口上,它自动执行此操作。在 in.ndpd 检测到指定 DHCPv6 应该运行的 RA 时,它将调用该 RA。

要阻止 in.ndpd 启动 DHCPv6,可以更改 /etc/inet/ndpd.conf 文件。

使用以下 ifconfig 版本之一,还可以在 DHCPv6 启动后停止它:

ifconfig <interface> inet6 dhcp drop

或者:

ifconfig <interface> inet6 dhcp release

DHCP 客户机协议如何管理网络配置信息

DHCPv4 和 DHCPv6 客户机协议以不同的方式管理网络配置信息。主要差异在于,对于 DHCPv4,协商是针对单个地址和一些与之配套的选项的租用。对于 DHCPv6,协商是针对一批地址和一批选项。

有关 DHCPv4 客户机和服务器之间的交互的背景信息,请参见第 12 章

DHCPv4 客户机如何管理网络配置信息

从 DHCP 服务器获取信息包之后,dhcpagent 便会配置网络接口并初启它。此守护进程在 IP 地址的租用时间内对接口进行控制,并在内部表中维护配置数据。系统启动脚本使用 dhcpinfo 命令从内部表中提取配置选项值。这些值用于配置系统并使其在网络上进行通信。

dhcpagent 守护进程将被动地等待一段时间,通常为租用时间的一半。然后此守护进程从 DHCP 服务器请求延长租用期。如果系统将接口关闭或 IP 地址已更改的信息通知给 dhcpagent,则守护进程不会对接口进行控制,除非 ifconfig 命令指示这样做。如果 dhcpagent 发现接口启动并且 IP 地址没有更改,则它会向服务器发送续订租用的请求。如果无法续订租用,则 dhcpagent 将在租用到期时关闭接口。

dhcpagent 每次执行与租用相关的操作时,该守护进程都会查找名为 /etc/dhcp/eventhook 的可执行文件。如果找到具有此名称的可执行文件,则 dhcpagent 将调用此可执行文件。有关使用可执行事件的更多信息,请参见DHCP 客户机事件脚本

DHCPv6 客户机如何管理网络配置信息

客户机和服务器之间的 DHCPv6 通信以客户机发出要查找服务器的请求消息开始。作为响应,可用于 DHCP 服务的所有服务器都发送通告消息。服务器消息包含多个 IA_NA(Identity Association Non-Temporary Address,身份关联非临时地址)记录,以及服务器可以提供的其他选项(如 DNS 服务器地址)。

通过在其请求消息中设置自己的 IA_NA/IAADDR 记录,客户机可以请求特定地址(而且可以请求多个特定地址)。如果客户机记录了旧地址且它希望服务器提供相同的地址(如果可能),则它通常请求特定的地址。不管客户机如何工作(即使根本未请求地址),服务器都可以为单个 DHCPv6 事务向客户机提供任意数量的地址。

以下是在客户机和服务器之间发生的消息对话。

如果通告消息中的优先级值为 255,则 DHCPv6 客户机立即选择该服务器。如果优先级最高的服务器没有响应,或者无法成功回复请求消息,则客户机会继续查找优先级较低(按顺序)的服务器,直到不再出现通告消息。此时,客户机开始再次发送请求消息。

所选服务器发送包含指定地址和配置参数的回复消息,以响应请求消息。

DHCP 客户机关闭

客户机在关闭时将释放消息发送到将地址指定给该客户机的服务器,以指示该客户机将不再使用一个或多个指定地址。当 DHCPv4 客户机系统正常关闭时,dhcpagent 将当前配置信息写入 /etc/dhcp/interface.dhc 文件,对于 DHCPv6 则写入 /etc/dhcp/interface.dh6 文件。缺省情况下,会保存而不是释放租用,因此 DHCP 服务器不知道 IP 地址未处于活动使用状态,这样在下次引导时客户机就可以轻松地重新获取地址了。此缺省操作相当于执行 ifconfig <interface> dhcp drop 命令。

如果重新引导系统时该文件中的租用仍然有效,则 dhcpagent 将发送要求使用相同 IP 地址和网络配置信息的简短请求。对于 DHCPv4,这是“请求”消息。对于 DHCPv6,则消息为“确认”消息。

如果 DHCP 服务器允许此请求,则 dhcpagent 可以使用它在系统关闭时写入磁盘的信息。如果服务器不允许客户机使用此信息,则 dhcpagent 将启动DHCP 的工作原理中所述的 DHCP 协议序列。因此,客户机将获取新的网络配置信息。

启用和禁用 Oracle Solaris : DHCP 客户机

要在已经运行 Oracle Solaris : 但没有使用 DHCP 的系统上启用 DHCP 客户机,您必须首先取消配置系统。引导系统时,您必须发出某些命令以设置系统并启用 DHCP 客户机。


注 –

在许多部署中,常见做法是使用静态 IP 地址设置基础结构的关键部分,而不是使用 DHCP。确定网络中哪些设备(例如路由器和某些服务器)应该是客户机,哪些设备不应该是客户机,不在本指南讨论范围内。


Procedure如何启用 Oracle Solaris : DHCP 客户机

仅当安装 Oracle Solaris : 期间没有启用 DHCPv4 时,才有必要执行此过程。对于 DHCPv6,从来不需要执行此过程。

  1. 成为客户机系统上的超级用户。

  2. 如果此系统使用预配置而不是交互式配置,请编辑 sysidcfg 文件。将 dhcp 子项添加到 sysidcfg 文件内的 network_interface 关键字中。

    例如,network_interface=hme0 {dhcp}。有关更多信息,请参见 sysidcfg(4) 手册页。

  3. 取消配置系统并关闭系统。


    # sys-unconfig
    

    有关使用此命令删除的配置信息的更多信息,请参见 sys-unconfig(1M) 手册页。

  4. 完成关闭之后重新引导系统。

    如果系统使用预配置,则 sysidcfg 文件中的 dhcp 子项将系统配置为在引导系统时使用 DHCP 客户机。

    如果系统不使用预配置,则重新引导系统时,会提示您提供由 sysidtool 程序给出的系统配置信息。有关更多信息,请参见 sysidtool(1M) 手册页。

  5. 当提示使用 DHCP 来配置网络接口时,指定“是”。

Procedure如何禁用 Oracle Solaris : DHCP 客户机

  1. 成为客户机系统上的超级用户。

  2. 如果使用 sysidcfg 文件预配置了系统,请从 network_interface 关键字中删除 dhcp 子项。

  3. 取消配置系统并关闭系统。


    # sys-unconfig
    

    有关使用此命令删除的配置信息的更多信息,请参见 sys-unconfig(1M) 手册页。

  4. 完成关闭之后重新引导系统。

    如果系统使用预配置,则不会提示您提供配置信息,并且也不会配置 DHCP 客户机。

    如果系统不使用预配置,则重新引导系统时,会提示您提供由 sysidtool 程序给出的系统配置信息。有关更多信息,请参见 sysidtool(1M) 手册页。

  5. 当提示使用 DHCP 来配置网络接口时,指定“否”。

DHCP 客户机管理

在系统正常操作的情况下,不需要对 Oracle Solaris : DHCP 客户机软件进行管理。dhcpagent 守护进程会在引导系统时自动启动,重新协商租用,并在关闭系统时停止。您不应直接手动启动和停止 dhcpagent 守护进程。相反,作为客户机系统上的超级用户,您可以在必要时使用 ifconfig 命令来影响 dhcpagent 对网络接口的管理。

用于 DHCP 客户机的 ifconfig 命令选项

本节汇总了 ifconfig(1M) 手册页中介绍的命令选项。这些命令的 DHCPv4 版本与 DHCPv6 版本之间的唯一区别是 "inet6" 关键字。运行 DHCPv6 时使用 "inet6" 关键字,但是在运行 DHCPv4 时忽略它。

使用 ifconfig 命令可以执行以下操作:

设置 DHCP 客户机配置参数

客户机系统上的 /etc/default/dhcpagent 文件包含 dhcpagent 的可调参数。您可以使用文本编辑器来更改多个影响客户机操作的参数。/etc/default/dhcpagent 文件记录完好,因此,有关更多信息,请参阅此文件和 dhcpagent(1M) 手册页。

/etc/dhcp.interface 文件是另一个设置影响 DHCP 客户机的参数的位置。系统启动脚本将在此文件中设置的参数与 ifconfig 命令一起使用。但是,这仅影响 DHCPv4。没有 DHCPv6 等效项。

缺省情况下,DHCP 客户机配置如下:

对于 DHCPv4

对于 DHCPv4 和 DHCPv6

具有多个网络接口的 DHCP 客户机系统

DHCP 客户机可以同时管理一个系统上的多个不同接口。接口可以是物理接口,也可以是逻辑接口。每个接口都有自己的 IP 地址和租用时间。如果为 DHCP 配置多个网络接口,则客户机会分别发出请求以配置这些接口。客户机为每个接口分别保留了一组网络配置参数。虽然参数是分别存储的,但是某些参数仍具有全局性。全局参数应用于整个系统,而不是应用于特定的网络接口。

主机名、NIS 域名和时区是全局参数的示例。对于每个接口,全局参数通常具有不同的值。但是,只有一个值可以用于与每个系统关联的每个全局参数。为确保对每个全局参数的查询只有一个答案,仅使用主网络接口的参数。对于要视为主接口的接口,您可以在 /etc/dhcp.interface 文件中插入关键字 primary。如果没有使用 primary 关键字,则会将按字母顺序列出的第一个接口视为主接口。

DHCP 客户机针对逻辑接口和物理接口执行同样的租用管理,但对逻辑接口存在以下限制:

DHCPv4 客户机主机名

缺省情况下,Oracle Solaris : DHCPv4 客户机不提供自己的主机名,因为此客户机希望 DHCP 服务器提供主机名。而且 Oracle Solaris : DHCPv4 服务器缺省配置为向 DHCPv4 客户机提供主机名。当您同时使用 Oracle Solaris : DHCPv4 客户机和 Solaris DHCPv4 服务器时,这些缺省设置会正常发挥作用。但是,当您将 Oracle Solaris : DHCPv4 客户机与某些第三方 DHCP 服务器一起使用时,客户机可能不会从服务器接收主机名。如果 Oracle Solaris : DHCP 客户机没有通过 DHCP 接收主机名,则客户机系统会在 /etc/nodename 文件中查找名称来用作主机名。如果此文件为空,则主机名将设置为 unknown

如果 DHCP 服务器在 DHCP Hostname 选项中提供了一个名称,则客户机将使用该主机名,即使 /etc/nodename 文件中放置了其他值也是如此。如果您希望客户机使用特定的主机名,则可以使客户机请求此名称。请参见以下过程。


注 –

以下过程并不适用于所有 DHCP 服务器。虽然在此过程中您要求客户机将特定的主机名发送到 DHCP 服务器并期望返回相同名称,

但是 DHCP 服务器不必考虑此请求,而且许多 DHCP 服务器都不考虑此请求。它们只是返回不同的名称。


Procedure如何使 Oracle Solaris : DHCPv4 客户机请求特定的主机名

  1. 在客户机系统上,以超级用户的身份编辑 /etc/default/dhcpagent 文件。

  2. /etc/default/dhcpagent 文件中查找 REQUEST_HOSTNAME 关键字,并按如下方式修改此关键字:


    REQUEST_HOSTNAME=yes

    如果 REQUEST_HOSTNAME 前面存在注释符号 (#),请删除 #。如果 REQUEST_HOSTNAME 关键字不存在,请插入此关键字。

  3. 在客户机系统上编辑 /etc/hostname. interface 文件以添加以下行:

    inet hostname
    

    hostname 是您希望客户机使用的名称。

  4. 键入以下命令使客户机在重新引导时执行完整的 DHCP 协商:


    # ifconfig interface dhcp release
    # reboot
    

    将删除在客户机上高速缓存的 DHCP 数据。客户机重新启动协议来请求新的配置信息,其中包含新的主机名。DHCP 服务器首先确保网络上的其他系统没有使用此主机名,然后将此主机名指定给客户机。如果配置为可以执行此操作,则 DHCP 服务器便可使用客户机的主机名来更新名称服务。

    如果您随后要更改此主机名,请重复步骤 3步骤 4

DHCP 客户机系统和名称服务

Oracle Solaris : 系统支持以下名称服务:DNS、NIS、NIS+ 和本地文件存储 (/etc/inet/hosts)。每个名称服务都只有在进行某些配置后才可用。还必须相应地设置名称服务转换器配置文件(请参见 nsswitch.conf(4)),以指明要使用的名称服务。

在 DHCP 客户机系统可以使用名称服务之前,您必须将系统配置为此名称服务的客户机。缺省情况下,除非在系统安装过程中另行配置,否则仅使用本地文件。

下表概述了与每个名称服务以及 DHCP 相关的问题。该表中还提供了一些文档链接,这些文档可帮助您针对每个名称服务设置客户机。

表 16–1 DHCP 客户机系统的名称服务客户机设置信息

名称服务  

客户机设置信息 

NIS 

如果您使用 Oracle Solaris : DHCP 将 Oracle Solaris : 网络安装信息发送到客户机系统,则可以使用包含 NISservsNISdmain 选项的配置宏。这些选项将 NIS 服务器的 IP 地址和 NIS 域名传递到客户机。然后客户机便会自动成为 NIS 客户机。

如果 DHCP 客户机系统已在运行 Oracle Solaris :,则当 DHCP 服务器将 NIS 信息发送到 DHCP 客户机时,不会在该系统上自动配置 NIS 客户机。 

如果 DHCP 服务器配置为将 NIS 信息发送到 DHCP 客户机系统,则在客户机上按如下方式使用 dhcpinfo 命令时,您可以看到为客户机提供的值:

# /sbin/dhcpinfo NISdmain

# /sbin/dhcpinfo NISservs


注 –

对于 DHCPv6,在命令中包括 -v6 和不同的协议关键字。

# /sbin/dhcpinfo -v6 NISDomain

# /sbin/dhcpinfo -v6 NISServers


将系统设置为 NIS 客户机时,请使用针对 NIS 域名和 NIS 服务器返回的值。 

您可以使用标准方法为 Oracle Solaris : DHCP 客户机系统设置 NIS 客户机,如《系统管理指南:名称和目录服务(DNS、NIS 和 LDAP)》中的第 5  章 “设置和配置 NIS 服务”所述。


提示 –

您可以编写一个使用 dhcpinfoypinit 的脚本,以便在 DHCP 客户机系统上自动配置 NIS 客户机。


NIS+ 

如果 DHCP 客户机系统的 NIS+ 客户机是使用常规方法设置的,则 DHCP 服务器在不同的时间可能会为客户机提供不同的地址。这就产生了安全性问题,因为 NIS+ 安全性包括作为配置组成部分的 IP 地址。为确保客户机每次都具有相同的地址,请使用非标准方法设置 DHCP 客户机系统的 NIS+ 客户机,此方法在将 DHCP 客户机设置为 NIS+ 客户机中介绍。

如果已经手动为 DHCP 客户机系统指定了 IP 地址,则客户机的地址始终不变。您可以使用标准方法设置 NIS+ 客户机,此方法在《System Administration Guide: Naming and Directory Services (NIS+)》中的“Setting Up NIS+ Client Machines”中介绍。

/etc/inet/hosts

对于要使用 /etc/inet/hosts 作为其名称服务的 DHCP 客户机系统,您必须设置 /etc/inet/hosts 文件。

DHCP 客户机系统的主机名将由 DHCP 工具添加到其 /etc/inet/hosts 文件中。但是,您必须将此主机名手动添加到网络中其他系统的 /etc/inet/hosts 文件中。如果 DHCP 服务器系统使用 /etc/inet/hosts 进行名称解析,则您还必须在系统上手动添加客户机的主机名。

DNS 

如果 DHCP 客户机系统通过 DHCP 接收 DNS 域名,则会自动配置客户机系统的 /etc/resolv.conf 文件。/etc/nsswitch.conf 文件也自动更新,以便将 dns 按搜索顺序附加到 hosts 行中其他名称服务的后面。有关 DNS 的更多信息,请参见《系统管理指南:名称和目录服务(DNS、NIS 和 LDAP)》

将 DHCP 客户机设置为 NIS+ 客户机

您可以在作为 DHCP 客户机的 Oracle Solaris : 系统上使用 NIS+ 名称服务。但是,如果 DHCP 服务器可以在不同的时间提供不同的地址,则这将在某种程度上绕过 NIS+ 的安全增强功能之一,即创建数据加密标准 (Data Encryption Standard, DES) 证书。出于安全考虑,请将 DHCP 服务器配置为始终提供相同地址。当您设置使用 DHCP 的 NIS+ 客户机时,请将此客户机的专有 DES 凭证添加到 NIS+ 服务器中。可以使用多种方法来创建凭证,例如使用 nisclient 脚本或 nisaddcred 命令。

生成 NIS+ 凭证时,要求客户机具有静态主机名以创建和存储这些凭证。如果您要使用 NIS+ 和 DHCP,则必须为 DHCP 客户机的所有主机名创建完全相同的凭证。这样,无论 DHCP 客户机接收何种 IP 地址和关联主机名,此客户机都可以使用相同的 DES 凭证。

以下过程显示如何为所有 DHCP 主机名创建相同的凭证。仅当您知道 DHCP 客户机使用的主机名时,此过程才有效。例如,当 DHCP 服务器生成主机名时,您便会知道客户机可能收到的主机名。

Procedure如何将 Oracle Solaris : DHCP 客户机设置为 NIS+ 客户机

要使 DHCP 客户机系统成为 NIS+ 客户机,该系统必须使用属于 NIS+ 域中其他 NIS+ 客户机系统的凭证。此过程仅为系统生成凭证,而这些凭证仅适用于登录到系统的超级用户。其他登录到 DHCP 客户机系统的用户必须在 NIS+ 服务器中具有自己专有的凭证。这些凭证根据《System Administration Guide: Naming and Directory Services (NIS+) 》中的过程进行创建。

  1. 通过在 NIS+ 服务器上键入以下命令来为客户机创建凭证:


    # nisgrep nisplus-client-name cred.org_dir > /tmp/file
    

    此命令将 NIS+ 客户机的 cred.org_dir 表项写入临时文件中。

  2. 使用 cat 命令查看此临时文件的内容。

    或者,使用文本编辑器。

  3. 复制要用于 DHCP 客户机的凭证。

    您必须复制公钥和私钥,它们是包含以冒号分隔的数字和字母的长字符串。这些凭证将粘贴到下一步发出的命令中。

  4. 通过键入以下命令来为 DHCP 客户机添加凭证:


    # nistbladm -a cname=" dhcp-client-name@nisplus-domain" auth_type=DES \
    auth_name="unix.dhcp-client-name@nisplus-domain" \
    public_data=copied-public-key \ 
    private_data=copied-private-key
    

    对于 copied-public-key,请粘贴您从临时文件中复制的公钥信息。对于 copied-private-key,请粘贴您从临时文件中复制的私钥信息。

  5. 通过在 DHCP 客户机系统上键入以下命令来将文件从 NIS+ 客户机系统远程复制到 DHCP 客户机系统:


    # rcp nisplus-client-name:/var/nis/NIS_COLD_START /var/nis
    # rcp nisplus-client-name:/etc/.rootkey /etc
    # rcp nisplus-client-name:/etc/defaultdomain /etc
    

    如果您收到“权限被拒绝”消息,则说明系统可能没有设置为允许远程复制。在这种情况下,您可以以一般用户的身份将文件复制到中间位置。然后,以超级用户的身份,将这些文件从中间位置复制到 DHCP 客户机系统上的适当位置。

  6. 通过在 DHCP 客户机系统上键入以下命令来为 NIS+ 复制正确的名称服务转换器文件:


    # cp /etc/nsswitch.nisplus /etc/nsswitch.conf
    
  7. 重新引导 DHCP 客户机系统。

    现在 DHCP 客户机系统应该可以使用 NIS+ 服务。


示例 16–1 将 Oracle Solaris : DHCP 客户机系统设置为 NIS+ 客户机

以下示例假设您有一个系统 nisei,此系统是 NIS+ 域 dev.example.net 中的 NIS+ 客户机。您还有一个 DHCP 客户机系统 dhow,并且希望将 dhow 作为 NIS+ 客户机。


(First log in as superuser on the NIS+ server)
# nisgrep nisei cred.org_dir > /tmp/nisei-cred
# cat /tmp/nisei-cred
nisei.dev.example.net.:DES:unix.nisei@dev.example.net:46199279911a84045b8e0
c76822179138173a20edbd8eab4:90f2e2bb6ffe7e3547346dda624ec4c7f0fe1d5f37e21cff63830
c05bc1c724b
# nistbladm -a cname="dhow@dev.example.net." \
auth_type=DES auth_name="unix.dhow@dev.example.net" \
public_data=46199279911a84045b8e0c76822179138173a20edbd8eab4 \
private_data=90f2e2bb6ffe7e3547346dda624ec4c7f0fe1d5f37e21cff63830\
c05bc1c724b
# rlogin dhow
(Log in as superuser on dhow)
# rcp nisei:/var/nis/NIS_COLD_START /var/nis
# rcp nisei:/etc/.rootkey /etc
# rcp nisei:/etc/defaultdomain /etc
# cp /etc/nsswitch.nisplus /etc/nsswitch.conf
# reboot

现在 DHCP 客户机系统 dhow 应该可以使用 NIS+ 服务。



示例 16–2 使用脚本添加凭证

如果您要将大量的 DHCP 客户机系统都设置为 NIS+ 客户机,则可以编写脚本。脚本可以快速将项添加到 cred.org_dir NIS+ 表中。以下示例显示了一个脚本样例。


#! /usr/bin/ksh  
# 
# Copyright (c) by Sun Microsystems, Inc. All rights reserved. 
# 
# Sample script for cloning a credential. Hosts file is already populated  
# with entries of the form dhcp-[0-9][0-9][0-9]. The entry we're cloning 
# is dhcp-001. 
#  
#  
PUBLIC_DATA=6e72878d8dc095a8b5aea951733d6ea91b4ec59e136bd3b3 
PRIVATE_DATA=3a86729b685e2b2320cd7e26d4f1519ee070a60620a93e48a8682c5031058df4
HOST="dhcp-" 
DOMAIN="mydomain.example.com"  
 
for 
i in 002 003 004 005 006 007 008 009 010 011 012 013 014 015 016 017 018 019
do         
     print - ${HOST}${i}         
     #nistbladm -r [cname="${HOST}${i}.${DOMAIN}."]cred.org_dir         
     nistbladm -a cname="${HOST}${i}.${DOMAIN}." \
         auth_type=DES auth_name="unix.${HOST}${i}@${DOMAIN}" \
         public_data=${PUBLIC_DATA} private_data=${PRIVATE_DTA} cred.org_Dir
done  
 
exit 0

DHCP 客户机事件脚本

您可以将 Oracle Solaris : DHCP 客户机设置为运行可执行程序或脚本,这些程序或脚本可执行任何适用于客户机系统的操作。出现特定的 DHCP 租用事件之后,便会自动执行称为事件脚本的程序或脚本。可以使用事件脚本来运行其他命令、程序或者脚本以响应特定的租用事件。您必须提供自己的事件脚本以使用此功能。

dhcpagent 使用以下事件关键字来标识 DHCP 租用事件:

事件关键字

说明

BOUNDBOUND6

将接口配置为用于 DHCP。客户机从 DHCP 服务器接收确认消息 (DHCPv4 ACK) 或 (DHCPv6 Reply),此消息同意租用 IP 地址的请求。成功配置接口之后,便会立即调用事件脚本。

EXTENDEXTEND6

客户机成功地延长了租用期。当客户机从 DHCP 服务器接收续订请求的确认消息之后,便会立即调用事件脚本。

EXPIREEXPIRE6

租用时间结束时租用即到期。对于 DHCPv4,将在从接口中删除租用地址,并将接口标记为关闭之前的瞬间调用事件脚本。对于 DHCPv6,将在从接口中删除最后剩余的租用地址之前调用事件脚本。

DROPDROP6

客户机结束租用,将接口从 DHCP 控制中删除。系统会在将接口从 DHCP 控制中删除之前的瞬间调用事件脚本。

RELEASERELEASE6

客户机放弃 IP 地址。在客户机释放接口上的地址并将 DHCPv4 RELEASE 或 DHCPv6 Release 包发送到 DHCP 服务器之前的瞬间调用事件脚本。

INFORMINFORM6

接口通过 DHCPv4 INFORM 或 DHCPv6 Information-Request 消息从 DHCP 服务器获取新的或更新的配置信息。当 DHCP 客户机从服务器仅获取配置参数而不获取 IP 地址租用时,将出现这些事件。

LOSS6

在租用失效期间,如果仍然存在一个或多个有效租用,则在删除失效地址之前将调用该事件脚本。被删除的那些地址标记有 IFF_DEPRECATED 标志。

如果出现以上任意一种事件,dhcpagent 都会调用以下命令:


/etc/dhcp/eventhook interface event

其中,interface 是使用 DHCP 的接口,而 event 是前面所述的事件关键字之一。例如,当 ce0 接口首次配置为用于 DHCP 时,dhcpagent 会按如下方式调用事件脚本:


/etc/dhcp/eventhook ce0 BOUND

要使用事件脚本功能,您必须执行以下操作:

事件脚本从 dhcpagent 继承其程序环境,并以 root 权限运行。如有必要,脚本可以使用 dhcpinfo 实用程序来获取有关接口的更多信息。有关更多信息,请参见 dhcpinfo(1) 手册页。

dhcpagent 守护进程将等待事件脚本在所有事件上退出。如果事件脚本在 55 秒内没有退出,则 dhcpagent 会向脚本进程发送 SIGTERM 信号。如果又经过 3 秒之后进程仍没有退出,则守护进程会发送 SIGKILL 信号以中止此进程。

dhcpagent(1M) 手册页包含一个事件脚本的示例。

示例 16–3 显示了如何使用 DHCP 事件脚本使 /etc/resolv.conf 文件的内容保持最新。当出现 BOUNDEXTEND 事件时,脚本便会替换域服务器和名称服务器的名称。当出现 EXPIREDROPRELEASE 事件时,该脚本便会从文件中删除域服务器和名称服务器的名称。


注 –

此脚本示例假设 DHCP 是域服务器名称和名称服务器名称的授权源。此脚本还假设 DHCP 控制之下的所有接口都返回相同且最新的信息。以上假设也许并不能反映您系统的具体情况。



示例 16–3 用于更新 /etc/resolv.conf 文件的事件脚本

#!/bin/ksh -p

PATH=/bin:/sbin export PATH
umask 0222

# Refresh the domain and name servers on /etc/resolv.conf

insert ()
{
	dnsservers=`dhcpinfo -i $1 DNSserv`
	if [ -n "$dnsservers" ]; then
		# remove the old domain and name servers
		if [ -f /etc/resolv.conf ]; then
			rm -f /tmp/resolv.conf.$$
			sed -e '/^domain/d' -e '/^nameserver/d' \
			    /etc/resolv.conf > /tmp/resolv.conf.$$
		fi

		# add the new domain
		dnsdomain=`dhcpinfo -i $1 DNSdmain`
		if [ -n "$dnsdomain" ]; then
			echo "domain $dnsdomain" >> /tmp/resolv.conf.$$
		fi

		# add new name servers
		for name in $dnsservers; do
			echo nameserver $name >> /tmp/resolv.conf.$$
		done
		mv -f /tmp/resolv.conf.$$ /etc/resolv.conf
	fi
}

# Remove the domain and name servers from /etc/resolv.conf

remove ()
{
	if [ -f /etc/resolv.conf ]; then
		rm -f /tmp/resolv.conf.$$
		sed -e '/^domain/d' -e '/^nameserver/d' \
		    /etc/resolv.conf > /tmp/resolv.conf.$$
		mv -f /tmp/resolv.conf.$$ /etc/resolv.conf
	fi
}

case $2 in
BOUND | EXTEND)
	insert $1
	exit 0
	;;
EXPIRE | DROP | RELEASE)
	remove
	exit 0
	;;
*)
	exit 0
	;;
esac