Redhat 6.1下的DHCP Server

高健智 E-mail:gau@mail1.tmtc.edu.tw


一、前言

管理校園網路或企業內部網路常會面臨一件相當辛苦的差事----更改主機的IP組態,基本上更改IP組態是相當容易,但是當電腦數量一多,或是電腦使用人員不會更改IP組態,原本一件很容易的事情就會演變成蠻麻煩的工作。隨著資訊化的普及,校園內部與企業內部的電腦數量不斷擴增,當然就得設定新增電腦的基本組態,但是同時也增加了網管人員的負擔。

若使用DHCP Server,可幫您動態配置IP、DNS組態、gateway等組態設定,在極短的時間內就可快速、有效的組織網路,讓您節省相當多的設定時間。

二、DHCP的基本概念

DHCP(Dynamic Host Configuration Protocol),動態主機組態協定,是一種動態組織網路的機制。在DHCP機制裡可分為Server端與Client端;Server端使用固定IP位址,在區域網路裡扮演的角色是提供動態配給Client端IP位址、DNS組態、gateway等組態設定。Client端只需設定主機名稱,其餘有關網路的組態,如:IP位址、DNS組態、gateway等組態設定皆可由DHCP Server端提供。

在區域網路裡架設了DHCP Server後,您必須先規劃好一段或數段IP區間以提供給DHCP Server做為設定動態IP Pool(即IP區間),接著在DHCP Server上設定使用動態IP的Pool範圍、網域的領域名稱、網域的gateway,設定完成後即可提供DHCP服務。DHCP Server提供動態IP的觀念是以租約(lease)的方式承租IP一段時間給DHCP Client 端,因此在分割IP Pool時,除了要規劃動態IP區間範圍,還需對承租時間做限制。

有時在區域網路裡,有某幾部主機希望在配發動態IP時,能夠分配到固定的IP位址,在設定DHCP Server時,可針對這幾部主機網路卡的硬體位址配發固定IP;此外,為了防止有人盜用動態IP,使用網路卡的硬體位址配發固定IP,也是一種相當好的管理方式。

目前區域網路大都屬於NT網域,在區域網路裡以Linux架設DHCP Server後,所要服務的Client端對象幾乎是Window系列主機,對Client端的Window系列主機而言,要使用DHCP方式連接 Linux的DHCP Server,其設定方式與連接NT DHCP Server一樣,並不會造成您管理上的負擔,而Linux DHCP Server由於工作效能極佳,故可以兼並執行其他伺服器,更可與NAT Router結合管理虛擬網路以解決IP不足問題,若再配合Proxy Server,除了能有效的阻隔廣播封包所造成的packet cllision(封包衝撞)問題外,也可解決頻寬不足問題,更可有效、快速的組織內部網路。

對於網路內已有NT DNS Server的管理者而言,可使用Samba Server充當WINS Server兼併執行DHCP Server,透過NT DNS+WINS Server,讓取得DHCP Server所配發出去IP的Client端也能夠享有領域名稱解析,本文將針對這些主題一一解說。

三、安裝DHCP Server

前言已提及 Dhcp 分為Server與Client,在Redhat 6.1(6.0)的光碟裡已附有Dhcp Server與Client RPM程式,目前最新的版本分別是:dhcp-2.0-3.rpm(Server)、dhcpcd-1.3.17p15-2.rpm(Client)。

若要安裝Dhcp Server,請使用root身分利用rpm指令做升級安裝即可:

# rpm -Uvh dhcp-2.0.3.rpm

若您想在一開機時讓系統自動啟動Dhcp Server,請使用Linuxconf做設定,步驟如下:

  1. # linuxconf ;啟動Linuxconf
  2. 選擇「Control」、「Control Panel」
  3. 選擇「Control service activity」
  4. 設定『dhcp』選項裡的「Automatic startup」項目為「Enable」、「Accept」

剛安裝好的Dhcp Server若要立即啟動服務,請如下步驟啟動:

  1. # cd /etc/rc.d/init.d
  2. # ./dhcpd start

若沒有意外的話,您應該可以看到系統啟動dhcpd Daemon。

四、DHCP Server的基本設定

在啟動dhcpd Daemon之前,必須先檢查目前的網路組態,您可使用 # ifconfig -a 做檢查,所得結果應該類似如下:

eth0 Link encap:Ethernet HWaddr 00:80:C8:64:0D:21

inet addr:192.168.1.10 Bcast:192.168.1.255 Mask:255.255.255.0

UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1

RX packets:686 errors:0 dropped:0 overruns:0 frame:0

TX packets:1225 errors:0 dropped:0 overruns:0 carrier:0

collisions:0 txqueuelen:100

Interrupt:9 Base address:0x7c00

在上圖中,最重要的是MULTICAST這個字眼,若您沒有看到字眼您必須自行加入255.255.255.255這個IP位址到routing table裡,請以root身分輸入如下:

# route add -host 255.255.255.255 dev eth0

為什麼系統需要具有MULTICAST功能呢?其理由是:為了讓dhcpd能夠正常的Dchp Client端做溝通,dhcpd必須傳送封包到255.255.255.255這個IP位址,但是在以往的Linux系統裡255.255.255.255這個IP位址被用來做為監聽區域子網域(local subnet)broadcast的 IP位址,所以需要在routing table裡加入255.255.255.255以啟動MULTICAST功能;不過啟動MULTICAST功能在redhat linux 6.x裡已是內定值,您應該是無須自行設定,建議您還是使用 ifconfig -a 指令檢查一下較好。

Dhcp Server的組織結構相當簡單,只需用到/etc/dhcpd.conf及/etc/dhcpd.leases兩個檔。

/etc/dhcpd.conf是Dhcp Server的組態設定檔,當您安裝好Dhcp Server後,在/etc目錄下是不會產生此檔,您必須手動編輯 /etc/dhcpd.conf組態檔或是使用linuxconf設定Dhcp Server組態。

/etc/dhcpd.leases是登記Dhcp Server所配發出去的IP及租約時間,在安裝好Dhcp Server後,/etc目錄下也是不會產生此檔,您可使用手動方式新增此檔,如:# echo "" > /etc/dhcpd.leases。若您是使用linuxconf設定Dhcp Server組態,linuxconf會自動產生dhcpd.conf及dpchd.leases兩個檔案。

使用linuxconf設定Dhpc Server組態,需先設定整體共同設目再設定欲租約出去的個別IP範圍,請依如下步驟設定:

  1. # linuxconf [Enter]。
  2. 「Config」、「Networking」、「Boot services」、「DHCP/BOOTP server」。
  3. 「Edit defaults」。
  4. 出現「DHCP defaults」視窗後,依序設定如下共同設目:


說明:

  1. 「Accept」。

※ 接著設定欲租約出去的IP範圍,設定如下。

  1. 在「Dhcp configuration」視窗裡選擇「AddNet」選項。
  2. 出現「One subnet definition」視窗後,請簡單設定如下:

說明:

※註:其他如Default lease time、Max lease time、Default gateways等項目是屬於個別IP範圍的設定,可不必設定,採用先前設定的整體設定值即可,若要做這些項目的個別IP範圍設定,請先取消整體租約IP的相關設定值。

  1. 「Accept」。

設定完Dhcp Server組態設定後別忘了重新啟動 dhcpd Daemon。若您想以手動方式設定/etc/dhcpd.conf組態檔,以上述設定而言,可在/etc/dhcpd.conf檔裡撰寫如下:

server-identifier 192.168.1.10;

default-lease-time 10800;

max-lease-time 86400;

option broadcast-address 192.168.1.255;

option domain-name "test.edu.tw";

option domain-name-servers 192.168.1.10;

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.50 192.168.1.100;

}

上列設定中,Part I屬於整體宣告,注意到Part I中除了Dhcp識別名稱及兩項租約期限(lease-time)外,其餘命令之前皆需要加上 option;手動設定整體 gateway,其命令名稱不是 gateway,而是option routers;每一道命令皆須以";"號做為結尾。

Part II屬於個別IP範圍設定,以命令「subnet IP網域 netmask 網路遮罩」做為宣告,再將欲租約出去的IP範圍宣告在 {} 裡;在{} 裡使用命令「range 租約起始IP 租約終止IP;」做為宣告租約IP範圍,如:

range 192.168.1.50 192.168.1.100;

若要租約出去兩段IP範圍,可宣告如下:

subnet 192.168.1.0 netmask 255.255.255.0{

range 192.168.1.50 192.168.1.80;

range 192.168.1.100 192.168.1.120;

}

若要宣告個別IP範圍的Default lease time、Max lease time、Default gateways等項目,請先刪除整體宣告,再宣告如下:

server-identifier 192.168.1.10; 

subnet 192.168.1.0 netmask 255.255.255.0{

range 192.168.1.50 192.168.1.100;

default-lease-time 3600;

max-lease-time 10800;

option domain-name "test.edu.tw";

option domain-name-servers 192.168.1.10;

option netbios-name-servers 192.168.1.10;

option routers 192.168.1.254;

option subnet-mask 255.255.255.0;

}

五、DHCP Client端

設定好Dhcp Server端後,在Dhcp Client端的設定大致可分兩類,一是Windows Dhcp Client,另一是linux Dhcp Client,您可依下面敘述設定。

【Windows Dhcp Client】

設定Win 95/98為Dhcp Client端步驟相當簡單,如下設定:

  1. 「開始」鈕、「設定」、「控制台」。
  2. 「網路」、「TCP/IP」。
  3. 按一下「IP位址」索引標籤。
  4. 按一下「自動取得IP」圓鈕。

  1. 「確定」。

設定好選項重新開機後,即可自動取得IP位址,您可使用winipcfg觀察IP組態,如下圖所示:

【redhat linux Dhcp Client】

基本上要以linux做為Dhcp Client在設定上頗為麻煩,若使用redhat linux做為Dhcp Client端,那麼設定步驟就相當簡單,請設定如下:

  1. rpm -Uvh dhcpcd-1.3.17pl5-2。(安裝dhcp client daemon,事實上不安裝也行)
  2. # linuxconf。
  3. 「Config」、「Networking」、「Client tasks」、「Basic host information」。
  4. 在「Config mode」項目裡選擇「Dhcp」,「IP address」、「netmask」兩欄可不輸入。

  1. 「Accept」。

設定好選項重新開機後,即可自動取得IP位址,您可使用ifconfig觀察IP組態,如下所示。

eth0 Link encap:Ethernet HWaddr 00:80:C8:64:A6:CE

inet addr:192.168.1.31 Bcast:192.168.1.255 Mask:255.255.255.0

UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1

RX packets:7334 errors:0 dropped:0 overruns:0 frame:0

TX packets:235 errors:0 dropped:0 overruns:0 carrier:0

collisions:0 txqueuelen:100

Interrupt:9 Base address:0x6600

lo Link encap:Local Loopback

inet addr:127.0.0.1 Mask:255.0.0.0

UP LOOPBACK RUNNING MTU:3924 Metric:1

RX packets:4 errors:0 dropped:0 overruns:0 frame:0

TX packets:4 errors:0 dropped:0 overruns:0 carrier:0

collisions:0 txqueuelen:0

當Dhcp Server正確的把IP分配出去後,您可在Dhcp Server上觀察 /etc/dhcp.leases檔裡IP的租約情形。

[root@fortop kao]# cat /etc/dhcpd.leases

lease 192.168.1.30 {

starts 5 1999/12/03 15:03:39;

ends 6 1999/12/04 03:03:39;

hardware ethernet 00:00:e8:11:ef:4e;

uid 01:00:00:e8:11:ef:4e;

client-hostname "asp";

}

lease 192.168.1.30 {

starts 0 1999/12/05 08:36:12;

ends 0 1999/12/05 20:36:12;

hardware ethernet 00:00:e8:11:ef:4e;

uid 01:00:00:e8:11:ef:4e;

client-hostname "asp";

}

六、分配固定IP

在使用Dhcp Server分配動態IP時,有時並非所有規劃內的IP都採用動態分配,有一些主機是需要固定的IP,要使用何種方式才能在Client端每次開機時都可以分配到固定的IP位址呢?由於每片網路卡上都有一個唯一的48位元硬體位址(Hardware Address),在Dhcp 組態檔裡,可將一固定的IP指定給一固定的硬體位址,即分配IP時Dhcp會辨認硬體位址,若存在,則分配一固定的IP位址;有了這項功能,組織網路也不限定一定得使用Dhcp 分配動態IP,您也可以在Dhcp Server端設定Dhcp服務都分配固定的IP位址,但是這些IP位址是會認硬體位址,如此一來,您就不必擔心有人盜用動態IP。

要Dhcp Server分配固定IP,請在 /etc/dhcpd.conf檔裡做宣告。假設目前需設定分配兩個固定IP,IP位址192.168.1.200給主機名稱為asp,網路卡硬體位址為00:00:e8:11:ef:4e;IP位址192.168.1.201給主機名稱為book,網路卡硬體位址為00:80:c8:64:a6:ce,您可如下宣告:

default-lease-time 10800;
max-lease-time 86400;
option broadcast-address 192.168.1.255;
option domain-name "test.edu.tw";
option domain-name-servers 192.168.1.10;
option routers 192.168.1.254;
option subnet-mask 255.255.255.0;

host asp {
hardware ethernet 00:00:e8:11:ef:4e;
fixed-address 192.168.1.200;
}

host book {
hardware ethernet 00:80:c8:64:a6:ce;
fixed-address 192.168.1.201;
}

※ 說明:

從上面敘述您可看出,若要使用Dhcp Server分配固定IP,必須事先準備好主機的硬體位址(Hardware address),那麼如何能有效快速的查出網路上主機的硬體位址呢?由於Dhcp Server可分配動態IP,藉由這個特性將使用動態分配IP及需固定IP的Client端主機,暫時先都以使用動態分配IP向Dhcp Server取得一IP位址,接著在Linux Dhcp Server上使用arp指令,以查詢目前連線至此機的所有主機硬體位址,如:

[root@fortop kao]# arp
Address HWtype HWaddress Flags Mask Iface
redhat.test.edu.tw ether 00:80:C8:64:0D:21 C eth0
book.test.edu.tw ether 00:80:C8:64:A6:CE C eth0

※ 註:ARP(Address Relosution Protocol),位址解析協定,可將32 bits 的IP位址轉換成48 bits的硬體位址。在linux下的arp指令可列出IP位址或領域名稱所對應的硬體位址,如上列所示。

若在欲分配出去的動態IP範圍內有幾個不連續的IP位址不想分配出去,那麼您可使用arp指令略施小計即可達成任務,假設有一台主機 book不想取得動態IP,請設定如下:

  1. 先在book主機ping Dhcp Server。
  2. 在Dhcp Server上執行arp指令,查出 book主機的硬體位址,如:

00:80:C8:64:A6:CE。

  1. 在 /etc/dhcfd.conf檔裡設定如下:

host book {
hardware ethernet 00:80:C8:64:A6:CE;
fixed-address 192.168.1.201;
}

  1. 在Dhcp Server上執行如下指令:

# arp -s book 00:00:00:00:00:00

  1. 重新啟動dhcpd daemon。

由於hardware ethernet所指定的硬體位址(00:80:C8:64:A6:CE)與真實的硬體位址(00:00:00:00:00:00)不符合,故Dhcp Server不配發IP位址。

七、DHCP+Wins+DNS

Dhcp Server能配發動態IP固然可以減輕組織網路負擔,有些時候需要對動態IP做名稱解析,最踏實的做法是在DNS Server上為這些需要名稱解析服務的主機登記FQDN與IP address的對應關係,但這得費點時間在DNS上做登記;一個比較快速、簡便無須在DNS上做登記主機FQDN的方式是使用NT DNS+Samba Wins+Dhcp Server。

Dhcp Server的工作是分配動態IP給Dhcp Client端,當網路存在Wins Server,在Dhcp Client端的主機上也設定了「使用DHCP for WINS解析」,那麼在Wins Server上會根據Dhcp Client端的主機名稱與所配得的IP Address做一主機名稱與IP Address的解析對應紀錄。由於NT DNS具有搭配WINS Server做名稱解析的功能,您可以在NT DNS的正、反查領域裡啟用Wins做解析,那麼NT DNS會根據 WINS Server上主機名稱與IP Address的解析對應紀錄,自動的解析成FQDN與IP Address的對應紀錄,並且登記在DNS Server的正、反查領域裡。

下面列出Dhcp Client、NT DNS、Wins Server、DHCP Server使用Wins 做名稱解析的設定步驟:

【Windows 95/98 Dhcp Client】

  1. 「開始」鈕、「設定」、「控制台」。
  2. 「網路」、「TCP/IP」。
  3. 按一下「WINS組態」索引標籤。
  4. 按一下「使用DHCP for WINS解析」。

  1. 「確定」。

【NT DNS】

首先確定已啟動NT DNS Server,並且在DNS裡啟用正、反查皆可透過Wins做解析。

【Linux Samba Wins Server】

*以下假設在Samba Server(192.168.1.16)主機上做設定。

  1. # linuxconf。
  2. 按一下「Config」、「Networking」、「Server tasks」。
  3. 按一下「Samba file server」、「Defaults」。
  4. 選擇 [X] Enable samba as a WINS server選項。
  5. 按一下「Accept」。

【Linux DHCP Server】

*以下設定Linux DHCP Server使用Wins 做名稱解析。

  1. # linuxconf。 ;啟動linuxconf
  2. 按一下「Config」、「Networking」、「Boot services」。
  3. 按一下「DHCP/BOOTP server」。
  4. 按一下「Edit defaults」。 ;DHCP基本組態設定
  5. 在「Name servers(Netbios)」欄裡輸入Wins Server,如:192.168.1.16。
  6. 在「Node type(Netbios)」欄裡輸入:0x4。;wins型態
  7. 按一下「Accept」。

設定完成後,您可在Samba Server上使用nmblookup 查詢名稱解析,假設目前有一主機其名稱為asp,使用動態分配IP連線,所配得的IP位址是192.168.1.30,那麼當您使用nmblookup asp做名稱查詢時,則出現下列畫面:

[root@fortop kao]# nmblookup asp
192.168.1.30 asp<00>

若在asp主機(Dhcp Client)上使用Winipcfg觀察IP資訊,您會發現asp主機除了得到動態IP外,也可正確的使用192.168.1.16這部Linux Wins Server做解析。

當然,使用NT DNS+DHCP+WINS除了可分配動態IP外,『網路上的芳鄰』、區域內主機FQDN與IP的對應關係皆可正常運作。

※ 註:有關本段詳細內容請參考前文: Redhat 6.X下的Samba Server 一文。

八、DHCP+NAT Router

所謂NAT Router就是使用ipchain做IP偽裝的防禦主機,而IP偽裝是指內部虛擬網域有一組虛擬的Class C(或Class B)並且以防禦主機(即firewall主機)做為閘道器,從內部網域任一主機發出訊息透過防禦主機進入到真實網域後,通通會被視為從防禦主機的真實IP所發出的訊息,也就是說所有的內部虛擬IP通通由一個真實的IP所偽裝,如下圖所示:

這種簡易型防火牆的運作方式,是在防火牆上使用封包轉送規則(forward),將內部虛擬網域(192.168.2.0)的所送來的封包對外(0.0.0.0;anywhere)放行,它可有效的阻擋外部任何類型的通訊協定入侵內部,基本上使用IP偽裝的防火牆,內部虛擬網域對外部真實網域是具通透性(transparent),也就說內部虛擬網域主機可直接以telnet、ftp、http協定對外通訊,感覺上,對內部虛擬網域主機而言就好像是使用真實IP一般,無所禁忌。

此種類型的防火牆處理效能極佳,以一部 PII-233搭配128M RAM的PC而言,可處理上百台內部網域主機,因此您可搭配Dhcp Server使用,能更有效的組織內部虛擬網域。

在防火牆上實施IP偽裝可以使用使用ipchains指令,只需下一道命令即可完成設定,如下所示:

# ipchains -A forward -p all -s 192.168.2.0/24 -d 0.0.0.0/0 -j MASQ 

※ 註:基本上「Firewall+IP偽裝」是屬於NAT(Network Access Translation)轉換中多對一的對應關係,「Firewall+IP偽裝」的這部機器又稱NAT Router。所謂NAT是指:將虛擬網路IP位址轉換成真實網路IP位址。

在NAT Router上做Dhcp Server的設定時,需注意NAT Router上有兩片網路卡,通常指定對eth1所屬的網域(虛擬網域)做動態IP配發,其餘設定步驟與前述DHCP Server基本設定相同,請參考前面敘述。

九、DHCP+Squid Proxy Server

若您所管理的網路屬於大型網路,主機數量有好幾百台,建議您先使用一或數部NAT Router,將內部網路分成數個虛擬網路,然後在每一部NAT Router兼併執行Dhcp Server,如此一來可快速、有效的組織內部網路,不過這無法解決對外頻寬不足;一個廉價又有效降低流量的方式是在NAT Router上再兼併執行Proxy Server,如下圖所示:

在NAT Router上的Proxy Server可使用免費、效能佳的Squid Proxy Server,您必須注意的是,由於Squid Proxy Server相當耗用記憶體、磁碟讀取量大,此部兼併執行NAT Router+Dhcp Server+Proxy Server的主機,建議您最好採用如下配備:

在虛擬網域內部的Proxy Client端,只需將Proxy Server的URL位址指向NAT Router的虛擬IP位址,Port 設定為3128,即可使用NAT Router主機上Squid Proxy Server所提供的服務。

※ 註:有關Squid Proxy Server的架設方式請參考前文:Redhat 6.0下的 Proxy Server 一文。

十、結語

現今校園或企業內部的區域網路大都是屬於NT網域,NT Server本身就提供免費的DHCP伺服器,為何還選用設定較為麻煩的Linux DHCP Server呢?原因無他,Linux 下的DHCP Server效能極佳,可兼併執行其他Server,本文提供數種與DHCP Server搭配的網路整合方案,以其對讀者組織區域網路時有所助益。

參考資料

1. http://www.isc.org:ISC組織,DHCPD程式製作公司

2. http://www.tp.edu.tw:台北市教育網路中心

3. man dhcpd:Dhcpd daemon說明文件

4. man dhcpd.conf:Dhcpd daemon的組態檔說明文件

5. man dhcpd.leases:Dhcpd daemon的租約檔說明文件

6. /usr/doc/ dhcp-2.0/dhcpd.conf.sample:dhcpd.conf設定範例

7. /usr/doc/HOWTO/mini/DHCP:DHCP mini-HOWTO(DHCPd/DHCPcd)