dhcpcd
dhcpcd 是 DHCP 和 DHCPv6 客戶端,是目前功能最豐富的開源 DHCP 客戶端。項目主頁包含了完整的功能列表。
安裝[編輯 | 編輯原始碼]
dhcpcd-uiAUR 是 dhcpcd 和 GTK 前端,提供了對 wpa_supplicant 的可選支持。功能包括配置對話框、輸入無線網絡的密碼等。 dhcpcd-ui-patchedAUR 是 dhcpcd-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 客戶端:
- 主機名 (或客戶端發送的主機名),
- 所用網卡的 MAC 地址,
- Identity Association ID (身份關聯ID IAID),區分不同使用場景或接口的標識,
- DHCP 唯一標識 (DUID).
詳情請參考 RFC 3315.
DHCP 服務器通過配置決定申請 DHCP ID 租約時,哪些是必須的,哪些是可選的。
如果無法通過 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
.
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
文件在啟動時解析錯誤,因為該文件在默認打包的版本中只包含虛擬的預設值。通過移出添加鈎子的符號鏈接以禁用鈎子,或者向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
/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) 中使用denyinterfaces
或allowinterfaces
參數來阻止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.