22.3 DHCP 伺服器 dhcpd

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

範例 22-1 組態檔 /etc/dhcpd.conf

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

option domain-name "example.com";
option domain-name-servers 192.168.1.116;
option broadcast-address 192.168.2.255;
option routers 192.168.2.1;
option subnet-mask 255.255.255.0;

subnet 192.168.2.0 netmask 255.255.255.0
 {
  range 192.168.2.10 192.168.2.20;
  range 192.168.2.100 192.168.2.200;
 }

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

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

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

檔案的最後一個部分定義網路,包括子網路遮罩。若要完成設定,請指定 DHCP 精靈用來指派 IP 位址給相關用戶端的位址範圍。在範例 22-1 中,用戶端的指定位址可介於 192.168.2.10192.168.2.20 之間以及 192.168.2.100192.168.2.200 之間。

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

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

22.3.1 使用固定 IP 位址的用戶端

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

為了識別使用靜態位址設定的用戶端,dhcpd 會使用硬體位址,硬體位址是全球唯一的固定數字代碼,由六對八位元組組成,用來識別所有網路設備 (例如,00:30:6E:08:EC:80)。如果相對的行 (如 範例 22-2 中所示) 新增到 範例 22-1 的組態檔,DHCP 精靈始終會指定相同的資料集給對應的用戶端。

範例 22-2 組態檔的增加部分

host jupiter {
hardware ethernet 00:30:6E:08:EC:80;
fixed-address 192.168.2.100;
}

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

link/ether 00:30:6E:08:EC:80

在上述範例中,具有網路卡、且 MAC 位址為 00:30:6E:08:EC:80 的用戶端會自動分配到 IP 位址 192.168.2.100 及主機名稱 jupiter。幾乎所有情況中輸入的硬體類型會是 ethernet,儘管通常在 IBM 系統上找到的是 token-ring,也是可以支援的。

22.3.2 SUSE Linux Enterprise Server 版本

為了改善安全性,SUSE Linux Enterprise Server 版 ISC DHCP 伺服器在出貨時即套用了 Ari Edelkind 的 non-root/chroot 修補程式。這樣可讓 dhcpd 利用使用者 ID nobody 執行,而且也能在 chroot 環境下 (/var/lib/dhcp) 執行 dhcpd。若要這樣做,組態檔 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