跳至內容
出自 Arch Linux 中文维基

dhcpcd 是 DHCP 和 DHCPv6 客戶端,是目前功能最豐富的開源 DHCP 客戶端。項目主頁包含了完整的功能列表。

注意:Roy Marple 的 dhcpcd(DHCP client daemon)和 Internet Systems Consortium 的 dhcpd(DHCP (server) daemon)是不同的軟體。

安裝

安裝軟體包 dhcpcd

dhcpcd-uiAUR 是 dhcpcd 和 GTK 前端,提供了對 wpa_supplicant 的可選支持。功能包括配置對話框、輸入無線網絡的密碼等。

運行

要為所有的網絡接口啟動守護進程,啟動或啟用 dhcpcd.service

要單獨為指定的網絡接口啟動守護進程,啟動或啟用模板單元 dhcpcd@interface.service,其中的 interface 名可從這裡查詢。

建議使用模板單元方式,詳情請參閱 #dhcpcd 和 systemd 網絡接口。無論哪種方式都會分配一個動態 IP 地址。要分配靜態 IP 地址,請參閱 #靜態配置

配置

主配置文件是 /etc/dhcpcd.conf,詳情請參考 dhcpcd.conf(5),下面會介紹一些常用選項。

DHCP 靜態路由

如果要在客戶端設置靜態路由,請使用 /etc/dhcpcd.exit-hook。下面的例子中添加了一個 VPN 子網 10.11.12.0/24 到網關 192.168.192.5 的靜態路由:

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

可以在文件中配置多個路由。

DHCP 客戶端標識

伺服器可以通過下列方式不同的 DHCP 客戶端:

  1. 主機名(或客戶端發送的主機名),
  2. 所用網卡的 MAC 地址,
  3. Identity Association ID(身份關聯 ID IAID),區分不同使用場景或接口的標識,
  4. DHCP 唯一標識(DUID)。

詳情請參考 RFC 3315

DHCP 伺服器通過配置決定申請 DHCP IP 租約時,哪些是必須的,哪些是可選的。

注意:dhcpcd 默認配置的是最常用的方式。伺服器會自動確認上述標識,只有在出現問題時才需要額外配置。

如果無法通過 dhcpcd 默認配置獲取 IP 地址,可以在 dhcpcd.conf 中嘗試如下配置:

  • hostname 發送 /etc/hostname 中配置的主機名
  • clientid 發送 MAC 地址作為標識
  • iaid <interface> 生成並發送 IAID,可以在接口塊(interface <interface>)中使用,參考:[1]),下面的選項更常用:
  • duid 將聯合使用 DUID 和 IAID 作為標識。

DUID 的數值配置在 /var/lib/dhcpcd/duid 中,為了保證 DHCP 租約的有效性,需要保證 DUID 在整個網絡中是唯一的,而 IAID 需要能區分每一個接口(RFC 4361)。

如果運行的是動態 DNS,請確保三個都是唯一的。如果網絡中出現重複的 DUID,例如克隆的虛擬機中,有不同的主機名和 MAC 地址,但是沒有修改 DUID 時,最新獲取IP位址的客戶端會清除之前 DUID 獲取的地址。

靜態配置

需要的配置在網絡配置中均有說明,通常包含網絡接口名稱、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 靜態地址,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

這篇文章的某些內容需要擴充。

原因:describe (at least some) provided hooks. (在 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_supplient 配置文件,則應該考慮到這一點,否則「dhcpcd」可能會使用錯誤的配置文件。

如果您通過 wpa_supplicant 管理您的無線連接,鉤子可能會創建一些不必要的連接事件。例如,如果您關閉了 wpa_supplicant,鉤子可能會使無線接口再次打開。此外,如果您正在使用 netctl-autowpa_supplicant 將會根據 /run/network/wpa_supplicant_interface.conf 配置文件自動啟動。因此,從鉤子重新啟動接口是不必要的,並且可能會導致 /etc/wpa_supplicant/wpa_supplicant.conf 文件在啟動時解析錯誤,因為該文件在默認打包的版本中只包含虛擬的預設值。通過移出添加鉤子的符號連結以禁用鉤子,或者向 dhcpcd.conf 中添加 nohook wpa_supplicant 參數以解決這個問題。

小技巧

禁用 ARP 探測加速 DHCP 響應

dhcpcd 在內部實現了 DHCP 標準提議(RFC 2131),以通過 ARP 探測驗證指定 IP 地址是否已被其他設備使用,在家庭網絡環境下這通常是不必要的,因此,可以通過禁用 ARP 探測在每次連接時節約 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 地址,可能是因為伺服器被配置為保持固定分配並且識別出了客戶端發送的客戶端 id(client 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 中可以在 Network\adapter\dhcp preferences panel 中直接訪問修改。

如果您使用 dnsmasq 作為 DHCP 伺服器,可以在其配置文件中通過恰當指定 dhcp-host= 規則來使用不同的 DUID。

/etc/resolv.conf

如果系統上 resolvconf英語resolvconf 可用,DNS 信息將會發送給它處理,否則,dhcpcd 將會自行將 DNS 信息寫入 /etc/resolv.conf。可以通過禁用 /usr/lib/dhcpcd/dhcpcd-hooks/20-resolv.conf 鉤子防止 dhcpcd 重寫 /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
提示:當使用 openresolv英語openresolv 時,可以在 /etc/resolvconf.conf 中設置 DNS 伺服器地址,這樣,它們就不會被任何支持 resolvcconf 的軟體覆蓋。

問題解決

客戶端 ID

如果您處在根據 MAC 地址過濾客戶端 ID 的 DHCPv4 的網絡中,則可能需要更改以下行:

/etc/dhcpcd.conf

# 根據 RFC4361,DHCPv4 使用和 DHCPv6 相同的 DUID+IAID 作為客戶端 ID。
duid

改為:

/etc/dhcpcd.conf
# 使用接口的硬體地址作為客戶端 ID(DHCPv4)。
clientid

否則,您可能無法獲得租約,因為 DHCP 伺服器可能無法正確讀取 DHCPv6-風格的客戶端 ID。有關更多信息,請參閱 RFC 4361

通過先釋放 IP 地址檢查 DHCP 問題

此問題可能在 DHCP 獲得錯誤的 IP 分配時發生,例如當兩個路由器通過 VPN 相連時。路由器通過 VPN 連接分配到了地址。要修復該問題,請以 root 身份釋放該 IP 地址:

# dhcpcd -k

然後請求一個新地址:

# dhcpcd

您可能需要多次運行這兩個命令。

路由器不兼容導致的問題

對於某些(不兼容的)路由器,除非您注釋掉 /etc/dhcpcd.conf 中的以下行,否則無法正確連接。

require dhcp_server_identifier

除非您的網絡上有多個 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。但是,模板單元也有缺點,它不支持有線連接的熱插拔,且如果沒有連接網線就會失敗。為解決這個問題,請參見 #超時延遲

超時延遲

如果 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 的標識 -w 會使 dhcpcd@.service 在進入後台守護進程前等待 IP 地址的獲取。如果啟用了該單元,可能會導致啟動時暫停並等待 IP 地址分配以繼續啟動流程。要修復該問題,請為該單元創建如下的附加配置片段

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

另請參閱 FS#49685

參閱