dhcpagent - 动态主机配置协议 (Dynamic Host Configuration Protocol, DHCP) 客户机守护进程
/usr/sbin/dhcpagent
dhcpagent 为运行 Oracle Solaris 软件的计算机实现客户机部分的动态主机配置协议 (Dynamic Host Configuration Protocol, DHCP)。
dhcpagent 守护进程从 DHCP 服务器获取客户机(本地)计算机的网络接口的配置参数。这些参数可包括对某个 IP 地址的租用,客户机通过该租用在租期内使用该地址,租期可以是无限期。如果客户机希望在比租期更长的时间内使用该 IP 地址,则客户机必须使用 DHCP 协商租期延长。因此,dhcpagent 必须以守护进程的形式运行,只有客户机关机时才可以终止。
dhcpagent 守护进程由服务管理工具 (service management facility, SMF) 使用故障管理资源标识符 (fault management resource identifier, FMRI) 进行管理:
svc:/network/dhcp/client:default
对于 IPv4,当创建 DHCP 地址时,服务由 ipadm 或 ifconfig 自动启动。对于 IPv6,服务由 in.ndpd(8) 自动启动。
被调用时,dhcpagent 将进入被动状态,等待来自 ipadm(8)、ifconfig(8) 或 in.ndpd(8) 的指令。当它收到配置接口的命令时,它将初启该接口(如有必要)并启动 DHCP。完成 DHCP 后,可以查询 dhcpagent 以获取各种网络参数的值。此外,如果使用 DHCP 来获取接口的地址租用,它将配置该地址以供使用。获取租用后,会根据需要自动对其进行续延。如果无法续延租用,dhcpagent 将取消配置该地址,但接口将保留启动状态,并且 dhcpagent 将尝试获取新的地址租用。dhcpagent 监视系统的暂停/恢复事件并在恢复时通过 DHCP 服务器验证所有非永久性租用。同样,dhcpagent 监视链路的连接/断开事件,并在断开的链路恢复连接时通过 DHCP 服务器验证所有非永久性租用。如果服务器指出现有租用不再有效,租用验证机制将重新启动 DHCP。如果联系不到服务器,则现有租用将继续。可使用 ipadm 实用程序中的 "verified-lease-only" 属性来修改此行为。有关此属性的更多信息,请参见 ipadm(8) 手册页。
对于 IPv4,如果发现配置的接口被取消激活或其 IP 地址、子网掩码或广播地址与从 DHCP 获取的不同,DHCP 控制将放弃该接口。
对于 IPv6,dhcpagent 将针对服务器提供的 IPv6 地址视需要自动激活和取消激活逻辑接口。IPv6 前缀长度(网络掩码)不由 DHCPv6 协议设置,而是由 in.ndpd(8) 使用路由器通告获取的前缀信息进行设置。如果 dhcpagent 创建的任何逻辑接口被取消激活,或配置了不同的 IP 地址,DHCP 控制将放弃该接口。如果链路本地接口被取消激活,DHCP 在该物理接口上配置的所有地址都将被删除。
除 DHCP 外,dhcpagent 还支持 BOOTP(仅限 IPv4)。请参见《RFC 951, Bootstrap Protocol》。从 BOOTP 服务器获取的配置参数与从 DHCP 服务器收到的参数享有同等对待,不同之处在于从 BOOTP 服务器收到的 IP 地址始终具有无限期租用。
DHCP 还可以充当一种机制来配置客户机所需的其他信息,例如路由器的域名和地址信息。除了 IP 地址、网络掩码、广播地址和缺省路由器(后三项仅针对 IPv4),代理不直接配置工作站,而是充当可由其他程序(特别是由 dhcpinfo(1))查询的数据库。
在具有一个接口的客户机上,这非常简单。具有多个接口的客户机可能出现困难,因为可能需要合并不同接口上抵达的一些信息,或者这些信息可能存在不一致。此外,由于接口的配置是异步的,因此请求可能在某些或全部接口都仍处于未配置状态时抵达。为处理这些情形,可以将一个接口指定为主要接口,从而该接口在未请求特定接口时将成为 DHCP 参数值的权威来源。有关详细信息,请参见 dhcpinfo(1) 和 ifconfig(8)。
dhcpagent 发送的所有 DHCP 数据包均包括一个供应商类标识符(RFC 2132,选项代码 60;RFC 3315,选项代码 16)。此标识符与 uname –i 命令返回的平台名称相同,除了:
平台名称中的所有逗号已变为句点。
如果该名称的开头不是一个股票代码和一个逗号,将自动为其添加 SUNW 前缀。
dhcpagent 使用以下 ipadm DHCP 和 addrconf 类型的地址对象属性:
verified-lease-only
offer-wait
client-id
param-request-list
param-ignore-list
有关这些属性的定义,请参见 ipadm(8) 手册页。
可使用同名的 ipadm DHCPv4 和 DHCPv6 协议属性来指定这些属性的系统范围缺省值。
dhcpagent 守护进程写入以下五个类别的信息和错误消息:
关键消息指示妨碍正常操作的服务器状况。
错误消息是由于资源耗尽和其他意外的系统调用失败而导致的重要事件,其中一些事件不可恢复;忽略错误可能导致功能降级。
警告指示严重性稍低的一些问题,大多情况下描述从服务器收到了不寻常或不正确的数据报,或无法提供所请求的服务。
信息性消息提供对于在站点中调试 DHCP 配置有用的关键信息。信息性消息一般由 –v 选项控制。不过,某些关键信息(如 IP 地址)始终都会提供。
可以生成两个不同详细级别的调试消息,这些消息主要有利于有权访问源代码的用户,但在调试较难的 DHCP 配置问题时也可能有用。仅当设置了使用 config/debug SMF 属性时,才会生成调试消息。
如果将可执行文件(二进制或脚本)放置在 /etc/dhcp/eventhook 处,dhcpagent 守护进程将在发生以下任何事件时自动运行该程序:
这些事件发生在接口配置期间。当 dhcpagent 从 DHCP 服务器收到针对地址租用请求的 DHCPv4 ACK 或 DHCPv6 DHCPv6 Reply 消息时,将调用该事件程序,指示已成功对接口进行初始配置。(另请参见 INFORM 和 INFORM6 事件,在获取配置参数而不包括地址租用时发生这两个事件。)
在租用延长期间发生这些事件。dhcpagent 从 DHCP 服务器收到针对 DHCPv4 REQUEST(续延)消息或 HCPv6 Renew 或 Rebind 消息的 DHCPv4 ACK 或 DHCPv6 Reply 后即调用该事件程序。
请注意,对于 DHCPv6,服务器可能选择在给定 Reply 消息中删除一些地址、添加新的地址租用以及忽略(允许到期)其余地址。当收到的 Reply 中保留一个或多个地址仍然有效时,将发生 EXTEND6 事件,即使 Reply 消息未扩展任何地址租用也是如此。在删除任何地址之前但添加任何新地址之后即调用该事件程序。要删除的地址将标记 IFF_DEPRECATED 标志。
在租用失效期间发生这些事件。对于 DHCPv4,从接口中删除租用的地址前调用该事件程序。对于 DHCPv6,从接口中删除剩余的最后一个租用地址前调用该事件程序。
这些事件发生在接口被删除期间。从 DHCP 控制中删除接口前调用该事件程序。如果接口因用户取消激活接口而被放弃,则此事件将在已执行用户的操作后发生。接口可能不存在。
当接口通过 DHCPv4 INFORM 或 DHCPv6 Information-Request 消息从 DHCP 服务器获取新的或更新的配置信息时,将发生这些事件。当设置了 DHCPv6 路由器通告 O(字母 0)位而位设置 M 位时,使用 ifconfig(8) dhcp inform 命令发送这些消息。因此,当 DHCP 客户机仅从服务器获取配置参数而未获取 IP 地址租用时,将发生这些事件。
租用期满而一个或多个有效的租用仍然存在时,发生该事件。删除过期地址前调用该事件程序。删除的地址将标记 IFF_DEPRECATED 标志。
请注意,该事件与收到 Reply 消息没有关联,后者仅在一个或多个有效租用仍然存在时发生,且仅针对 DHCPv6 发生。如果所有租用均已期满,则转而发生 EXPIRE6 事件。
在释放租用地址期间发生该事件。在 dhcpagent 放弃接口的地址并向 DHCP 服务器发送 DHCPv4 RELEASE 或 DHCPv6 Release 数据包前调用该事件程序。
系统不提供缺省事件程序。文件 /etc/dhcp/eventhook 应由 root 所有并采用模式 755。
将向该事件程序传递两个参数:接口名称和事件名称。对于 DHCPv6,接口名称是物理接口的名称。
该事件程序可使用 dhcpinfo(1) 实用程序获取接口的其他信息。当发生上述每个事件而调用该事件程序时,该程序可忽略它不关注的那些事件。该事件程序使用与 dhcpagent 本身相同的权限和环境运行,只是 stdin、stdout 和 stderr 被重定向到 /dev/null。请注意,这意味着该事件程序使用 root 权限运行。
如果事件程序调用在 55 秒后未退出,将向其发送 SIGTERM 信号。如果在之后三秒内仍未退出,SIGKILL 信号会将其终止。
有关事件程序示例,请参见“示例”部分。
dhcpagent 守护进程支持以下 SMF 属性。
将调试级别设置为 n。当前有 1 和 2 两种调试级别。后者更为详细。
提供对调试站点配置问题有用的详细输出。
以下脚本存储在文件 /etc/dhcp/eventhook 中,由 root 所有并采用模式 755。在发生文件中所列出的事件时对其进行调用。
#!/bin/sh ( echo "Interface name: " $1 echo "Event: " $2 case $2 in "BOUND") echo "Address acquired from server "\ `/usr/sbin/dhcpinfo -i $1 ServerID` ;; "BOUND6") echo "Addresses acquired from server " \ `/usr/sbin/dhcpinfo -v6 -i $1 ServerID` ;; "EXTEND") echo "Lease extended for " \ `/usr/sbin/dhcpinfo -i $1 LeaseTime`" seconds" ;; "EXTEND6") echo "New lease information obtained on $i" ;; "EXPIRE" | "DROP" | "RELEASE") ;; esac ) >/var/run/dhcp_eventhook_output 2>&1
指明将 stdout 和 stderr 重定向到文件。
包含接口配置。只是存在该文件并不表明配置是正确的,因为租用可能已过期。在启动时,dhcpagent 使用 REQUEST (DHCPv4) 或 Confirm (DHCPv6) 来确认地址是否有效。
包含 DUID(DHCP Unique Identifier,DHCP 唯一标识符)和 IAID(Identity Association Identifier,身份关联标识符)值的持久性存储。这些文件的格式未记录,应用程序不应读写这些文件。
DHCP 事件程序的位置。
有关下列属性的说明,请参见 attributes(7):
|
dhcpinfo(1)、ipadm(8)、syslog(3C)、attributes(7)、dhcp(7)、ifconfig(8)、in.mpathd(8)、in.ndpd(8)、init(8)
由 Croft, B. 和 Gilmore, J. 合著的《Bootstrap Protocol (BOOTP)》RFC 951,Network Working Group 出版,1985 年 9 月。
由 Droms, R. 编著的《Dynamic Host Configuration Protocol》,RFC 2131,Network Working Group 出版,1997 年 3 月出版。
由 Lemon, T. 和 B. Sommerfeld. 合著的《Node-specific Client Identifiers for Dynamic Host Configuration Protocol Version Four (DHCPv4)》,RFC 4361。Nominum 和 Sun Microsystems 出版。2006 年 2 月。
由 Droms, R. 编著的《Dynamic Host Configuration Protocol for IPv6 (DHCPv6)》,RFC 3315。Cisco Systems 出版。2003 年 7 月。
dhcpagent 守护进程可以用于 IPv4 逻辑接口,使用方式与同物理接口一起使用时一样。用于逻辑接口时,该守护进程会基于 DUID 和 IAID 值自动构造客户机 ID(根据 RFC 4361)。当使用 ipadm 创建地址时,可指定 "client-id" 属性,如果提供,它将覆盖此自动标识符。
与物理 IPv4 接口不同的是,dhcpagent 不会添加或删除与逻辑接口关联的缺省路由。
可以在 IPMP IP 接口上执行 DHCP 以获取和维护 IPMP 数据地址。因为 IPMP IP 接口没有硬件地址,所以该守护进程将使用上述用于 IPv4 逻辑接口的同一方法自动构造客户机 ID。此外,缺少硬件地址意味着该守护进程必须在 IPMP IP 接口上的所有 DISCOVER 和 REQUEST 消息中设置“广播”标志。一些 DHCP 服务器可能会拒绝此类请求。
可以对属于某个 IPMP 组的 IP 接口执行 DHCP(以获取和维护测试地址)。该守护进程将自动在每个测试地址上设置 NOFAILOVER 和 DEPRECATED 标志。此外,在这种情况下,该守护进程将不会添加或删除缺省路由。请注意,实际的 DHCP 数据包交换可以通过 IPMP 组中的任何活动 IP 接口执行。强烈建议将测试地址的租用设为无限期。否则,只有探测器才可以检测到的长期网络中断可能导致测试地址的租用期满,从而导致 in.mpathd(8) 返回到基于链路的故障检测并触发错误的修复。