作者:陳柏菁 E-mail
第十三章 架 設 DHCP Server

索引:

13.1 DHCP 概述
  13.1.1 何謂 DHCP
  13.1.2 DHCP 分配 IP 位址的方式
  13.1.3 DHCP 的運作流程 --- 更新租約期
13.2 設定 DHCP Server
  13.2.1 需安裝套件及套件清單
  13.2.2 設定 DHCP Server --- 設定 /etc/dhcpd.conf修改 /etc/sysconfig/dhcpd
  13.2.3 檢視 /var/lib/dhcp/db/dhcpd.leases
  13.2.4 綜合範例
13.3 設定 DHCP Client
  13.3.1 設定 Linux Client
  13.3.2 設定 Windows Client



13.1 DHCP 概述

13.1.1 何謂 DHCP

DHCP 是 Dynamic Host Configuration Protocol 的簡稱,也就是動態主機設定協定之意。而今天我們所要學習架設的 DHCP Server,其主要功用就是分派 IP 位址及相關參數來給它的 Client 端使用。記不記得在第十一章介紹網路組態設定時,有教過大家如何在自己主機上設定固定 IP 來上網,如果記得的話,那試想一下,假使您是公司的網管,管理著幾十部電腦甚至更多,而當您想讓這些電腦都能連上 Internet 時,難道會要求公司同仁都自己設定靜態位址嗎 ? 還是由您出面,一台一台幫他們搞定 ? 我想聰明的你應該不會想要這麼做吧。所以解決這個問題的最好方式就是架設一台 DHCP 伺服器囉,這樣當 client 開機時,就可以透過 DHCP 來要到 IP。

13.1.2 DHCP 分配 IP 位址的方式

Dynamic Allocation ─ 動態分配

  DHCP Client 向 DHCP Server 取得 IP 位址後,並不是永久的使用該位址,而只是能使用一段時間而已,這段時間就是所謂的租約期,只要 Client 的租約期一到,就必須釋放 (release) 此位址,這樣 DHCP 才能把剛剛收回的位址再提供給其它的用戶端使用。

一般使用動態分配的時機是為了解決 IP 位址的不足,像現在很多的 ISP 都是透過這種動態分配的方式。舉個例子,假設 ISP 本身有 1000 個 IP 位址可供應,但客戶數可能不只 1000 人,不過由於所有客戶在同一時間上網的機率不高,所以 ISP 就可以輪流租用給客戶端來使用。雖然 ISP 不一定採用 DHCP 的方式,但其動態分配的原理是相同的。

Automatic Allocation
─ 自動分配

  DHCP Client 每次開機時所分配到的 IP 位址都是固定的時候,稱之為自動分配。您要是有一些比較特殊的主機,像工作站或伺服器等級之類的,就可採用自動分配的方式來給予這些主機固定的 IP。至於自動分配的原理,是根據 Client 主機的 MAC 位址來指派一個永久的 IP 位址給它,因此這個位址就沒有所謂的租約期了。

13.1.3 DHCP 的運作流程

當 DHCP Client 電腦開機時,會嘗試向 DHCP Server 索取 IP 位址,而一般 DHCP Server 並不是只單純的提供位址而已,其中還包括 幫  Client 端指定其所使用的 Default Gateway、Default Name Server 及租約期等資訊,當然這些資訊就看您在 Server 上如何做設定了。

以下是 DHCP Client 在向 DHCP Server 索取 IP 的一個流程圖:



針對這個流程稍微做個解釋:
1. DHCPDISCOVER
當用戶端首次以 DHCP Client 端的身分登入網路時,會先發出一個 DHCPDISCOVER 的廣播封包,內含來源位址 0.0.0.0、目的位址 255.255.255.255 等訊息。而送出這個廣播封包的目的就是在找尋一台能提供 IP 位址的 DHCP Server。
   
2. DHCPOFFER
DHCP Server 在收到這個 DHCPDISCOVER 廣播封包後,會從目前尚未出租出去的 IP 位址中挑一個,然後再利用廣播方式回應給 Client 一個 DHCPOFFER 封包,此封包還包含租約期限的訊息。另外若網路中有多台 DHCP 主機存在,則 Client 會以收到的第一個 DHCPOFFER 訊息為主。
   
3. DHCPREQUEST
Client 端在收到 DHCPOFFER 封包後,會先送出一個 ARP Request 的廣播封包,來確定對方所提供的 IP 位址沒有其他的主機在使用,那萬一發現這個位址已被其它主機使用掉的話,Client 端就會送出一個 DHCPDECLINE 的拒絕訊息給 Server,然後再送出一個 DHCPDISCOVER 的廣播封包來重新索取 IP 位址。

好了,假使 Client 已確定此位址尚未被使用,那麼接著就會送出一個 DHCPREQUEST 的廣播封包來回應給這台 DHCP Server。之所以還是送出廣播封包的用意,是為了告知其他未被選上的 DHCP Server,這樣這些 DHCP Server 才可將原本打算保留給 Client 的 IP 位址釋放出來給其他 Client 使用。

  ARP 全名為 Address Resolution Protocol。ARP 機制的主要作用是找到 IP 位址所對應的 MAC 位址,以順利與對方主機取得聯繫,同時也會把此筆紀錄存放在 cache 內,爾後只要在有效時間內又跟同一台目的主機做通訊時,就可以根據 cache 裡的 ARP table,而直接把封包送達目的地。我們再用以下這個簡圖來作說明:


當來源端主機 192.168.1.1 要與目的端主機 192.168.1.5 建立通訊時,會先到 cache 內看看 ARP table 裡有沒有 192.168.1.5 所對應的 MAC 位址紀錄,如果找不到的話,來源端主機就會送出一個 ARP Request 的廣播封包給所有主機,所以每一台主機都會收到這個封包,但只有 192.168.1.5 這台主機會作回應,此項回應就叫做 ARP Reply,而此回應封包裡頭就包含了回應主機 192.168.1.5 的 MAC 位址,所以來源端主機就能夠知道目的主機的 MAC 位址,自然也就能順利與其通訊了。同時來源端主機會順便將此資訊放在自己 cache 的 ARP table 裡邊,若在紀錄未刪除前又向 192.168.1.5 主機進行通訊時,就不需再送出 ARP Request 的廣播封包了。
   
4. DHCPACK
DHCP Server 收到 DHCPREQUEST 的訊息後,會回應一個 DHCPACK 的確認訊息給 Client ( 此時還是透過廣播方式,因 Client 尚未正式取得 IP 位址 ),此訊息裡包含了指派給 Client 端使用的 IP 位址、網路遮罩、預設閘道器、DNS Server 等等,而在 client 收到這些訊息後,便完成了整個索取 IP 位址的動作。

以上的這個索取 IP 的流程,主要是針對首次使用 DHCP Client 身分來登入網路時 ; 另外如果 DHCP Client 自行釋放出原本所要到的位址而重新索取一個新的 IP 時,也是採用這個流程。針對後者,我們可以在 Windows 的 Client 端做個實驗 ( 假設您網路裡存在 DHCP Server ),以 Windows 2000 來說,請您在命令提示字元中執行:
C : \Documents and Settings\barry > ipconfig/release ← 釋放 IP 位址。

C : \Documents and Settings\barry > ipconfig/renew ← 重新索取一個新的 IP 位址。

註:如果未執行 release,而直接執行 renew 的話,就只是在更新租約期而已。

然後回到 DHCP Server 檢查紀錄檔訊息:
suselinux:~ # tail -5 /var/log/messages

Nov 3 18:56:25 suselinux dhcpd: DHCPRELEASE of 192.168.1.199 from 00:04:e2:19:02:0c (newwins)
via eth0 (found)
Nov 3 18:57:24 suselinux dhcpd: DHCPDISCOVER from 00:04:e2:19:02:0c via eth0
Nov 3 18:57:25 suselinux dhcpd: DHCPOFFER on 192.168.1.199 to 00:04:e2:19:02:0c (newwins) via eth0
Nov 3 18:57:25 suselinux dhcpd: DHCPREQUEST for 192.168.1.199 (192.168.1.111) from 00:04:e2:19:02:0c
(newwins) via eth0
Nov 3 18:57:25 suselinux dhcpd: DHCPACK on 192.168.1.199 to 00:04:e2:19:02:0c (newwins) via eth0

更新租約期

  往往 DHCP Client 為了持續延用此 IP 位址,而會向 DHCP Server 要求更新租約期,一旦更新成功,則 Client 的 IP 租約期限就會從頭開始計算起。在 Client 更新租約期的時候,會向 Server 送出一個 DHCPREQUEST 的訊息。接著以下就舉兩種 Client 送出 DHCPREQUEST 給 Server 的時機:

  1. DHCP Client 重新開機時
當 DHCP 的用戶端電腦重新啟動時,會送出 DHCPREQUEST 給 DHCP Server,來要求延用原來的 IP 位址,倘若此位址目前尚未租用給其它的 Client,則用戶端就可以取得與上次所使用的 IP 相同。
     
  2. 達 1/2 租約期時
DHCP Client 會在 IP 租約期達到一半時,主動送出一個 DHCPREQUEST 給 DHCP Server,而 Client 如果也順利收到對方所回應的 DHCPACK 訊息,就表示已成功更新租約期。萬一更新失敗,Client 還是可以繼續使用此位址,因為租約期還沒到。而在更新失敗的情況下,Client 會在租約期到了八分之七時,利用廣播方式送出 DHCPREQUEST 更新訊息來尋找任何一台可用的 DHCP Server,看看能否更新租約,如果還是無法更新成功,則 Client 會放棄目前使用的 IP,並重新送出 DHCPDISCOVER 來向 DHCP 索取一個新的位址。


13.2 設定 DHCP Server

13.2.1 需安裝套件及套件清單

檢視套件有無安裝:
suselinux:~ # rpm -qa | grep dhcp
dhcp-3.0.1rc13-28.18
dhcp-server-3.0.1rc13-28.18

請注意,您不能只安裝 dhcp-server,因 dhcp 是 dhcp-server 的相依套件。

查詢套件內容:
suselinux:~ # rpm -ql dhcp-server

/etc/init.d/dhcpd → 管理 DHCP 服務的 script。
/usr/sbin/dhcpd → 提供 DHCP 服務的 daemon。
/usr/sbin/rcdhcpd → 連結至 /etc/init.d/dhcpd 的符號連結檔。
/var/lib/dhcp/db → 當 dhcpd 啟動後,會在此目錄下產生 dhcpd.leases 檔案,它是用來記錄已配發出去的動態 IP 位址及其租約期。
/var/lib/dhcp/etc → 當啟用 chroot 機制時,daemon 所要讀取的設定檔就位在這個目錄下。

suselinux:~ # rpm -ql dhcp

/var/lib/dhcp → 這個目錄是 dhcp 套件所提供的,至於此目錄下的其他子目錄則是屬於 dhcp-server 套件。

從套件內容中好像沒看到 DHCP 的主要設定檔,沒關係,去檢視一下 /etc/init.d/dhcpd 這支 script 的內容就可略知一二:
suselinux:~ # vi /etc/init.d/dhcpd

test "$DHCPD_RUN_CHROOTED" = "yes" && CHROOT_PREFIX = /var/lib/dhcp/
DAEMON = "DHCP server"
DAEMON_BIN = ${DHCPD_BINARY : = /usr/sbin/dhcpd}
DAEMON_CONF = /etc/dhcpd.conf
      :略

這樣大概就可以知道 DHCP 的設定檔為 /etc/dhcpd.conf。不過 SuSE 的 DHCP 也是跟 DNS 一樣,採用預設的 chroot 機制:
suselinux:~ # vi /etc/sysconfig/dhcpd

# Shall the DHCP server dhcpd run in a chroot jail (/var/lib/dhcp)?
# 啟用 chroot 機制後,其預設的根目錄為 /var/lib/dhcp。
# Each time you start dhcpd with the init script, /etc/dhcpd.conf will
# be copied to /var/lib/dhcp/etc/.

# 當您藉由 script 來啟動 dhcpd 服務時,會自動把 /etc/dhcpd.conf 複製到 /var/lib/dhcp/etc 之中,
# 因此我們只要針對 /etc/dhcpd.conf 來做設定即可。

DHCPD_RUN_CHROOTED="yes"

設定下次開機時啟動 dhcpd 服務:
suselinux:~ # chkconfig dhcpd 35

13.2.2 設定 DHCP Server

在設定伺服器之前,先來了解一下大致上的規劃。DHCP Server 主機上有兩片網卡,eth0 對外、eth1 對內 ( IP 位址為 192.168.1.254 ),同時這部主機亦具有 NAT 功能 ( 請參考防火牆那一章的設定 ),這樣才可讓 Client 連上 Internet。至於詳細的架構如下圖所示:



接著就來做設定囉:

1. 設定 /etc/dhcpd.conf
suselinux:~ # vi /etc/dhcpd.conf

ddns-update-style none;

subnet 192.168.1.0 netmask 255.255.255.0 {
   default-lease-time 43200;
   max-lease-time 86400;
   option domain-name "paching.idv.tw";
   option domain-name-servers 203.79.224.30,168.95.1.1;
   option broadcast-address 192.168.1.255;
   option routers 192.168.1.254;
   range 192.168.1.223 192.168.1.253; }

設定檔內容分成兩部分,即 global 與 section,global 是整體的設定,而 subnet { } 及 host { } 則是屬於 section 的部分。global 中所設定的參數,可以套用在每個 section 上頭。另外每一項設定的結尾需加上 " ; " 來做結束。至於註解符號為 " # "。

再來看看那些參數的代表意義:

ddns-update-style none;

  這個參數是用來指定動態 DNS 的更新類型,不過只有 dhcp 3.x 版才支援,在 2.x 版是不需設定的。此參數主要是讓 DHCP 來幫 Client 更新它們在 DNS 裡頭的紀錄,所以需要搭配 DNS 來運作才行。如果您不想要這個功能的話,設定成 none 即可。

subnet 192.168.1.0 netmask 255.255.255.0 {}

  先使用 subnet 及 netmask 來宣告要對哪個子網路提供服務,至於幫此 subnet 所指定的參數就安置在 { } 之中。底下接著就是要介紹這些參數:

  ˙default-lease-time 43200;
  對於所分配出去的 IP 位址,指定其預設的租約期,單位為秒。
  ˙max-lease-time 86400;
  對於所分配出去的 IP 位址,指定其最大的租約期。當用戶端提出租約期的要求時,只要不超過這裡的限制都可以接受,但萬一超過,那最多也只能擁有 86400 秒的租約期限。
  ˙option domain-name "paching.idv.tw";
  在設定檔內,有些參數需使用 option 去做宣告,而 domain-name 只是在宣告主機所在的網域名稱。如果 Client 端是 Linux 的話,那在 /etc/resolv.conf 中所看到 search 參數後的 domain name,就是這裡指派的。
  ˙option domain-name-servers 203.79.224.30,168.95.1.1;
  指定 Client 端預設要使用的名稱伺服器位址。在 Linux Client 的 /etc/resolv.conf 中所看到 nameserver 位址,就是靠這個參數去指派的。
  ˙option broadcast-address 192.168.1.255;
  幫 Client 指定廣播位址囉。
  ˙option routers 192.168.1.254;
  routers 是指 Default Gateway。也就是幫 Client 端指定其預設閘道器為 192.168.1.254 這台主機。在 Linux Client 端執行 route 指令時,應該能看到 routing table 最後一筆的 default route 為 192.168.1.254。
  ˙range 192.168.1.223 192.168.1.253;
  打算分配給 client 端的 IP 位址範圍。兩位址之間用空白字元隔開即可。
 
2. 修改 /etc/sysconfig/dhcpd
suselinux:~ # vi /etc/sysconfig/dhcpd

DHCPD_INTERFACE="eth1"

這個參數是用來指定 daemon 所聆聽的介面,以這裡的架構圖來說,就是指 eth1。

完成後請啟動 dhcpd:
suselinux:~ # rcdhcpd start
Starting DHCP server [chroot]        done

如果您設定有誤,則在啟動 dhcpd 的過程,會有錯誤訊息顯示在螢幕上,照著系統提供的訊息來除錯即可,很簡單的。

13.2.3 檢視 /var/lib/dhcp/db/dhcpd.leases

當您第一次啟動 dhcpd 時,會在 /var/lib/dhcp/db 目錄下產生一個 dhcpd.leases 檔案,而這個檔案是用來紀錄已配發出去的 IP 位址及租約期等資訊。
suselinux:~ # cat /var/lib/dhcp/db/dhcpd.leases

lease 192.168.1.223 {
 starts 5 2005/09/30 05:10:00;
 ends 5 2005/09/30 17:10:00;
 binding state active;
 next binding state free;
 hardware ethernet 00:0f:3d:ec:12:fc;
 uid "\001\000\017=\354\022\374";
 client-hostname "HOME-IKT3I2FVHI";
}

lease 192.168.1.224 {
 starts 5 2005/09/30 05:10:58;
 ends 5 2005/09/30 17:10:58;
 binding state active;
 next binding state free;
 hardware ethernet 00:04:e2:19:02:0c;
 uid "\001\000\004\342\031\002\014";
 client-hostname "newwins";
}
如果您眼尖一點的話,應該會留意到租約期的時間好像跟本地端的時間不太吻合,這可是正常的啦,因為紀錄檔中所顯示的是 UTC (GMT) 時間而非本地時間。

13.2.4 綜合範例

假使 DHCP 上頭有三片網卡,eth0 對外,eth1 及 eth2 分別連接 192.168.1.0/24 及 192.168.2.0/24 這兩個網路段,也就是打算要提供兩網路段內的主機位址,另外並分派一個永久的位址 192.168.2.180 給 host1 這台主機,其架構圖如下:



設定 /etc/dhcpd.conf
suselinux:~ # vi /etc/dhcpd.conf

# global設定
ddns-update-style none;
default-lease-time 43200;
max-lease-time 86400;
option domain-name-servers 203.79.224.30,168.95.1.1;

# section設定
subnet 192.168.1.0 netmask 255.255.255.0 {
  option routers 192.168.1.254;
  option broadcast-address 192.168.1.255;
  range 192.168.1.100 192.168.1.200; }
  
subnet 192.168.2.0 netmask 255.255.255.0 {
  option routers 192.168.2.254;
  option broadcast-address 192.168.2.255;
  range 192.168.2.10 192.168.2.150;
  range 192.168.2.200 192.168.2.240; }

host host1 {
  hardware ethernet 00:a0:cc:c0:2a:4b;
  fixed-address 192.168.2.180;
  option routers 192.168.2.254; }

global 及兩段 subnet 的宣告應該沒啥問題,因此這裡只針對最後一個 host section 來說明。

當您要對一些主機指定其特定的參數時,可以使用 host 來做宣告,一般最常見到的是靜態位址的指定。host 之後所接的是這台主機的名稱,取什麼名稱都沒關係,只要方便管理者識別即可。hardware ethernet 是 host1 主機的 MAC 位址,另外使用 fixed-address 去指定一個永久的位址給這台主機,也就是直接指派 192.168.2.180 給 00:a0:cc:c0:2a:4b 這個 MAC 位址啦。

修改 /etc/sysconfig/dhcpd
suselinux:~ # vi /etc/sysconfig/dhcpd

DHCPD_INTERFACE="eth1 eth2"

最後再重新啟動 dhcpd 即可。

13.3 設定 DHCP Client

DHCP Client 端的設定很簡單,或許您都已經會了,不過還是提一下。以下我們會把 Windows 及 Linux Client 端分開來說明。

13.3.1 設定 Linux Client

首先請確定用戶端的 dhcpcd 套件有安裝 (一般都會有啦),然後檢查一下套件內容:
dhcpclient:~ # rpm -qa | grep dhcpcd
dhcpcd-1.3.22pl4-193.1

dhcpclient
:~ # rpm -ql dhcpcd

/sbin/dhcpcd

這是 DHCP Client 端主要執行的一支 daemon,藉由這支 daemon,才能讓您從 DHCP Server 那裡得到 IP address、netmask、broadcast 、Default GW、nameserver 等資訊,重要吧。

修改網路介面設定檔:
dhcpclient:~ # cd /etc/sysconfig/network
dhcpclient:/etc/sysconfig/network # vi ifcfg-eth-id-00:05:5d:69:dd:b3

BOOTPROTO='dhcp' ← 改成 dhcp 就 ok 囉。
IPADDR='192.168.1.111'
NETMASK='255.255.255.0'
     :略

修改完成後請重新啟動網路,看能否索取到 IP 位址:

dhcpclient:~ # rcnetwork restart 

當您重新啟動網路之後,可以執行 ifconfig 及 route 指令,來確認一下 IP 位址及 Default Gateway 是否與在 DHCP Server 上所設定的參數一樣,再來就是檢查 /etc/resolv.conf 中的 nameserver 及 search 跟 DHCP 所指定的是否相同,趕快去做個確認吧。

雖然 DHCP Client 可以直接取得 DHCP Server 所提供的網路參數,但有些時候可能有部分參數您不希望透過 Server 的指派,而是想自己去做設定,那要怎麼做呢 ? 請直接參考範例:
dhcpclient:~ # vi /etc/sysconfig/network/dhcp

# Should the DHCP client modify /etc/resolv.conf at all?
# If not, set this to "no". (The default is "yes")
#
# resolv.conf will also stay untouched when MODIFY_RESOLV_CONF_DYNAMICALLY
# in /etc/sysconfig/network/config is set to "no".
#

DHCLIENT_MODIFY_RESOLV_CONF="no"
#
改成 no 以後,dhcpcd 就不會去修改 /etc/resolv.conf,這時候當然就可以保留您原來的設定值囉。
# 還有另一種方式,就是到 /etc/sysconfig/network/config 去把 MODIFY_RESOLV_CONF_DYNAMICALLY
#
參數修改成 no 即可。

# Should the DHCP client set a default route (default Gateway) (yes|no)
#
# When multiple copies of dhcpcd run, it would make sense that only one
# of them does it.
#

DHCLIENT_SET_DEFAULT_ROUTE="no"
#
設定成 no,表示 Client 不使用 Server 所提供的 Default GW。
# 如果您在 /etc/sysconfig/network/routes 有指定 DG,則就算此處設定成 yes,也還是會依 routes 檔案的設定為主。

# Lease time to request ( -l option)
#
# Specifies (in seconds) the lease that is suggested to the server.
# The default is infinite. For a mobile computer you probably want to
# set this to a lower value.
#

DHCLIENT_LEASE_TIME="86400"
# 這是 Client 向 Server 所要求的租約期設定,如未指定時間,則表示採用 default-lease-time。
# 如果您所要求的時間比 default-lease-time 或 max-lease-time 還小,Server 都會接受,但如果比 max-lease-time
# 還大,則會以 max-lease-time 作為 Client 的租約期。

13.3.2 設定 Windows Client

Windows 應該是沒什麼問題,以 Windows 2000為例,請從 [ 網路芳鄰 ] 按右鍵 → 內容 → [ 區域連線 ] 按右鍵 → 內容,接著就看到以下畫面:



請選取 TCP/IP → 內容:



然後選擇 [ 自動取得 IP 位址 ] 及 [ 自動取得 DNS 伺服器位址 ] 後按下 [ 確定 ],接著就會回到上一個畫面,再按下確定就行了。

最後請打開命令提示字元,輸入 " ipconfig/all " 去觀察一下吧 !


copyright © 2005 by barry ( 柏青哥 )