伺服器架設篇 - RedHat 9

第十六章、簡易 DHCP 伺服器設定

Dynamic Host Configuration Protocol 主機的設定問題

最近更新時間: 2003/03/15

本文資料主要針對 RedHat 9 的系統進行說明,要注意的是,RedHat 9 與 Red Hat Enterprise Linux (RHEL) 是完全不同的東西!RedHat 9 在 2003 年推出,在 2004 年就不再維護了!這部份網站更新到 2005 年,也沒有再維護過! 因此,建議您前往本站查詢最新版本的 Linux distribution 文章來閱讀,比較不會浪費時間。那為何還需要編輯 RedHat 9 的資料呢? 鳥哥只想要做個自己曾經撰寫過的文件內容保存而已囉! ^_^!最新文章請前往鳥站首頁查閱囉!
如果您在工作單位使用的是筆記型電腦,而且常常要帶著您的筆記型電腦到處跑,那麼由前幾章的『連上 Internet 』設定當中,會發現,哇!我的網路卡參數要常常修改啊!而且,每到一個新的地方,就得問清楚該地的 Server 提供的網路參數才行!真是麻煩~~這個時候,動態主機設定協定 (DHCP) 可就大大的派上用場啦!DHCP 這個伺服器可以自動的分配 IP 與相關的網路參數給 Client 端,來提供 Client 端自動以主機提供的參數來設定他們的網路,如此一來,使用者只要將自己的 Notebook 設定好經由 DHCP 協定來取得網路參數後,一插上網路線,呵呵!馬上就可以享受 Internet 的服務啦!很方便吧!所以得來瞧一瞧這個好用的協定喔!

原理:

    老規矩,在正式的進入 DHCP (Dynamic Host Configuration Protocol ) 主機設定之前,我們先來認識一下 DHCP 這個協定吧!還有,需要瞭解的是,我們是否有需要『一定』得設定 DHCP 這個伺服器呢?這裡都需要釐清一下概念喔!
     

    什麼是 DHCP


     
    在開始 DHCP 的說明之前,我們先來複習一下之前在『網路基礎』裡面提到的幾個網路參數吧!要設定好一個網路的環境,使電腦可以順利的連上 Internet ,那麼您的電腦裡面一定要有底下幾個網路的參數才行,分別是:
     
    • IP
    • netmask
    • network
    • broadcast
    • gateway
    • DNS IP
     
    其中,那個 IP, netmask, network, broadcast 與 gateway 都可以在 /etc/sysconfig/network-scripts/ifcfg-eth[0-n] 這些個檔案裡面設定,DNS 的位址則是在 /etc/resolv.conf 裡頭設定。呵呵!只要這幾個項目設定正確,那麼電腦應該就沒問題的可以上網了!所以說,您家裡面的 3, 4 部電腦,您都可以手動的來設定好您所需要的網路參數,然後利用 NAT 主機的功能,就可以大搖大擺的 連上 Internet 了!真是不錯 ^_^,不是嗎?
     
    好了,現在讓我們換一個大一些些的場景吧!假設您是學校宿舍的網路管理員,所管理的學生電腦大概有 100 部好了,那麼您怎麼設定好這 100 部的電腦呢?
     
    1. 直接每一部電腦都讓您登門拜訪手動的去設定好?
    2. 將所有的學生都集合起來,然後精神訓話.....喔不!是直接教導一下怎麼設定?還是
    3. 藉由一部主機來自動的分配所有的網路參數給宿舍內的任何一部電腦?
     
    這三種解決方案所需要的時間都不相同,如果您選擇的是(1),那麼我個人認為,您不是工作狂就是瘋掉了,因為所要花費的時間與您所得的薪水與付出的心力是完全不成比例的~~如果選擇是(2)那麼很可能您會被掛上獨裁者、沒良心的管理員的稱號!如果是選擇(3)呢?恭喜您!這個方案的管理時間花費最短,也是最不麻煩的作法啦!
     
    呵呵!知道我要說些什麼了嗎?是的!這個 DHCP ( Dynamic Host Configuration Protocol ) 主機最主要的工作,就是在進行前面提到的第三個方案,也就是自動的將網路參數正確的分配給網域中的每部電腦,讓 Client 端的電腦可以在開機的時候就立即自動的設定好網路的參數值,這些參數值可以包括了 IP、netmask、network、gateway 與 DNS 的位址等等。如此一來,呵呵!身為管理員的您,只要注意到這一部提供網路參數的主機有沒有掛掉就好了,其他同學們的個人電腦,哈!您想都不必想要怎麼去幫忙!因為 DHCP 主機已經完全都幫您搞定啦! ^_^! 阿!當管理員最大的幸福就是可以喝喝茶、聊聊天就能控管好一切的網路問題呢!
     

    DHCP 的運作方式:


     
    運作模式:
    那麼 DHCP 是怎麼運作的呢?現在假設我們的機器在同一個網域當中,也就是說, DHCP Server 與他的 Clients 都在同一個網段之內,可以透過軟體廣播的方式來達到相互溝通的狀態。那麼 Client 藉由 DHCP Server 得到 IP 的程序為:
     
    1. 若 Client 端電腦設定使用 DHCP 協定以取得網路參數時,則 Client 端電腦在開機的時候,或者是重新啟動網路卡的時候,會自動的發出 DHCP Client 的需求給網域內的每部電腦:這個時候,由於發出的訊息希望每部電腦都可以接受,所以該訊息除了網路卡的硬體位址(MAC)無法改變外,需要將該訊息的來源軟體位址設定為 0.0.0.0 ,而目的位址則為 255.255.255.255 (這個我們 Linux 會自動幫您設定,無須考慮這個問題!)。這個時候,網域內的其他沒有提供 DHCP 服務的電腦,收到這個封包之後會自動的將該封包丟棄而不回應;而如果是 DHCP 主機呢?

    2.  
    3. DHCP 主機回應訊息:如果是 DHCP 主機收到這個 Client 的 DHCP 需求時,那麼 DHCP 主機首先會針對該次需求的訊息所攜帶的 MAC 與 DHCP 主機本身的設定值去比對,如果 DHCP 主機的設定有針對該 MAC 做靜態 IP (每次都給予一個固定的 IP )的提供時,則提供 Client 端相關的固定 IP 與相關的網路參數;而如果該訊息的 MAC 並不在 DHCP 主機的設定之內時,則 DHCP 主機會選取目前網域內沒有使用的 IP (這個 IP 與設定值有關) 來發放給 client 端使用!此外,需要特別留意的是,在 DHCP 主機發放給 Client 端的訊息當中,會附帶一個『租約期限』的訊息,以告訴 Client 端,您這個 IP 可以使用的期限有多長!

    4.  
    5. Client 端接受來自 DHCP 主機的網路參數,並設定 Client 自己的網路環境:當 Client 端接受回應的訊息之後,首先會以 ARP 封包在網域內發出訊息,以確定來自 DHCP 主機發放的 IP 並沒有被佔用!如果該 IP 已經被佔用了,那麼 Client 對於這次的 DHCP 資訊將不接受,而將再次向網域內發出 DHCP 的需求廣播封包;若該 IP 沒有被佔用,則 client 可以接受 DHCP 主機所給的網路的參數,那麼這些參數將會被使用於 client 端的網路設定當中,同時, Client 端也會對 DHCP 主機發出確認封包,告訴 Server 這次的需求已經確認!而 Server 也會將該資訊記錄下來;

    6.  
    7. Client 端結束該 IP 的使用權:當 Client 開始使用這個 DHCP 發放的 IP 之後,有幾個情況下他可能會失去這個 IP 的使用權:
      • Client 端離線:不論是關閉網路介面( ifdown )、重新開機 ( reboot )、關機 ( shutdown ) 等行為,皆算是離線狀態,這個時候 Server 端就會將該 IP 回收,並放到 Server 自己的備用區中,等待未來的使用;
      • Client 端租約到期:前面提到 DHCP server 端發放的 IP 有使用的期限, Client 使用這個 IP 到達期限規定的時間,就需要將 IP 繳回去!這個時候就會造成斷線,而 Client 也可以再向 DHCP 主機要求再次分配 IP 囉!
     
    以上就是 DHCP 這個協定在 Server 端與 Client 端的運作狀態,由上面這個運作狀態來看,我們可以曉得,喝!只要 Server 端設定沒有問題,加上 Server 與 Client 在硬體連線上面確定是 OK 的,那麼 Client 就可以直接藉由 Server 來取得上網的網路參數,當然啦,只要我們這些管理員能夠好好的、正確的管理好我們的 DHCP ,嘿嘿!那麼自然上網的設定就變成一件很簡單的事情啦!
     
    IP 取得的方法:
    在上面的步驟裡面,注意到第二步驟了嗎?就是 DHCP 會去比較 MAC 這個硬體位址,並判斷該 MAC 是否需要給予一個固定的 IP 呢!呵呵!所以啦,我們在 Client 端由 DHCP 主機取得的 IP 主要有兩種方式:
     
    • 靜態 ( Static ) IP :只要那個 client 端電腦的網路卡不換掉,那麼 MAC 肯定就不會改變,由於 DHCP 可以根據 MAC 來給予固定的 IP ,所以該電腦每次都能以一個固定的 IP 連上 Internet !呵呵!這種情況比較適合當這部電腦需要用來做為提供區域內的一些網路服務的主機之用。那麼如何在 Linux 上面知道您的 MAC 呢?很簡單啦!有很多的方式,最簡單的方式就是使用 ifconfig 及 arp 來進行:
    • [root@test root]# ifconfig eth0
      ifconfig
      eth0      Link encap:Ethernet  HWaddr 00:50:FC:22:9C:57
                inet addr:192.168.1.2  Bcast:192.168.1.255  Mask:255.255.255.0
                UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
                RX packets:333678 errors:0 dropped:0 overruns:0 frame:0
                TX packets:377219 errors:0 dropped:0 overruns:0 carrier:0
                collisions:195 txqueuelen:100
                RX bytes:42243563 (40.2 Mb)  TX bytes:278373316 (265.4 Mb)
                Interrupt:10 Base address:0x6100

      [root@test root]# arp
      Address             HWtype  HWaddress           Flags Mask            Iface
      test.linux.org      ether   00:50:FC:22:9C:57   C                     eth0
      192.168.1.100       ether   00:02:44:19:A6:AD   C                     eth0

       
    • 動態 ( dynamic ) IP:Client 端每次連上 DHCP 所取得的 IP 都不是固定的!都直接經由 DHCP 所隨機由尚未被使用的 IP 中提供!
     
    除非您的區域網路內的電腦有可能用來做為主機之用,所以必需要設定成為固定 IP ,否則使用動態 IP 的設定比較簡單,而且使用上面具有較佳的彈性。怎麼說呢?假如您是一個 ISP 好了,而您只申請到 150 個 IP 來做為您的客戶連線之用。那麼您是否真的只能邀集到 150 的使用者?呵呵!當然不囉!我可以邀集 200 個使用者以上呢!為什麼?這樣想好了,我今天開了一家餐館,裡面只有 20 個座位,那麼是否我一餐只能賣給 20 個人呢?當然不是啦!因為客人是人來人往的,有人先吃有人後吃,所以同樣是 20 個座位,但是可以有 40 個人來吃我的簡餐,因為來的時間不一樣嘛!瞭解了嗎?呵呵!對啦!您這個 ISP 雖然只有 150 個 IP 可以發放,但是因為您的使用者並非 24 小時都掛在線上的,所以您可以將這 150 個 IP 做良好的分配,讓 200 個人來『輪流使用』這 150 個 IP 哩!
     
    好了,那麼另外一個問題,還是搞不懂什麼是『靜態 IP 』與『動態 IP』呢?不都是由 DHCP 發放的嗎?讓我們再來談一個小例子好了。目前(2003年)上網的主流是 ADSL 撥接制這種方法,其中,由於撥接制所以每次上線的 IP 都不一樣!這可以想成是 DHCP 的 動態 IP 分配方式!那麼如果您是使用 GIGA 的撥接制給予的固定 IP 呢?呵呵!那個方式其實還是使用撥接之後才能得到連線啦!只不過 ISP 經由 PPP 協定當中的密碼來判斷使用者,讓同一個使用者每次都可以收到一個固定的 IP 而已!這樣可以理解了嗎?呵呵!您可以想成,撥接到 ISP 就是類似 client 端發送一個 DHCP 的需求給 DHCP 主機,而將 GIGA 想成我們 DHCP 裡面的固定 IP 分配方式,而 Seednet 之類的 ISP 動態給予 IP 的,就是 DHCP 裡面使用的 dynamic IP 分配方式啦! ( 註:其實在軟體位址亦即是 IP 上面,只有 Public IP 與 Private IP 兩種,中文翻譯成『公共 IP』與『私有 IP』這兩個,至於其他所謂的『靜態 IP』、『實體 IP』、『虛擬 IP』、『浮動式 IP』等等,都是藉由一些 IP 取得的方式來分類的,對於此種分類方式可能會造成讀者的困擾,所以,請特別留意這些 IP 的意義,不要搞混了!如果還是害怕會搞不清楚,那麼只要先記得『公共 IP』是可以直接與 Internet 相互溝通的,至於『私有 IP』則是不能直接與 Internet 溝通的內部 IP 段!)
     
    關於租約的行為:
    怪了!如果我們觀察上面 DHCP 運作模式的第二個步驟,您會發現最後面還有一個租約期限!幹嘛還要這樣的一個期限呢?其實設定期限還是有個優點啦!最大的優點就是可以避免該 IP 被某些使用者一直佔用著,但該使用者卻是 Idle ( 發呆 ) 的狀態!舉個例子來說,我們剛剛不是說到,我有 150 個 IP ,但是偏偏我有 200 個用戶嘛!那麼假設剛好例如 2002 年的世界盃足球賽好了,每個使用者都急著上網知道消息,那麼將會達到交通尖峰時段!也就是說,這 200 個人同時要來使用這 150 個 IP ,有可能嗎?當然不可能!肯定會有 50 個人無法連線,因為『很抱歉!目前系統正在忙線中,請您稍後再撥!』那怎麼辦?這個時候租約到期的方式就很有用處啦!那幾個已經連線進來很久的人,就會因為租約到期而被迫離線,這個時候該 IP 就會被釋放出來,哈哈!大家趕快搶呀!先搶到先贏喔!所以,那 50 個人 ( 包括被迫離線的那個朋友 ) 只好繼續的、努力的、加油的來進行 DHCP 的要求囉! ^_^""
     
    雖然說是優點,但是其實如果站在使用者的角度來看,還是可能會造成公憤的!憑什麼大家一起交錢,我先連線進來就需要先被踢出去?~呵呵!這個在早期 Hinet 就是這點被罵的要死!為什麼呢?因為他的 ADSL 撥接制,似乎真的就有這個租約到期的問題,限制的時間似乎是 24 小時的樣子!所以,使用 Hinet ADSL 撥接制的朋友,每 24 小時就要忍受一次斷線!我沒有使用過 Hinet 的 ADSL 撥接制,網路上的朋友確實有回應這樣的事情,但是我不確定現在( 2003/03/15 )Hinet 是否還是用這套設定值?這樣您可以瞭解租約到期的行為了嗎?! ^_^
     
    關於 DHCP 主機個數:
    或許您曾經發現過一件事情,那就是,當我的網域裡面有兩部以上的 DHCP 主機時,到底哪一部主機會設定我的這部 Client 端電腦?呵呵!很抱歉,俺也不曉得!因為在網路上面,很多時候都是『先搶先贏』的,同樣的, DHCP 的回應也是如此!當 Server1 先回應時,您使用的就是 Server1 所提供的網路參數內容,如果是 Server2 先回應,您就是使用 Server2 的參數來設定您的 PC !不過,前提之下當然是這些電腦的『物理連線』都是在一起的啊!
     

    什麼時候需要 DHCP ?


     
    什麼時候才需要架設 DHCP 呢?是否每個人都最好架設一部 DHCP 主機呢?那可就見仁見智啦!接下來要告知大家的是幾個概念性的問題,您倒不一定『必需』遵守底下的一些概念呢!反正,自己的網域自己『爽』就好啦!
     
    • 什麼時候最好使用 DHCP ?

    • 在某些情況之下,倒是強烈的建議架設 DHCP 主機的!什麼情況呢?例如:
       
      1. 您的公司內部很多 Notebook 電腦使用的場合!因為這種 NoteBook 本身就是移動性的裝置,如果每到一個地方都要去問人家『喂!您這邊的網路參數是什麼?』還得要擔心是否會跟人家的 IP 相衝突等等的問題!這個時候,DHCP 可就是您的救星囉!因為 Notebook 在使用上,當設定為 DHCP client 的時候,那麼只要他連接上的網域裡面有一部可以動作的 DHCP ,那麼那部 notebook 就可以連接上 Internet 了!真好,不是嗎?!

      2.  
      3. 網域內電腦數量相當的多時:另外一個情況就是您所負責的網域內電腦數量相當龐大時,大到您沒有辦法一個一個的進行說明來設定他們自己的網路參數,這個時候為了省麻煩,還是架設 DHCP 來的方便吶!況且,維護一部您熟悉的 DHCP 主機,要比造訪幾十個不懂電腦的人要簡單的多哩!^_^
       
    • 什麼情況下不建議使用 DHCP 主機?

    • 雖然 DHCP 有很多好處,但是您有沒有發現一個步驟怪怪的呀!回頭看一下那個步驟一, Client 在開機的時候會主動的發送訊息給網域上的所有機器,這個時候,如果網域上就是沒有 DHCP 主機呢?很抱歉,那麼您的這部 Client 端電腦,『仍然會持續的發送訊息!』真正的時間與次數我不曉得會有多久,不過,肯定會超過 30 秒以上,甚至可以達到一分鐘以上!哇!那麼這段時間您能幹嘛?呵呵!除了等、還是等!所以囉,如果電腦數不多,還是使用手動的方式來設定一下就好了!方便嘛!
       
      1. 在您網域內的電腦,有很多機器其實是做為主機的用途,很少 Client 需求,那麼似乎就沒有必要架設 DHCP ;

      2.  
      3. 更極端的情況是,像一般家裡,只有 3 ~ 4 部電腦,這個時候,架設 DHCP 只能拿來練練功力,事實上,並沒有多大的效益;

      4.  
      5. 當您管理的網域當中,大多網路卡都屬於老舊的型號,並不支援 DHCP 的協定時;

      6.  
      7. 很多使用者的資訊知識都很高,那麼也沒有需要架設 DHCP 啦。
     
    如前所述,上面的都是概念性的說法,事實上,一件事情的解決之道是有很多的方案的,沒有所謂的『完全正確』的方案,只有『相對可行、並且符合經濟效益與功能』的方案!所以囉,架設任何網站之前,請先多評估評估吶!

套件安裝:

在 Linux 上面 DHCP 套件的安裝也是很簡單的,不需要以 Tarball 來安裝啦!直接拿出您的原版光碟, mount 他,並且找到 dhcp 字樣的套件,使用 RPM 安裝好就好了!以 mandrake 9.0 及 Red Hat 9 為例的話,您需要的 DHCP 套件為:
 
# 在 Mandrake 9.0 當中:
[root@test root]# rpm -qa | grep dhcp
dhcp-server-3.0-1rc9.2mdk
dhcp-common-3.0-1rc9.2mdk
dhcp-client-3.0-1rc9.2mdk
 
# 在 Red Hat 9 當中:
[root@test root]# rpm -qa | grep dhcp
dhcp-3.0pl1-23
dhcp-devel-3.0pl1-23
 
看到了吧!我們需要的套件在不同的 Linux 版本上面會有些許的差異喔!如果是 Mandrake 系列的話,DHCP 套件檔案總數會有三個囉!如果沒有安裝的話,請拿出您的原板光碟(不論是那個 Linux distribution ,應該都是這三個套件名稱啦!只是後面的版本可能不一樣就是了!但是,需要注意的是,在 Red Hat 上面,這三個套件被整合成為一個,亦即是 dhcp-xxxx.rpm 的檔案就是了!),先掛載上去,然後就以 rpm 給他安裝啦!什麼?不知道如何搞定 RPM ?唉啊!又得拿出『鳥哥的 Linux 私房菜 -- 基礎學習篇』好好的 K 一 K 『 RPM 與 Tarball 的使用』。另外,如果在系統當中沒有找到 dhcp 套件的話,還可以使用前面 網路升級套件 章節提到的 apt-get 或者是 urpmi 都是很好的安裝方式吶! ^_^

設定 DHCP Server:


    DHCP 套件結構
     
    在 DHCP 的套件結構當中,也是僅有一個設定檔。這個設定檔不見得會存在喔!也是需要我們手動來建立的吶!談一談先:
     
    • /etc/dhcpd.conf:這個就是 dhcp 的主要設定檔咯!這個檔案不見得會存在,請手動來建立喔!另外,其實每個 dhcp 套件在釋出的時候,都會附上一個範例檔案,您可以使用 rpm -ql grep dhcp 來查詢到 dhcpd.conf.sample 這個檔案吶!然後將該檔案複製成為 /etc/dhcpd.conf 後,在手動去修改 /etc/dhcpd.conf 即可,這樣設定比較容易咯!(註:這個設定檔在不同的 Linux distribution 當中會有不一樣的放置目錄喔!例如在 openlinux 底下,這個設定檔預設需要放置在 /etc/dhcpd/dhcpd.conf 呢!)

    •  
    • /usr/sbin/dhcpd:這個就是 DHCP 的 daemon 執行檔囉!

    •  
    • /var/lib/dhcp/dhcpd.leases:這檔案頗有趣的!我們前面原理部分不是有提到『租約』嗎?呵呵!租約的啟始與到期日就是記錄在這個檔案當中的咯!
     
    整個 DHCP 的設定檔與檢查的檔案就是這幾個而已,很簡單吧!^_^
     

    主機的規劃技巧
     
    如果您的機器僅要提供 DHCP 的服務的話,那麼真的一部 P-133 MMX 的 586 主機就很足夠了!而且 partition 的規劃不是很重要,因為 DHCP 主機並不會使用到硬碟空間,最多僅只是那個租約到期的紀錄檔而以(/var/lib/dhcp/dhcpd.leases)。
     

    設定流程
     
    好不容易!終於到了要架設 DHCP Server 的時候了,哇!好感動.....咦!鳥哥怎麼老是在唱單口相聲.... @_@。其實要設定好一個 DHCP 主機還真是蠻簡單的,只要設定一個檔案即可!但是前面的確認工作請先仔細的查驗好!
     
    1. 確認硬體的連線沒有問題:

    2. 這可是架設網站的第一個重點!如果您的硬體沒有搞定,那麼軟體再怎麼厲害,呵呵!也是沒有用的啦!目前我的架構就像底下這樣,我的 Linux 主機上面有兩張網路卡,一張對內一張對外喔!
       
    3. 確認 dhcp 相關設定檔案擺放的路徑:

    4. 請您特別留意的是,不同的 Linux distribution 中,每個套件的設定檔放置的位置都不相同,例如 OpenLinux 使用的 dhcp 設定檔放置在 /etc/dhcpd/dhcpd.conf ,而 Red Hat 與 Mandrake 則放在 /etc/dhcpd.conf 裡頭!那麼我要怎麼確認呢?呵呵,因為我知道設定檔案與 server 有關,所以當然是查詢 dhcp-server 這個套件囉,要查詢設定檔,可以加上 c 的參數,所以:
      [root@test root]# rpm -qc dhcp-server (在 Red Hat 使用 rpm -qc dhcp )
      /etc/dhcpd.conf.sample
      /etc/rc.d/init.d/dhcpd
      /etc/sysconfig/dhcpd
      /var/lib/dhcp/dhcpd.leases
      喝!知道那個 /etc/dhcpd.conf.sample 是範例檔,注意,我們的 DHCP 設定檔之檔名為 dhcpd.conf ,所以囉,馬上就知道我們的設定檔案即為 /etc/dhcpd.conf 囉!咦!這個檔案不存在哪!沒有關係,我們要自動的建立這個檔案喔! 除此之外,如果您是使用 RPM 安裝的 DHCP ,那麼察看一下 /etc/rc.d/init.d/dhcpd 這個 scripts 的內容,也可以知道設定參數檔的位置,甚至也可以修正 dhcpd.conf 的位置呢!
       
    5. 設定 dhcpd.conf 設定檔:

    6. 好了,那麼來到最重點啦!我們的 DHCP 就只要設定這個檔案即可!那麼這個檔案如何設定呢?基本上,我們剛剛前面提過說, DHCP 的 IP 分配可分為給予動態 IP靜態 IP ,其中,又需要瞭解的是,如果需要設定靜態 IP 的話,那麼就必須要知道要設定成靜態 IP 的那部電腦的硬體位址 (MAC)才行,請使用 arp 及 ifconfig 來查知您的介面的 MAC 吧!此外,我們需要設定的項目大概有幾項:
       
      • 整體設定(Global):裡面含有租約期限啦、或許還有 DNS 位址與 router 的設定等等內容;
      • 動態 IP 設定:使用 subnet 的項目與 range 的參數來設定要分配出去的 IP !請先確認好您的網段喔!
      • 靜態 IP 設定:使用 host 這個項目段,配合 MAC 來設定!
       
      在 dhcpd.conf 這個檔案裡頭有些地方要特別留意:
       
      • 『#』為註解符號;
      • 除了括號那一行之外,其他的每一行後面都要以『 ; 』做為結尾!這很重要!
       
      那麼我的網路環境是怎樣呢?鳥哥假設是這樣的喔:
       
      • 目前我的內部網段設定為 192.168.1.0/24 這一段,且 router 為 192.168.1.2 ,此外, DNS 主機的 IP 為中華電信的 168.95.1.1 及 Seednet 的 139.175.10.20 這兩個;
      • 我想要讓每個使用者預設租約為 3 天,最長為 6 天;
      • 我只想要分配的 IP 只有 192.168.1.21 到 192.168.1.100 這幾個,其他的 IP 則保留下來;
      • 我還有一部主機,他的 MAC 是『 00:40:95:30:43:B4 』,我要給他的主機名稱為 vbird-inside ,且 IP 為 192.168.1.5 這個。
       
      則,我的設定檔為:
       
      [root@test root]# vi /etc/dhcpd.conf 
      # 這個檔案在各家 Linux 中,可能放置的目錄不同而且不見得會存在,請自行建立!

      # 再次說明,這個檔案中,行首為 # 的,則為註解,且,
      # 設定的每一行之行尾,都需要 ; 符號。
      # 這個檔案的設定寫法主要有兩種,首先是有獨特的設定名稱的,例如
      # default-lease-time ,
      # < 參數代號 >     < 設定內容 > ;
      # default-lease-time  259200    ;
      # 再來則是由 option 這個代號後面接的參數代碼
      # option < 參數代碼 > < 設定內容 >  ;
      # option domain-naim  "domain.name" ;

      # 1. Global 首先建立整體的設定值,亦即是,當 subnet 或 host 
      #  當中沒有設定的,以 global 為準

      # 1.1 設定租約期限:
      default-lease-time 259200;  # 預設的租約時間,後面接的時間為秒鐘。
      max-lease-time     518400;   # 但是超過租約時間(就是 default-lease-time)
                                   # 還可續約,不過,最長還是只到 518400 秒!

      # 1.2 設定領域名稱與 DNS IP 
      option domain-name   "dhcp.vbird.org" ; # 設定每部主機的後頭
                          # 領域名稱為 dhcp.vbird.org !
      option domain-name-servers 168.95.1.1, 139.175.10.20 ;
      # 上面這個設定在寫入 DNS 的 IP ,會自動在 Client 端修改 /etc/resolv.conf
      # 檔案,若有兩個 DNS 的 IP 以上,那麼就需要以 , 符號分隔開來!
      # 最後面還是得加上 ; 符號
      ddns-update-style ad-hoc; 
      # 在 Mandrake 9.0 這一版當中,由於加入許多新功能,所以,這一行
      # 就需要加入才行啟動 DHCP ,至於在 Red Hat 當中則是加入如下行:
      # ddns-update-style interim;

      # 2. 動態 IP 分配的設定:
      subnet 192.168.1.0 netmask 255.255.255.0 {
         range 192.168.1.21 192.168.1.100;
         option broadcast-address 192.168.1.255;
         option routers 192.168.1.2;
      }
      # 動態 IP 就如同上面的設定內容,主要以 subnet 與 netmask 來進行前頭的說明,
      # 亦即先宣告我要的網段是哪一段,這部份就一定得要回去參考一下網路基礎
      # 的部分了!千萬記得吶!然後,那個 range IP1 IP2; 那一行,都以空白字元
      # 隔開即可,而 range 表示我要分配的 IP 就是在 IP1 與 IP2 這之間的 IP 段
      # 就是了!再者,我總是要給 broadcast 吧!沒錯!那個 
      # option broadcast-address 即是給予的 broadcast 了;至於 routers 
      # 不用說也知道那是什麼了吧?所以,我們就已經含有 IP, network, netmask,
      # broadcast 與 router 囉!這樣就可以順利上網啦!至於 DNS 則是在
      # 上面 global 處已經設定囉!

      # 3. 靜態 IP 的設定:
      host vbird-inside {
         hardware ethernet  00:40:95:30:43:B4;
         fixed-address 192.168.1.5;
         option broadcast-address 192.168.1.255;
         option routers 192.168.1.2;
      }
      # 靜態 IP 肯定跟 MAC 有關的,所以請先查出來 MAC 吧!然後的設定您都知道啦!

       
      • 在 Global 的設定當中,也就是不在 subnet 與 host 的括號內的設定資料,就是可以被視為『預設』的資料啦!也就是說,當 subnet 裡頭沒有寫到租約期限啦、沒有寫到 domain-name 啦,那麼這個 Global 的設定就會自動被拿去做為該設定內的設定內容囉!
       
    7. 建立租約期限檔案:

    8. 既然我們知道 DHCP 是由用戶與主機端之間的租約是否到期來進行是否繼續連線的動作,那麼自然就有所謂的『簽約儀式』囉!哈哈!真會掰!這個時候,我們就得要知道一下,那麼我到底要在哪裡設定這個租約期限檔案呢?如果在比較早期的版本中,這個步驟一定要進行的!不過,目前的版本中,似乎預設已經有這個租約期限檔案了!無論如何,還是作一下比較安心啦!
       
      [root@test root]# touch /etc/dhcpd.leases 
      # 建立租約檔案同樣的,注意您的版本目錄!
       
      這個檔案倒是蠻有趣的!因為在實際的運作過程中,這個檔案本身不會有什麼作用,但是在啟動了 DHCP 之後,這個檔案會被 copy 一份成為底下的檔案: 『/var/lib/dhcp/hdcpd.leases』而真正在記錄的,其實就是這個 /var 底下的檔案啦!後面我們再來看一下這個檔案的內容吧!目前還不會用到這個檔案的內容囉!(註:如果您使用的 Linux 是最近的版本,那麼應該不需要再執行這個步驟了!無論如何,您可以先略過這個步驟,到啟動的時刻下,如果未能正確啟動,再回來做這一步都還來得及呢!)
       
    9. 編輯 scripts 內容:

    10. 咦!不是可以啟動了嗎?喔不~我們還得要檢查一下,您要提供 DHCP 的介面是哪一個呢!就如同我上面的圖示,基本上,我的主機是有兩塊網路卡的,一塊對外一塊對內,而我只對這個對內部的網路卡啟動 DHCP ,因此,我可以修改一下我的 /etc/rc.d/init.d/dhcp 這個檔案:註:我是以 Mandrake 9.0 為例來說明的,如果您是使用 Red Hat 或者是 OpenLinux 等其他版本時,您應該可以找到『 daemon /usr/sbin/dhcpd 』那一行,將他改成底下的樣子也就可以啦!
       
      [root@test root]# vi /etc/rc.d/init.d/dhcpd
      # 這是啟動的 script 檔案

      # 先找到底下的設定內容,如果沒有找到也沒有關係,就自行新增吧!
      CONFIGFILE="/etc/dhcpd.conf"      # 這個是設定檔案的完整路徑名稱
      LEASEFILE="/var/lib/dhcp/dhcpd.leases" # 這個是在設定租約期限記錄檔案
      INTERFACES="eth0"          # 這個則是要啟用 DHCP 的主機網路介面卡
      OPTIONS="-q"              # 其他的 dhcpd 的參數設定值!
      start() {
          .....(略)...
          daemon /usr/sbin/dhcpd -cf $CONFIGFILE -lf $LEASEFILE $OPTIONS $INTERFACES
          .....(略)...
      }
      ....

       
      基本上,上面的 /etc/dhcpd.conf 設定檔案的所在目錄是可以變動的!就在這裡進行更動即可!您可以使用 man dhcpd 就可以知道每個參數代表的意義了!請注意,那個 start() 裡面的資訊,只要更動找到的 daemon .... 那一行即可!至於上面的參數設定內容,則可以參考 BASH 的變數設定方法來寫!目前因為我們只要針對 eth0 來啟用 DHCP 而已,所以上面 INTERFACES 的部分我就寫入了 eth0 而已,如果您還要啟動 eth1 的話,那麼就需要:『 INTERFACES="eth0 eth1"』兩個介面中間以空白字元來隔開!這樣,大致上就已經設定妥當了!準備來去啟動啦!
       
    11. 啟動 DHCP 服務:

    12. 啟動服務的方法不需要再教了吧!?直接給他執行剛剛改過的 scripts 即可:
       
      [root@test root]# /etc/rc.d/init.d/dhcpd start 啟動的啦!
      Starting dhcpd:                              [  OK  ]
       
      注意螢幕前面要顯示 OK 才可以呢!好了,除此之外,我們還要確認 DHCP 已經啟動才行!
       
    13. 確認正確的啟動 DHCP :觀察啟動的 port 號與登錄檔的訊息:

    14. 要注意的是,雖然我們已經驅動了 script 了,不過,您仍然不會知道,那個 script 是否真的讓您的 service 啟動了哪?所以,在啟動任何的服務之後,觀察一下兩個東西,一個是 port 是否以啟動,另一個則是到登錄檔去查詢一下訊息!這都是很重要的資訊呢!所以,您應該這樣做:
       
      1. 最重要的就是察看登錄檔!也就是 /var/log/messages 這個檔案了!
      [root@test root]# vi /var/log/messages  先看看登錄擋吧!
      Nov 23 23:35:09 vbird dhcpd: Wrote 0 deleted host decls to leases file.
      Nov 23 23:35:09 vbird dhcpd: Wrote 0 new dynamic host decls to leases file.
      Nov 23 23:35:09 vbird dhcpd: Wrote 0 leases to leases file.
      Nov 23 23:35:09 vbird dhcpd: dhcpd startup succeeded
      一定要看到 Wrote xxxx to leases file 以及 succeeded 的字眼,
      才能確定啟動成功!

      2. 再來,觀察一下 port 有沒有在 listen 
      [root@test root]# netstat -utl
      Active Internet connections (only servers)
      Proto Recv-Q Send-Q Local Address           Foreign Address         State
      udp        0      0 *:bootps                *:*
      [root@test dhcp]# netstat -utln
      Active Internet connections (only servers)
      Proto Recv-Q Send-Q Local Address           Foreign Address         State
      udp        0      0 0.0.0.0:67              0.0.0.0:*

       
      仔細的看到喔! DHCP 顯示的是 bootps 這個字樣! WHY ?沒有什麼奇特的原因啦,因為 DHCP 的前身就是 bootps 這個 protocol ,所以當然就沿用啦!如果您想要修改這個字眼使成為 dhcp 的話,可以修改 /etc/services :
       
      [root@test root]# vi /etc/services
      找到這兩行:
      bootps         67/tcp                          # BOOTP server
      bootps         67/udp

      將他改成
      dhcp            67/tcp
      dhcp            67/udp

       
      那未來使用 netstat -tln 就可以得到 dhcp 的顯示了!嗄!忘記 netstat 後面的參數意義!喂!不要再混了!趕快回到前幾篇提過的『Linux 常用網路指令介紹』練一練基本功吧!
       
    15. 修改 /etc/hosts 檔案內容對應:

    16. 如果您有仔細的瞧過前幾章的 網路基礎 的話,那麼應該還會記得那個 /etc/hosts 會影響內部電腦的連線速度很大吧?!那麼我現在使用 DHCP 之後,糟糕!我怎麼知道哪一部 PC 連上我的主機,那麼要怎麼填寫 /etc/hosts 的內容呢?這真是太簡單了!那就將所有可能的電腦 IP 都加進去該檔案呀! ^_^ !以我為例,在這個例子中,我的分配的 IP 至少有 192.168.1.5, 192.168.1.21 ~ 192.168.1.100 ,所以我的 /etc/hosts 可以寫成:
       
      [root@test root]# vi /etc/hosts
      127.0.0.1   localhost.localdomain localhost
      192.168.1.2  vbird-server
      192.168.1.5  static-ip
      192.168.1.21 dynamic-021
      192.168.1.22 dynamic-022
      .....
      192.168.1.100 dynamic-100
       
      這樣一來,所有可能連進來的 IP 都已經有紀錄了,哈哈!當然沒有什麼大問題囉! ^_^

設定 DHCP Client

DHCP 的 Client 端,可以是 Windows 也可以是 Linux 呢!由於我的領域內剛好有兩部 Client 端的電腦,一部為 Linux ( Red Hat 7.3 ) 另一部為 Windows 2000 ,這裡就提一下,分別是怎樣設定的呢?
  • Linux 的 DHCP Client 端設定:

  • 設定還真是簡單的不行~直接修改一個檔案即可!由於我的 Linux 電腦有兩塊網路卡,其中, eth0 為使用 DHCP 來啟動的,所以我就可以修改底下的檔案呢:
     
    [root@test root]# vi /etc/sysconfig/network-scripts/ifcfg-eth0
    DEVICE=eth0
    BOOTPROTO=dhcp   <==只要這一行設定對了,其他的不要管!
    BROADCAST=192.168.1.255
    IPADDR=192.168.1.235
    NETMASK=255.255.255.0
    NETWORK=192.168.1.0
    ONBOOT=yes
    GATEWAY=192.168.1.2
     
    需要特別強調的是,Mandrake 與 Red Hat 都使用『BOOTPROTO=dhcp』來設定的!但是, OpenLinux 卻是使用『DYNAMIC=dhcp』來設定的!所以要注意您的 Linux distribution 喔!改完之後,就將我們的網路卡關掉再開!請注意,如果您是在遠端進行這個動作,您的連線『肯定會掛掉!』,因為網路卡被您關了嘛!呵呵!所以請在本機前面才進行喔!
     
    [root@test root]# ifdown eth0; ifup eth0
    Determining IP information for eth0 ..... done
    [root@test root]# ifconfig eth0
    eth0      Link encap:Ethernet  HWaddr 00:54:DG:08:QE:BE
              inet addr:192.168.1.100  Bcast:192.168.1.255  Mask:255.255.255.0
              UP BROADCAST NOTRAILERS RUNNING MULTICAST  MTU:1500  Metric:1
              RX packets:590 errors:0 dropped:0 overruns:0 frame:0
              TX packets:208 errors:0 dropped:0 overruns:0 carrier:0
              collisions:0 txqueuelen:100
              RX bytes:55145 (53.8 Kb)  TX bytes:29113 (28.4 Kb)
              Interrupt:10 Base address:0xd000
     
    棒吧!已經正確的取得 IP 的資料囉!
  • Windows 2000 底下的 DHCP Client 設定方式:

  • 在 Windows 底下的設定也真是太簡單了!
    1. 直接在『網路上的芳鄰』按右鍵,選內容;
    2. 然後選擇『區域連線』那一項,之後會出現如下的圖示:
    3. 在上圖當中,按下『內容』則會出現下面的圖示:
    4. 然後選擇『Internet Protocol (TCP/IP) 』那一項,之後按下內容,會出現選項:
    5. 然後自然就是一直按下『確定』!直到回到正常的桌面為止!這樣就已經正確的啟動了!哇!就是這麼簡單!
    6. 手動修訂一下網路設定的方式:
      • 在 Windows 底下,要修訂 IP 的方式依據不同的版本而有不同!如果是 Windows 98 系列的版本,就需要使用『winipcfg』,出現的是視窗畫面,您可以自己調一下;
      • 在 Windows 2000 底下,我不知道怎麼叫出視窗畫面,所以直接開啟一個『 C:>提示字元』,在『開始』==>『程式集』==>『附屬應用程式』裡面的『命令提示字元』那個就是啦! 
      • C:\>ipconfig /all   <==秀出所有的屬性

        Windows 2000 IP Configuration

        Ethernet adapter 區域連線:

                Connection-specific DNS Suffix  . : dhcp.vbird.org
                Description . . . . . . . . . . . : Realtek RTL8139(A) PCI Fast Ethernet Adapter
                Physical Address. . . . . . . . . : 00-40-95-30-43-B4
                DHCP Enabled. . . . . . . . . . . : Yes
                Autoconfiguration Enabled . . . . : Yes
                IP Address. . . . . . . . . . . . : 192.168.1.99
                Subnet Mask . . . . . . . . . . . : 255.255.255.0
                Default Gateway . . . . . . . . . : 192.168.1.2
                DHCP Server . . . . . . . . . . . : 192.168.1.2
                DNS Servers . . . . . . . . . . . : 168.95.1.1
                                                    139.175.10.20
                Lease Obtained. . . . . . . . . . : 2002年11月24日 AM 12:32:54
                Lease Expires . . . . . . . . . . : 2002年11月27日 AM 12:32:54

        C:\> ipconfig /renew  <==重新捉 IP 啦!

    這樣就 OK 啦!!很簡單吧!

除錯與檢視租約檔案:

接著下來,我們就要努力的來除蟲了!除蟲的第一步,就是察看登錄檔啦!最常發生的錯誤其實大概就是:
  1. 寫錯字:不要笑!真的很容易寫錯字的!這很正常!所以大家要多多的去檢查一下:
  2. 沒有加上『 ;』符號號:是的,這也是最常發生的錯誤啦!
  3. 新版 DHCP 新增的功能限制:有時後也會有這樣的訊息出現呢!
例如底下就是錯誤訊息的一般顯示狀態:
 
[root@test root]# vi /var/log/messages
Nov 23 23:32:25 vbird dhcpd: /etc/dhcpd.conf line 6: semicolon expected.
Nov 23 23:32:25 vbird dhcpd: option
Nov 23 23:32:25 vbird dhcpd: ^
Nov 23 23:32:25 vbird dhcpd: Configuration file errors encountered -- exiting
Nov 23 23:32:25 vbird dhcpd:
# 這一個例子告訴您,在第六行有錯誤!什麼錯誤?呵呵!/etc/dhcpd.conf 中仔細檢查囉!

Nov 23 23:34:12 vbird dhcpd: ** You must add a ddns-update-style statement to /etc/dhcpd.conf.
Nov 23 23:34:12 vbird dhcpd:    To get the same behaviour as in 3.0b2pl11 and previous
Nov 23 23:34:12 vbird dhcpd:    versions, add a line that says "ddns-update-style ad-hoc;"
Nov 23 23:34:12 vbird dhcpd:    Please read the dhcpd.conf manual page for more information. **
Nov 23 23:34:12 vbird dhcpd:
# 這個例子則在告訴您,您必須要新增一行字喔!不然不給您啟動! ^_^

 
這樣就能夠檢驗成功了!修改上面是很容易的啦!
再來要討論的則是那個租約檔案的內容問題!去看一下 /var/lib/dhcp/dhcpd.lease 的內容吧!
 
[root@test root]# vi /var/lib/dhcp/dhcpd.lease
lease 192.168.1.100 {
  starts 6 2002/11/23 16:15:22;
  ends 5 2002/11/29 16:15:22;
  tstp 5 2002/11/29 16:15:22;
  binding state active;
  next binding state free;
  hardware ethernet 00:90:cc:08:49:13;
  uid "\001\000\220\314\010I\023";
}
lease 192.168.1.99 {
  starts 6 2002/11/23 16:33:16;
  ends 2 2002/11/26 16:33:16;
  binding state active;
  next binding state free;
  hardware ethernet 00:40:95:30:43:b4;
  uid "\001\000@\2250C\264";
  client-hostname "tools";
}
lease 192.168.1.99 {
  starts 6 2002/11/23 16:33:21;
  ends 2 2002/11/26 16:33:21;
  binding state active;
  next binding state free;
  hardware ethernet 00:40:95:30:43:b4;
  uid "\001\000@\2250C\264";
  client-hostname "tools";
}
 
看到了吧!這個就是租約檔案的內容啦!詳細的記載何時申請的租約,以及期限在哪兒!嗯!這樣就完成記錄囉!

重點回顧

  • DHCP ( Dynamic Host Configuration Protocol ) 可以提供網路參數給用戶端 (client) 電腦自動設定其網路的功能;
  • 透過 DHCP 的統一管理,在同一網域當中就比較不容易出現 IP 衝突的情況發生;
  • DHCP 可以透過 MAC 的比對,來提供 Static IP (或稱為靜態 IP),否則,通常提供用戶端 dynamic IP (或稱為動態 IP);
  • DHCP 除了 Static IP 與 Dynamic IP 之外,還可以提供租約行為之設定;
  • 用戶端離線、不明原因的當機、超過租約期限等機會下,DHCP Server 與用戶端的租約行為會終止!
  • DHCP 可以提供的 MAC 比對、Dynamic IP 的 IP 範圍以及租約期限等等,都在 dhcpd.conf 這個檔案當中設定的;
  • 一般的情況之下,使用者需要自行設定 dhcpd.leases 這個檔案,不過,真正的租約檔案記錄是在 /var/lib/dhcp/dhcpd.leases 裡面;
  • 在新版的 DHCP 的設定檔 dhcpd.conf 當中,有時候需要加入『ddns-update-style ad-hoc;』才會正常的啟動;

參考資源:


本章習題練習 ( 要看答案請將滑鼠移動到『答:』底下的空白處,按下左鍵圈選空白處即可察看)

  • DHCP 的主要用途為何?
  • DHCP 主要的兩種 IP 分配模式為何?
  • 在有 DHCP 主機存在的網域當中,且 client 端亦使用 DHCP 來規劃用戶端的網路參數,那麼請問,在該網域當中,Client 端是如何取得 IP 的呢??
  • DHCP 是如何發送 Static IP 的?可以使用何種指令取得該資訊?
  • 在 DHCP 的租約檔,亦即 /var/lib/dhcp/dhcpd.leases 當中,記錄了什麼資訊?
  • DHCP 的登錄檔放置於何處?

  • 前往參考解答
修改歷史:
2002/11/23:第一次完成
2003/03/15:加入相關重點回顧、與練習題
2003/09/10:修改版面去!
其他連結
環境工程模式篇
鳥園討論區
鳥哥舊站

今日 人數統計
昨日 人數統計
本月 人數統計
上月 人數統計