dhcpcd

出自 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-ui-patchedAURdhcpcd-uiAUR 的補丁版本,使用 AppIndicator 替代了GtkStatusIcon, 基於 gtk3 編譯並提供了 KDE 系統托盤圖標。

運行[編輯 | 編輯原始碼]

要為 全部 網絡接口提供服務,start/enable dhcpcd.service.

要僅為某個網絡接口提供服務,start/enable 模板單元 dhcpcd@interface.service,其中的 interface 名通過 這裡 進行查詢。

建議使用模板單元方式,不管是那種方式,都會分配一個動態 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 ID 租約時,哪些是必須的,哪些是可選的。

注意: 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 可用,DNS信息將會發送給它處理,否則, dhcpcd將會自行將DNS信息寫入/etc/resolv.conf。可以通過禁用/usr/lib/dhcpcd/dhcpcd-hooks/20-resolv.conf鉤子防止dhcpcd重寫/etc/resolv.conf文件,只需在/etc/dhcpcd.conf最後一段中添加以下內容即可:

nohook resolv.conf

或者,您可以創建一個名為/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時,可以在/etc/resolvconf.conf中設置DNS伺服器地址, 這樣,它們就不會被任何支持「resolvcconf」的軟體覆蓋。

問題解決[編輯 | 編輯原始碼]

客戶端ID(Client 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可以在不指定接口的情況下使用(enabled),然而,可能systemd-udevd試圖應用可預測的網絡接口名稱引導時導致意外的競態條件(Race Condition):

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

為了避免這種情況,請按照#運行中的描述,綁定接口後再啟用dhcpcd。然而,模板單元也有缺點,它不支持有線連接的熱插拔,如果沒有連接網線就會失敗。為了解決這個問題,詳見 #超時延遲

也可以在 dhcpcd.conf(5) 中使用denyinterfacesallowinterfaces參數來阻止dhcpcd綁定到內核名稱,例如

denyinterfaces wlan* eth*

超時延遲[編輯 | 編輯原始碼]

如果dhcpcd在單個接口上運行,且在30秒後未能獲得租約(例如,當伺服器未準備好或網線未插入時),它將退出並返回錯誤。

要讓dhcpcd無限期等待一次,請編輯(edit)接口systemd單元並將timeout參數設置為0

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

要使其無限期等待,請設置單元Restart參數為always,單元退出後將會再次重啟:

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

已知問題[編輯 | 編輯原始碼]

dhcpcd@.service 降低啟動速度[編輯 | 編輯原始碼]

在默認配置中, dhcpcd@.service 會在獲取 IP 地址後進入守護進程(dhcpcd -w )。啟用單元後,會等待 IP 地址的分配,影響啟動速度,要修正這個問題,請創建下面的 drop-in file:

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

也可以看看 FS#49685.

參閱[編輯 | 編輯原始碼]