跳转至内容

dhcpcd

来自 ArchWiki

dhcpcd 是一个 DHCP 和 DHCPv6 客户端。它是目前功能最丰富的开源 DHCP 客户端;有关功能的完整列表,请参阅 主页

注意 Roy Marples 的 dhcpcd (DHCP **客户端**守护进程) 与 Internet Systems Consortium 的 dhcpd (DHCP **服务器**守护进程) 不同。

安装

安装 dhcpcd 包。

dhcpcd-uiAURdhcpcd 守护进程的 GTK 前端,以及可选的 wpa_supplicant。它具有配置对话框和输入无线网络密码短语的能力。

运行

要为**所有**网络接口启动守护进程,请 启动/启用 dhcpcd.service

要仅为特定接口启动守护进程,请 启动/启用 模板单元 dhcpcd@interface.service,其中 interface 可以通过 网络配置#列出网络接口 找到。

建议使用模板单元;有关详细信息,请参阅 #dhcpcd 和 systemd 网络接口。无论哪种情况,您都将获得一个动态 IP 地址。要分配一个静态 IP 地址,请参阅 #静态配置文件

注意 每个网络接口应只由一个 DHCP 客户端或网络管理器管理,因此建议系统上只运行一个 DHCP 客户端或网络管理器。使用 systemctl --type=service 查找当前正在运行的服务列表,然后 停止 或重新配置有冲突的服务。

配置

主要配置在 /etc/dhcpcd.conf 中完成。有关详细信息,请参阅 dhcpcd.conf(5)。下面将重点介绍一些常用选项。

DHCP 静态路由

如果您需要添加客户端侧的静态路由,请将其添加到 /etc/dhcpcd.exit-hook。示例展示了一个新的钩子脚本,它通过网关机器 192.168.192.510.11.12.0/24 的 VPN 子网添加了一条静态路由。

/etc/dhcpcd.exit-hook
ip route add 10.11.12.0/24 via 192.168.192.5

您可以将多条路由添加到此文件中。

DHCP 客户端标识符

服务器可以通过多种方式唯一识别 DHCP 客户端:

  1. 主机名(或客户端发送的主机名值),
  2. 建立连接的网络接口控制器的 MAC 地址,与此相关的是第三种,
  3. 身份关联 ID (IAID),这是一个抽象层,用于区分单个主机上的不同用例和/或接口,
  4. DHCP 唯一标识符 (DUID)。

有关进一步说明,请参阅 RFC 3315

请求 DHCP IP 租约所需的选项是可选还是必需,取决于 DHCP 服务器的配置。

注意 dhcpcd 的默认配置通常就足够了。列出的标识符会自动确定,只有在出现问题时才需要手动更改配置。

如果 dhcpcd 的默认配置无法获取 IP,则可以在 dhcpcd.conf 中使用以下选项:

  • hostname 发送 /etc/hostname 中设置的主机名。
  • clientid 将 MAC 地址作为标识符发送。
  • iaid <interface> 推导用于 DHCP 发现的 IAID。它必须在接口块中使用(由 interface <interface> 启动,参见 [1]),但更常用的是下一个选项。
  • duid 触发使用 DUID 和 IAID 的组合作为标识符。

DUID 值设置在 /var/lib/dhcpcd/duid 中。为了高效的 DHCP 租约操作,重要的是它对系统是唯一的,并且适用于所有网络接口,而 IAID 则代表系统中每个接口的标识符(参见 RFC 4361)。

在运行动态 DNS的网络上必须小心,以确保所有三个 ID 都是唯一的。如果在 DNS 服务器上出现重复的 DUID 值(例如,在虚拟机被克隆且主机名和 MAC 已唯一但 DUID 未更改的情况下),则结果是,每个具有重复 DUID 的客户端请求租约时,服务器都会从 DNS 记录中删除前一个。

静态配置文件

必需的设置已在 网络配置 中进行解释。这些通常包括 网络接口名称、*IP 地址*、*路由器地址*和*名称服务器*。

/etc/dhcpcd.conf 中为 dhcpcd 配置静态配置文件,例如:

/etc/dhcpcd.conf
interface eth0
static ip_address=192.168.0.10/24	
static routers=192.168.0.1
static domain_name_servers=192.168.0.1 8.8.8.8

可以进行更复杂的配置,例如与 arping 选项结合。有关详细信息,请参阅 dhcpcd.conf(5)

备用配置文件

可以在 dhcpcd 中配置一个静态配置文件,并在 DHCP 租约失败时回退到该配置文件。这对于无头机器特别有用,因为静态配置文件可以用作“恢复”配置文件,以确保始终可以连接到该机器。

以下示例配置了一个 static_eth0 配置文件,其 IP 地址为 192.168.1.23,网关和名称服务器为 192.168.1.1,并使此配置文件成为接口 eth0 的备用配置。

/etc/dhcpcd.conf
# define static profile
profile static_eth0
static ip_address=192.168.1.23/24
static routers=192.168.1.1
static domain_name_servers=192.168.1.1

# fallback to static profile on eth0
interface eth0
fallback static_eth0

钩子

dhcpcd 按词法顺序执行 /usr/lib/dhcpcd/dhcpcd-hooks/ 中找到的所有脚本。有关详细信息,请参阅 dhcpcd.conf(5)dhcpcd-run-hooks(8)

  • 可以使用 nohook 选项在 dhcpcd.conf 中禁用每个脚本。
  • env 选项可用于为**所有**钩子设置环境变量。例如,您可以通过 env force_hostname=YES 强制主机名钩子始终设置主机名。

本文章或章节需要扩充。

原因:描述(至少一些)提供的钩子。(在 Talk:Dhcpcd 中讨论)

10-wpa_supplicant

通过创建符号链接来启用此钩子,这可以确保使用当前版本,即使在软件包更新后也是如此。

# ln -s /usr/share/dhcpcd/hooks/10-wpa_supplicant /usr/lib/dhcpcd/dhcpcd-hooks/

10-wpa_supplicant 钩子(如果已启用)会在无线接口上自动启动 wpa_supplicant。仅当

  • 没有 wpa_supplicant 进程已经在该接口上监听时。
  • 存在 wpa_supplicant 配置文件时。dhcpcd 检查
/etc/wpa_supplicant/wpa_supplicant-interface.conf
/etc/wpa_supplicant/wpa_supplicant.conf
/etc/wpa_supplicant-interface.conf
/etc/wpa_supplicant.conf

默认情况下,按此顺序,但可以通过将 env wpa_supplicant_conf=configuration_file_path 添加到 /etc/dhcpcd.conf 来设置自定义路径。

注意 钩子在找到的第一个配置文件处停止,因此如果您有多个 wpa_supplicant 配置文件,则应将此点考虑在内,否则 dhcpcd 可能会最终使用错误的配置文件。

如果您使用 wpa_supplicant 本身来管理无线连接,该钩子可能会创建不必要的连接事件。例如,如果您停止 wpa_supplicant,该钩子可能会再次激活接口。另外,如果您使用 netctl-autowpa_supplicant 会与 /run/network/wpa_supplicant_interface.conf 一起自动启动进行配置,因此从钩子中再次启动是不必要的,并且可能导致 /etc/wpa_supplicant/wpa_supplicant.conf 文件在启动时解析错误,该文件在默认打包版本中仅包含占位符值。

要禁用该钩子,请删除您添加的符号链接,或将 nohook wpa_supplicant 添加到 dhcpcd.conf

技巧与提示

通过禁用 ARP 探测加快 DHCP 速度

dhcpcd 包含对 DHCP 标准 (RFC 2131) 中一项建议的实现,即通过 ARP 验证分配的 IP 是否未被其他设备使用。这通常在家庭网络中不需要,因此可以通过禁用它来节省每次连接约 5 秒的时间。

/etc/dhcpcd.conf
noarp

这相当于将 --noarp 传递给 dhcpcd,并禁用上述 ARP 探测,从而加快与 DHCP 网络的速度。

移除旧的 DHCP 租约

文件 /var/lib/dhcpcd/interface.lease(其中 interface 是您拥有租约的接口名称)包含 DHCP 服务器发送的实际 DHCP 租约回复。对于无线接口,文件名是 /var/lib/dhcpcd/interface-ssid.lease,其中 ssid 是无线网络的名称。它用于确定服务器的最后一个租约,并使用其 mtime 属性来确定租约的发行时间。然后,此最后一个租约信息用于在可用时请求之前在网络上持有的相同 IP 地址。如果您不希望这样做,只需删除此文件。

如果 DHCP 服务器仍然分配相同的 IP 地址,这可能是因为服务器配置为保持分配稳定,并且识别请求的 DHCP 客户端 ID 或 DUID(参见 #DHCP 客户端标识符)。您可以通过停止 dhcpcd 并删除或重命名 /var/lib/dhcpcd/duid 来进行测试。dhcpcd 将在下次运行时生成一个新的。

请记住,DUID 的目的是作为跨越重启和接口的持久机器标识符。如果您将系统转移到新计算机,保留此文件将使其显示为旧计算机。

多重引导时的不同 IP

如果您正在双引导 Arch 和 macOS 或 Windows,并希望每个系统都获得不同的 IP 地址,您可以通过在每个操作系统安装中指定不同的 DUID 来控制租用的 IP 地址。

在 Windows 中,DUID 应存储在

\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip6\Parameters\Dhcpv6DUID 

注册表项中。

在 macOS 中,可以直接在 网络\适配器\DHCP 首选项面板 中访问。

如果您使用的是 dnsmasq DHCP 服务器,则可以在其配置文件中使用适当的 dhcp-host= 规则来使用不同的 DUID。

/etc/resolv.conf

如果 resolvconf 可用,DNS 信息将发送给它;否则,dhcpcd 本身将写入 /etc/resolv.conf

可以通过禁用钩子 /usr/lib/dhcpcd/dhcpcd-hooks/20-resolv.conf 来停止覆盖 /etc/resolv.conf。通过在 /etc/dhcpcd.conf 的最后一个部分添加以下内容来实现:

nohook resolv.conf

请注意,禁用此钩子也会禁用 resolvconf 的常规使用。

或者,您可以创建一个名为 /etc/resolv.conf.head 的文件,其中包含您的 DNS 服务器。dhcpcd 会将此文件添加到 /etc/resolv.conf 的开头。

或者,您可以配置 dhcpcd 以每次都使用相同的 DNS 服务器。为此,请在 /etc/dhcpcd.conf 的末尾添加以下行,其中 dns-server-ip-addressses 是一个以空格分隔的 DNS IP 地址列表。

static domain_name_servers=dns-server-ip-addresses

例如,将其设置为 Google 的 DNS 服务器:

static domain_name_servers=8.8.8.8 8.8.4.4
提示 使用 openresolv 时,DNS 服务器可以改为在 /etc/resolvconf.conf 中设置。这样,它们就不会被任何支持 resolvconf 的软件覆盖。

故障排除

客户端 ID

如果您在具有根据 MAC 地址过滤客户端 ID 的 DHCPv4 的网络中,您可能需要更改以下行:

/etc/dhcpcd.conf
# Use the same DUID + IAID as set in DHCPv6 for DHCPv4 Client ID as per RFC4361. 
duid

改为:

/etc/dhcpcd.conf
# Use the hardware address of the interface for the Client ID (DHCPv4).
clientid

否则,您可能无法获得租约,因为 DHCP 服务器可能无法正确读取您的 DHCPv6 风格客户端 ID。有关更多信息,请参阅 RFC 4361

先释放 IP 来检查 DHCP 问题

当 DHCP 获取了错误的 IP 分配时,可能会出现问题,例如当两个路由器通过 VPN 连接在一起时。通过 VPN 连接的路由器可能会分配 IP 地址。要解决此问题,请以 root 身份释放 IP 地址:

# dhcpcd -k

然后请求一个新的:

# dhcpcd

您可能需要多次运行这两个命令。

不兼容路由器的问题

对于某些(不兼容的)路由器,除非您注释掉以下行:

require dhcp_server_identifier

/etc/dhcpcd.conf 中。这通常不会引起问题,除非您的网络中有多个 DHCP 服务器(不常见);有关更多信息,请参阅 此页面

dhcpcd 和 systemd 网络接口

dhcpcd.service 可以 启用而无需指定接口。但是,这可能会在启动时与 systemd-udevd 尝试应用可预测的网络接口名称产生竞态条件。

error changing net interface name wlan0 to wlp4s0: Device or resource busy" 

为避免此问题,请在 dhcpcd.conf(5) 中使用 denyinterfacesallowinterfaces 来阻止 dhcpcd 绑定到内核名称,例如:

denyinterfaces wlan* eth*

也可以在每个接口的基础上启用 dhcpcd,如 #Running 中所述。但是,模板单元的缺点是它不支持有线连接的热插拔,并且在未连接网络电缆时会失败。要解决此失败,请参阅 #Timeout delay

超时延迟

如果 dhcpcd 操作于单个接口,并且在 30 秒后未能获得租约(例如,当服务器未准备好或电缆未插入时),它将以错误退出。

要让 dhcpcd 无限期等待一次,请 编辑单元并将 timeout 选项设置为 0

/etc/systemd/system/dhcpcd@.service.d/timeout.conf
[Service]
ExecStart=
ExecStart=/usr/bin/dhcpcd -w -q -t 0 %I

要让它无限期等待,请让单元在退出后重新启动。

/etc/systemd/system/dhcpcd@.service.d/dhcpcdrestart.conf
[Service]
Restart=always

已知问题

dhcpcd@.service 导致启动缓慢

默认情况下,dhcpcd@.service 在通过 dhcpcd-w 标志后台启动之前会等待获取 IP 地址。如果启用了该单元,这可能会导致启动在继续之前等待 IP 地址。要解决此问题,请为该单元创建一个 drop-in 文件,内容如下:

/etc/systemd/system/dhcpcd@.service.d/no-wait.conf
[Service]
ExecStart=
ExecStart=/usr/bin/dhcpcd -b -q %I

另请参阅 FS#49685

参见

© . This site is unofficial and not affiliated with Arch Linux.

Content is available under GNU Free Documentation License 1.3 or later unless otherwise noted.