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。示例展示了一个新的钩子脚本,它通过网关机器 192.168.192.5 向 10.11.12.0/24 的 VPN 子网添加了一条静态路由。
/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 IP 租约所需的选项是可选还是必需,取决于 DHCP 服务器的配置。
如果 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强制主机名钩子始终设置主机名。
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 本身来管理无线连接,该钩子可能会创建不必要的连接事件。例如,如果您停止 wpa_supplicant,该钩子可能会再次激活接口。另外,如果您使用 netctl-auto,wpa_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
/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) 中使用 denyinterfaces 或 allowinterfaces 来阻止 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。