dhcpcd
dhcpcd 是一个 DHCP 和 DHCPv6 客户端。它是目前功能最丰富的开源 DHCP 客户端;请访问主页查看完整的功能列表。
安装
dhcpcd-uiAUR 是一个 dhcpcd 守护进程的 GTK 前端,并且可以选择 wpa_supplicant。它具有配置对话框和输入无线网络密码的功能。
运行
要为所有网络接口启动守护进程,启动/启用 dhcpcd.service
。
要仅为特定接口启动守护进程,启动/启用 模板单元 dhcpcd@interface.service
,其中 interface 可以通过 网络配置#列出网络接口 找到。
建议使用模板单元;有关详细信息,请参阅 #dhcpcd 和 systemd 网络接口。在任何一种情况下,您都将被分配一个动态 IP 地址。要分配静态 IP 地址,请参阅 #静态配置文件。
systemctl --type=service
查找当前正在运行的服务列表,然后 停止 或重新配置那些冲突的服务。配置
主要配置在 /etc/dhcpcd.conf
中完成。有关详细信息,请参阅 dhcpcd.conf(5)。下面重点介绍一些常用选项。
DHCP 静态路由
如果您需要在客户端添加静态路由,请将其添加到 /etc/dhcpcd.exit-hook
。该示例显示了一个新的 hook 脚本,该脚本通过网关机器 192.168.192.5
向 VPN 子网 10.11.12.0/24
添加静态路由
/etc/dhcpcd.exit-hook
ip route add 10.11.12.0/24 via 192.168.192.5
您可以向此文件添加多条路由。
DHCP 客户端标识符
DHCP 客户端可以通过服务器以不同的方式进行唯一标识
- 主机名(或客户端发送的主机名值),
- 正在建立连接的网络接口控制器的 MAC 地址,与此相关的是第三个,
- 身份关联 ID (IAID),这是一个抽象层,用于区分单个主机上的不同用例和/或接口,
- DHCP 唯一标识符 (DUID)。
有关更多描述,请参阅 RFC 3315。
这取决于 DHCP 服务器配置,哪些选项是可选的或必需的,以请求 DHCP IP 租约。
如果 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
配置文件,其中 192.168.1.23
作为 IP 地址,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)。
- 可以使用
dhcpcd.conf
中的nohook
选项禁用每个脚本。 env
选项可用于为所有钩子设置环境变量。例如,您可以强制主机名钩子始终使用env force_hostname=YES
设置主机名。
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
默认情况下,按该顺序,但可以通过在 /etc/dhcpcd.conf
中添加 env wpa_supplicant_conf=configuration_file_path
来设置自定义路径。
如果您使用 wpa_supplicant 本身管理无线连接,则该钩子可能会创建不需要的连接事件。例如,如果您停止 wpa_supplicant,则该钩子可能会再次启动接口。此外,如果您使用 netctl-auto,则会使用 /run/network/wpa_supplicant_interface.conf
作为配置自动启动 wpa_supplicant,因此从钩子再次启动它是没有必要的,并且可能会导致启动时解析 /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。
请记住,DUID 旨在作为跨重启和接口的持久机器标识符。如果您要将系统转移到新计算机,则保留此文件应使其看起来像旧计算机。
多重启动时使用不同的 IP
如果您正在双启动 Arch 和 macOS 或 Windows,并且希望每个操作系统都接收不同的 IP 地址,则可以通过在每个操作系统安装中指定不同的 DUID 来控制租用的 IP。
在 Windows 中,DUID 应存储在
\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip6\Parameters\Dhcpv6DUID
注册表项中。
在 macOS 上,可以直接在 Network\adapter\dhcp preferences panel
中访问。
如果您正在使用 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
请注意,禁用此钩子也会禁用 dhcpcd 对 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
/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
然后请求一个新的 IP 地址
# 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) 中使用 denyinterfaces
或 allowinterfaces
来阻止 dhcpcd 绑定到内核名称,例如
denyinterfaces wlan* eth*
也可以按照 #运行 中所述,在每个接口的基础上启用 dhcpcd。但是,模板单元的缺点是它不支持有线连接的热插拔,并且如果未连接网线,则会失败。要解决此故障,请参阅 #超时延迟。
超时延迟
如果 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
等待获取 IP 地址,然后通过 dhcpcd 的 -w
标志在后台分叉。如果启用了该单元,则可能会导致启动在继续之前等待 IP 地址。要解决此问题,请为该单元创建一个 drop-in 文件,其中包含以下内容
/etc/systemd/system/dhcpcd@.service.d/no-wait.conf
[Service] ExecStart= ExecStart=/usr/bin/dhcpcd -b -q %I
另请参阅 FS#49685。