23.3. DHCP 伺服器 dhcpd

任何 DHCP 系統的核心都是動態主機組態通訊協定精靈。這個伺服器會依照組態檔 /etc/dhcpd.conf 中定義的設定,出租位址並監看其使用情形。藉由變更此檔案中的參數及值,系統管理員可以透過數種方式影響程式的行為。請參閱 範例 23.1, "組態檔 /etc/dhcpd.conf" 中的 /etc/dhcpd.conf 基本範例檔案。

範例 23.1. 組態檔 /etc/dhcpd.conf

default-lease-time 600;         # 10 minutes
max-lease-time 7200;            # 2  hours

option domain-name "cosmos.all";
option domain-name-servers 192.168.1.1, 192.168.1.2;
option broadcast-address 192.168.1.255;
option routers 192.168.1.254;
option subnet-mask 255.255.255.0;

subnet 192.168.1.0 netmask 255.255.255.0
 {
  range 192.168.1.10 192.168.1.20;
  range 192.168.1.100 192.168.1.200;
 }

這個簡單的組態檔應足以讓 DHCP 伺服器指定網路中的 IP 位址。請確定每行結尾都插入分號,否則不會啟動 dhcpd。

範例檔可以分為三個部分。第一個部份定義要求用戶端申請續約前 IP 位址預設的租用秒數 (default-lease-time)。其中也包含機器保留 DHCP 伺服器指定之 IP 位址、不用申請續約的最長時間的陳述式 (max-lease-time)。

在第二部份中,一些基本網路參數定義於全域層級:

檔案的最後一個部分定義網路,包括子網路遮罩。為了完成,指定 DHCP 精靈用來指定 IP 位址給有關用戶端的位址範圍。在 範例 23.1, "組態檔 /etc/dhcpd.conf" 中,用戶端的指定位址可介於 192.168.1.10192.168.1.20 之間以及 192.168.1.100192.168.1.200 之間。

編輯這幾行後,應該能夠使用指令 rcdhcpd start 啟動 DHCP 精靈。應該是立即就能使用。使用指令 rcdhcpd check-syntax 執行簡短的語法檢查。如果在組態上遇到沒有預期的問題,例如伺服器出現錯誤而中止或在啟動時沒有傳回 done,則查詢主系統記錄 /var/log/messages 或主控台 10 (Ctrl-Alt-F10) 上的資訊,應該就可找出問題所在。

在預設 SUSE Linux 系統上,為了安全的緣故,會在 chroot 環境中啟動 DHCP 精靈。組態檔必須複製到 chroot 環境,如此精靈才可以找到這些檔案。通常是不需要擔心發生這種情形,因為指令 rcdhcpd start 會自動複製檔案。

23.3.1. 使用固定 IP 位址的用戶端

DHCP 也可以用來指定預先定義的靜態位址給特定用戶端。明確指定的位址永遠比集區的動態位址優先採用。當可用位址不足,伺服器必須在用戶端之間重新分配位址時 (舉例而言),動態位址便會過期,靜態位址則不同,它永遠不會過期。

若要識別設定為靜態位址的用戶端,dhcpd 會使用硬體位址,這是全球唯一、固定的數字代碼,由六對八位元組組成,用來識別所有網路設備 (例如,00:00:45:12:EE:F4)。如果相對的行 (如 範例 23.2, "組態檔的增加部分" 中所示) 新增到 範例 23.1, "組態檔 /etc/dhcpd.conf" 的組態檔,DHCP 精靈始終會指定相同的資料集給對應的用戶端。

範例 23.2. 組態檔的增加部分

host earth {
hardware ethernet 00:00:45:12:EE:F4;
fixed-address 192.168.1.21;
}

對應用戶端的名稱 (host hostnameearth) 會輸入到第一行,而在第二行則是 MAC 位址。在 Linux 主機上,使用指令 ip link show 後面接著網路設備 (例如,eth0) 可尋找 MAC 位址。輸出應該包含如下內容

link/ether 00:00:45:12:EE:F4

在上述範例中,具有網路卡、且 MAC 位址為 00:00:45:12:EE:F4 的用戶端會自動指定 IP 位址 192.168.1.21 及主機名稱 earth。幾乎所有情況中輸入的硬體類型會是 ethernet,儘管通常在 IBM 系統上找到的是 token-ring,也是可以支援的。

23.3.2. SUSE Linux 系統

為了改善安全性,ISC 之 DHCP 伺服器的 SUSE 版本隨附應用 Ari Edelkind 的 non-root/chroot 修補程式。這樣可讓 dhcpd 利用使用者 ID nobody 執行,而且也能執行於 chroot 環境下 (/var/lib/dhcp)。如要這樣做,組態檔 dhcpd.conf 必須位於 /var/lib/dhcp/etc。init 程序檔啟動時會自動複製檔案到此目錄。

伺服器與此功能相關的行為,是透過檔案 /etc/sysconfig/dhcpd 中的項目來控制的。若是不要在 chroot 環境下執行 dhcpd,請將 /etc/sysconfig/dhcpd 中的 DHCPD_RUN_CHROOTED 變數設定為 "no"。

若要讓 dhcpd 從 chroot 環境內解析主機名稱,必須也要複製以下其他組態檔案:

  • /etc/localtime

  • /etc/host.conf

  • /etc/hosts

  • /etc/resolv.conf

啟動 init 程序檔時,這些檔案會複製到 /var/lib/dhcp/etc/。如果 /etc/ppp/ip-up 之類的程序檔動態修改這些檔案時,則進行所需變更時,也要考慮到這些複本。不過,如果組態檔僅指定 IP 位址 (而不是指定主機名稱) 時,則不需要擔心。

如果您的組態包括應該要複製到 chroot 環境的其他檔案,請在檔案 /etc/sysconfig/dhcpd 中的變數 DHCPD_CONF_INCLUDE_FILES 下設定這些檔案。為了確保重新啟動 syslog-ng 精靈後,DHCP 記錄設備仍然能夠持續運作,/etc/sysconfig/syslog 檔案中還有另一個項目 SYSLOGD_ADDITIONAL_SOCKET_DHCP