本文已不再維護,更新文章請參考這裡

如果您在工作單位使用的是筆記型電腦,而且常常要帶著您的筆記型電腦到處跑,那麼由前幾章的『 連上 Internet 』設定當中,會發現,哇! 我的網路卡參數要常常修改啊!而且,每到一個新的地方,就得問清楚該地的 Server 提供的網路參數才行!真是麻煩∼∼這個時候,動態主機設定協定 (DHCP) 可就大大的派上用場啦!DHCP 這個伺服器可以自動的分配 IP 與相關的網路參數給 Client 端,來提供 Client 端自動以主機提供的參數來設定他們的網路,如此一來,使用者只要將自己的 Notebook 設定好經由 DHCP 協定來取得網路參數後,一插上網路線,呵呵!馬上就可以享受 Internet 的服務啦!很方便吧!所以得來瞧一瞧這個好用的協定喔!

1. 本章的行前準備工作
2. DHCP 運作的原理
  2.1 什麼是 DHCP 協定
  2.2 DHCP 的運作方式
  2.3 何時需要架設 DHCP 伺服器
3. DHCP 伺服器端的設定
  3.1 所需套件與套件結構
  3.2 主要設定檔 /etc/dhcpd.conf 的語法
  3.3 一個區域網路的 DHCP 伺服器設定案例
  3.4 DHCP 伺服器的啟動與觀察
  3.5 內部主機的 IP 對應
4. DHCP 用戶端的設定
  4.1 Linux 用戶端
  4.2 Windows 用戶端
5. 伺服器端資料查閱
  5.1 檢查租約檔案
  5.2 使用 ether-wake 實行遠端自動開機 (remote boot)
6. 重點回顧
7. 課後練習
8. 參考資料
9. 針對本文的建議:http://phorum.vbird.org/viewtopic.php?p=117845

本章的行前準備工作
由於 DHCP 必需要設定整個區域網路的網段規定,還有得要瞭解路由設定,以及一堆與網路有關的資訊等等, 所以你一定要熟悉網路基礎。此外,由於 DHCP server 套件預設應該是不會安裝啦,所以你也必需要瞭解如何使用 rpm 或者是 yum 等工具才行。

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


什麼是 DHCP 協定
在開始 DHCP 的說明之前,我們先來複習一下之前在網路基礎裡面提到的幾個網路參數吧! 要設定好一個網路的環境,使電腦可以順利的連上 Internet ,那麼您的電腦裡面一定要有底下幾個網路的參數才行,分別是: 其中,那個 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) 主機最主要的工作,就是在進行前面提到的第三個方案,也就是自動的將網路參數正確的分配給網域中的每部電腦, 讓用戶端的電腦可以在開機的時候就立即自動的設定好網路的參數值,這些參數值可以包括了 IP、netmask、network、gateway 與 DNS 的位址等等。如此一來,呵呵!身為管理員的您,只要注意到這一部提供網路參數的主機有沒有掛掉就好了, 其他同學們的個人電腦,哈!您想都不必想要怎麼去幫忙!因為 DHCP 主機已經完全都幫您搞定啦! ^_^! 阿!當管理員最大的幸福就是可以喝喝茶、聊聊天就能控管好一切的網路問題呢!


DHCP 的運作方式
你必需要知道的是,DHCP 通常是用區域網路內的一個通訊協定,他主要藉由用戶端傳送廣播封包給整個物理網段內的所有主機, 若區域網路內有 DHCP 主機時,才會回應用戶端的 IP 參數要求。所以囉,DHCP 伺服器與用戶端是應該要在同一個物理網段內的。 而用戶端取得 IP 參數的程序可以簡化如下:
  1. 用戶端利用廣播封包發送 DHCP 需求:
    若用戶端設定使用 DHCP 取得 IP (在 Windows 內為『自動取得 IP』),則當用戶端開機或者是重新啟動網路卡時, 用戶端主機會發送出 DHCP 要求給所有物理網段內的電腦。此封包的目標 IP 會是 255.255.255.255, 所以一般主機接收到這個封包後會直接予以丟棄,但若區域網路內有 DHCP 伺服器時會如何回應?

  2. DHCP 主機回應訊息:
    DHCP 主機在接收到這個用戶端的需求後,針對這個用戶端的硬體位址 (MAC) 與本身的設定資料來進行下列工作:

    • 到伺服器的登錄檔中尋找該用戶之前是否曾經用過某個 IP ,若有且該 IP 目前無人使用,則提供此 IP 給用戶端;
    • 若設定檔針對該 MAC 提供額外的固定 IP (static IP) 時,則給予該 IP 的設定;
    • 若不符合上述兩個條件,則隨機取用目前沒有被使用的 IP 給用戶,並記錄下來。

    此外,DHCP 伺服器還會提供一個租約時間給用戶端,並等待用戶端的回應。

  3. 用戶端接受 DHCP 伺服器提供的參數並設定本身的網路環境:
    若一切安好,則用戶端會接受該次取得的 IP 並開始處理本身的網路環境,包括改寫 /etc/resolv.conf 等等; 並且會向 DHCP 伺服器發送一個確認封包,確認該參數已被接受。

  4. DHCP 伺服器記錄該次租約行為:
    用戶端回傳訊息以建立租約行為後,該次租約會被記錄到主機的登錄檔上頭, 並且開始租約計時喔!那麼該次租約何時會到期而被解約 (真可怕的字眼!) ?你可以這樣想:

    • 用戶端離線:不論是關閉網路介面 (ifdown)、重新開機 (reboot)、關機 (shutdown) 等行為,皆算是離線狀態,這個時候 Server 端就會將該 IP 回收,並放到 Server 自己的備用區中,等待未來的使用;

    • 用戶端租約到期:前面提到 DHCP server 端發放的 IP 有使用的期限,用戶端使用這個 IP 到達期限規定的時間,而且沒有重新提出 DHCP 的申請時,就需要將 IP 繳回去!這個時候就會造成斷線,而用戶也可以再向 DHCP 主機要求再次分配 IP 囉
以上就是 DHCP 這個協定在 Server 端與 Client 端的運作狀態,由上面這個運作狀態來看,我們可以曉得,只要 Server 端設定沒有問題,加上 Server 與 Client 在硬體連線上面確定是 OK 的,那麼 Client 就可以直接藉由 Server 來取得上網的網路參數,當然啦,只要我們這些管理員能夠好好的、正確的管理好我們的 DHCP ,嘿嘿!那麼上網的設定自然就變成一件很簡單的事情啦!


  • DHCP 伺服器給予用戶端的 IP 類型:
  • 在上面的步驟裡面,注意到第二步驟了嗎?就是伺服器會去比較用戶端的 MAC 硬體位址,並判斷該 MAC 是否需要給予一個固定的 IP 呢!所以啦,我們可以設定 DHCP 伺服器給予用戶端的 IP 類型主要有兩種:
    • 固定 (Static) IP:
      只要那個用戶端電腦的網路卡不換掉,那麼 MAC 肯定就不會改變,由於 DHCP 可以根據 MAC 來給予固定的 IP ,所以該電腦每次都能以一個固定的 IP 連上 Internet !呵呵! 這種情況比較適合當這部電腦需要用來做為提供區域內的一些網路服務的主機之用。那麼如何在 Linux 上面知道您的 MAC 呢?很簡單啦!有很多的方式,最簡單的方式就是使用 ifconfig 及 arp 來進行:
      1. 觀察自己的 MAC 可用 ifconfig:
      [root@linux ~]# ifconfig eth0
      eth0      Link encap:Ethernet  HWaddr 00:08:03:A3:E0:34
                inet addr:192.168.1.254  Bcast:192.168.1.255  Mask:255.255.255.0
                ....底下省略....
      
      2. 觀察別人的 MAC 可用 ping 配合 arp
      [root@linux ~]# ping -c 1 192.168.1.101
      [root@linux ~]# arp -n
      Address        HWtype  HWaddress          Flags Mask   Iface
      192.168.1.101  ether   00:08:75:A0:B2:78  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 只有 Public IP 與 Private IP 兩種,中文翻譯成『公共 IP』與『私有 IP』這兩個, 至於其他所謂的『靜態 IP』、『實體 IP』、『虛擬 IP』、『浮動式 IP』等等,都是藉由一些 IP 取得的方式來分類的, 關於 IP 的種類我們在網路基礎中談過了,記得再好好的釐清一下觀念喔! 事實上現在主流的 ADSL 寬頻撥接上網也有使用到『靜態 IP 』與『固定 IP 』之類的概念喔! 舉例來說好了,hinet/seed net 等主要 ISP 都有提供所謂的:『一個固定 IP 搭配 7~8 個浮動 IP 』的 ADSL 撥接功能,也就是說同樣透過一條電話線撥接到 ISP ,但是其中一個撥接是可以取得固定的 IP 呢! 而其他的則是非固定的 IP ,DHCP 的 static/dynamic 跟這個玩意兒有點類似啦! ^_^


  • 關於租約所造成的問題:
  • 怪了!如果我們觀察上面 DHCP 運作模式的第二個步驟,您會發現最後面 DHCP 伺服器還有給予還有一個租約期限! 幹嘛還要這樣的一個期限呢?其實設定期限還是有個優點啦!最大的優點就是可以避免 IP 被某些使用者一直佔用著,但該使用者卻是 Idle (發呆) 的狀態!

    舉個例子來說,我們剛剛不是說到,我有 150 個 IP ,但是偏偏我有 200 個用戶嗎?我們以 2006 年的世界盃足球賽來說明好了。假設每個使用者都急著上網知道世足賽的消息, 那麼某些熱門對戰時段網路將可能達到使用尖峰!也就是說,這 200 個人同時要來使用這 150 個 IP ,有可能嗎?當然不可能!肯定會有 50 個人無法連線,因為『很抱歉!目前系統正在忙線中,請您稍後再撥!』

    那怎麼辦?這個時候租約到期的方式就很有用處啦!那幾個已經連線進來很久的人, 就會因為租約到期而被迫離線,這個時候該 IP 就會被釋放出來,哈哈!大家趕快搶呀!先搶到先贏喔! 所以,那 50 個人 (包括被迫離線的那個朋友) 只好繼續的、努力的、加油的來進行 DHCP 的要求囉! ^_^""

    雖然說是優點,但是其實如果站在使用者的角度來看,還是可能會造成公憤的!憑什麼大家一起交錢, 我先連線進來就需要先被踢出去?∼呵呵!所以囉,如果要當 ISP ,還是得要先規劃好服務的方針才行呦! 這樣您可以瞭解租約到期的行為了嗎?! ^_^

    既然有租約時間,那麼是否代表我用 DHCP 取得的 IP 就得要『手動』的在某個時間點去重新取得新的 IP 呢?不需要的啦!因為目前的 DHCP 用戶端程式大多會主動的依據租約時間去重新申請 IP (renew) 的!也就是說在租約到期前你的 DHCP 用戶端程式就已經又重新申請更新租約時間了。所以除非 DHCP 主機掛點, 否則您所取得的 IP 應該是可以一直使用下去的!


  • 多部 DHCP 主機在同一物理網段的情況
  • 或許您曾經發現過一件事情,那就是當我的網域裡面有兩部以上的 DHCP 主機時, 到底哪一部主機會設定我的這部電腦所發出的 DHCP 要求?呵呵!很抱歉,俺也不曉得! 因為在網路上面,很多時候都是『先搶先贏』的, DHCP 的回應也是如此!當 Server1 先回應時,您使用的就是 Server1 所提供的網路參數內容,如果是 Server2 先回應,您就是使用 Server2 的參數來設定您的 PC !不過,前提之下當然是這些電腦的『物理連線』都是在一起的啊!


    何時需要架設 DHCP 伺服器
    既然 DHCP 的好處是『免用戶端設定』,而且對於行動裝置的上網方面非常的方便!那麼是否代表你就得要架設一部 DHCP 呢?那可不一定!接下來要告知大家的是幾個概念性的問題, 您倒不一定『必需』遵守底下的一些概念呢!反正,自己的網域自己『爽』就好啦!

  • 使用 DHCP 的幾個時機
  • 在某些情況之下,倒是強烈的建議架設 DHCP 主機的!什麼情況呢?例如:
    • 具有相當多行動裝置的場合:
      例如您的公司內部很多筆記型電腦 (筆電) 使用的場合!因為這種筆電本身就是移動性的裝置, 如果每到一個地方都要去問人家『喂!您這邊的網路參數是什麼?』還得要擔心是否會跟人家的 IP 相衝突等等的問題!這個時候,DHCP 可就是您的救星囉!

    • 區域內電腦數量相當的多時:
      另外一個情況就是您所負責的網域內電腦數量相當龐大時, 大到您沒有辦法一個一個的進行說明來設定他們自己的網路參數,這個時候為了省麻煩,還是架設 DHCP 來的方便吶!況且,維護一部您熟悉的 DHCP 主機,要比造訪幾十個不懂電腦的人要簡單的多哩!^_^
  • 不建議使用 DHCP 主機的時機
  • 雖然 DHCP 有很多好處,但是您有沒有發現一個步驟怪怪的呀!回頭看一下那個步驟一, 用戶端在開機的時候會主動的發送訊息給網域上的所有機器,這個時候,如果網域上就是沒有 DHCP 主機呢?很抱歉,那麼您的這部用戶端電腦,『仍然會持續的發送訊息!』 真正的時間與次數我不曉得會有多久,不過,肯定會超過 30 秒以上, 甚至可以達到一分鐘以上!哇!那麼這段時間您能幹嘛?呵呵!除了等、還是等! 所以囉,如果電腦數不多,還是使用手動的方式來設定一下就好了!方便嘛!
    • 在您網域內的電腦,有很多機器其實是做為主機的用途,很少 Client 需求,那麼似乎就沒有必要架設 DHCP ;
    • 更極端的情況是,像一般家裡,只有 3 ~ 4 部電腦,這個時候,架設 DHCP 只能拿來練練功力,事實上,並沒有多大的效益;
    • 當您管理的網域當中,大多網路卡都屬於老舊的型號,並不支援 DHCP 的協定時;
    • 很多使用者的資訊知識都很高,那麼也沒有需要架設 DHCP 啦。
    如前所述,上面的都是概念性的說法,事實上,一件事情的解決之道是有很多的方案的, 沒有所謂的『完全正確』的方案,只有『相對可行、並且符合經濟效益與功能』的方案! 所以囉,架設任何網站之前,請先多評估評估吶!


    DHCP 伺服器端的設定
    事實上,目前市面上的 IP 分享器已經便宜到爆了!而 IP 分享器本身就含有 DHCP 的功能, 所以如果你只是想要單純的使用 DHCP 在你的區域網路當中而已,那麼建議你直接購買一部 IP 分享器來使用即可, 因為至少他很省電。如果你還有其他考量的話,才來架設 DHCP 吧!底下我們以一個簡單的範例來架設 DHCP 先。


    所需套件與套件結構
    DHCP 的套件需求很簡單,就是只要伺服器端軟體即可。所需套件為:
    真的只要一個套件就好了,而且沒有什麼很重大的相依性問題呢!請拿出你的原版光碟用 rpm 來安裝, 或者直接用 yum 線上安裝也可以!檔案很小啦!至於整個套件的結構是這樣的:
    就跟你說很簡單吧!整個套件資料也不過才如此而已呢!


    主要設定檔 /etc/dhcpd.conf 的語法
    其實 DHCP 的設定很簡單啊,只要將 dhcpd.conf 設定好就可以啟動了。不過編輯這個檔案時你必須要留意的是:
    基本上,我們剛剛前面提過說, DHCP 的 IP 分配可分為給予動態 IP 與靜態 IP ,其中又需要瞭解的是,如果需要設定靜態 IP 的話,那麼就必須要知道要設定成靜態 IP 的那部電腦的硬體位址 (MAC) 才行,請使用 arp 及 ifconfig 來查知您的介面的 MAC 吧!此外,我們需要設定的項目大概有幾項:
    說再多也沒有什麼用啦!讓我們實際來玩一個案例吧!你就知道該如何處理了。


    一個區域網路的 DHCP 伺服器設定案例
    假設我的環境當中,Linux 伺服器除了 NAT 主機之外還得要負責其他伺服器,例如郵件伺服器的支援。 而在後端區域網路中則想要提供 DHCP 的服務。整個硬體配置的情況如同下圖所示:

    區域網路的實體連接情況
    圖一、區域網路的實體連接情況

    如上圖所示,假設我的 Linux 有兩塊介面,其中 eth0 對內而 eth1 對外,至於其他的網路參數設計為:
    則我的設定檔就會像底下這個樣子了:
    [root@linux ~]# vi /etc/dhcpd.conf
    # 1. 整體的環境設定
    #    當底下的 subnet 與 host 沒有設定時,以這裡的設定值為準喔!
    ddns-update-style               none;          <==不要更新 DDNS 的設定
    default-lease-time              259200;        <==預設租約為 3 天
    max-lease-time                  518400;        <==最大租約為 6 天
    option routers                  192.168.1.254; <==這就是預設路由
    option broadcast-address        192.168.1.255; <==這是廣播位址啊
    option domain-name-servers      168.95.1.1, 139.175.10.20;
    # 上面是 DNS 的 IP 設定,這個設定值會修改用戶端的 /etc/resolv.conf 檔案內容!
    # 此外,你可以設定多部 DNS 主機,不過必須要以逗號『 , 』分隔開才行。
    
    # 2. 關於動態分配的 IP
    #     Network_IP↓        Netmask_IP↓
    subnet 192.168.1.0 netmask 255.255.255.0 {
        range 192.168.1.21 192.168.1.100;      <==分配的 IP 範圍
        option subnet-mask   255.255.255.0; <==可重複設定 netmask 位址
        option nis-domain    "vbird.tsai";  <==額外給的 NIS 相關參數
        option domain-name   "vbird.tsai";  <==在 /etc/resolv.conf 給一個搜尋領域
    
        # 3. 關於靜態的 IP 啊!
        #    主機名稱↓
        host vbird-inside {
            hardware ethernet    00:40:95:30:43:B4; <==用戶端網卡 MAC
            fixed-address        192.168.1.5;       <==給予固定的 IP
        }
    }
    # 相關的設定參數意義,請查詢前一小節的介紹,或者 man dhcpd.conf
    
    夠簡單吧!這樣就設定好了!你可以複製上頭的資料然後修改一下,讓裡頭的 IP 參數符合你的環境, 就能夠設定好你的 DHCP 伺服器了。接下來理論上你就能夠啟動 dhcp 了。不過,在某些早期的 Linux distribution 上面, 當你的 Linux 主機具有多個介面時,你的一個設定可能會讓多個介面同時來監聽,那就可能會發生錯誤了。

    舉例來說,我們現在的設定是 192.168.1.0/24 這個在 eth0 上頭的網域,假設你還有一個介面 eth1 在 192.168.2.0/24 好了, 那萬一你的 DHCP 同時監聽兩塊介面的話,想一想,如果 192.168.2.0/24 網域的用戶端發送出 dhcp 封包的要求時, 他會取得什麼 IP ?所以囉,我們就得要針對 dhcpd 這個執行檔設定他監聽的介面, 而不是針對所有的介面都監聽啊!您說是吧!^_^!那如何處理呢?在 CentOS (Red Hat 系統) 可以這樣做:
    [root@linux ~]# vi /etc/sysconfig/dhcpd
    DHCPDARGS="eth0"
    
    這樣做就好了,這是因為啟動 dhcpd 的 script 會主動的呼叫這個參數檔案。如果是在其他版本的 Linux 當中, 你可以直接修改 /etc/init.d/dhcpd 這個 script 檔案內容,找到『 daemon /usr/sbin/dhcpd ... 』那一行, 並新增網路卡代號即可,例如:
    [root@linux ~]# vi /etc/init.d/dhcpd
    # 約在第 58 行左右會找到:
            daemon /usr/sbin/dhcpd ${DHCPDARGS} 2>/dev/null 
    
    在上述的特殊字體部分,你可以持續加入想要增加的監聽介面啦!更多的功能可以參考『 man dhcpd 』的解釋。 不過這個動作在較新的版本上面已經不需要了,因為新版本的 dhcp 會主動的分析伺服器的網段與實際的 dhcpd.conf 設定, 如果兩者無法吻合,就會有錯誤提示,人性化多了。 ^_^! 接下來我們可以開始啟動 dhcp 試看看囉!


    DHCP 伺服器的啟動與觀察
    開始來啟動 dhcp 吧!另外你要注意的是:dhcpd 使用的埠口是 port 67 ,並且啟動的結果會記錄在 /var/log/messages 檔案內,你最好能去觀察一下 /var/log/messages 所顯示的 dhcpd 相關資訊才好。
    1. 就啟動吧!
    [root@linux ~]# /etc/init.d/dhcpd start
    
    2. 看看埠口啟動的情況
    [root@linux ~]# netstat -tlunp
    Active Internet connections (only servers)
    Proto Recv-Q Send-Q Local Address Foreign Address PID/Program name
    udp        0      0 0.0.0.0:67    0.0.0.0:*       7294/dhcpd
    
    3. 看看登錄檔的輸出資訊
    [root@linux ~]# tail -n 30 /var/log/messages
    Dec 5 10:58 linux dhcpd: Internet Systems Consortium DHCP Server V3.0.1
    Dec 5 10:58 linux dhcpd: Copyright 2004 Internet Systems Consortium.
    Dec 5 10:58 linux dhcpd: All rights reserved.
    Dec 5 10:58 linux dhcpd: For info, please visit http://www.isc.org/sw/dhcp/
    Dec 5 10:58 linux dhcpd: Wrote 0 deleted host decls to leases file.
    Dec 5 10:58 linux dhcpd: Wrote 0 new dynamic host decls to leases file.
    Dec 5 10:58 linux dhcpd: Wrote 0 leases to leases file.
    Dec 5 10:58 linux dhcpd: Listening on LPF/eth0/00:40:fa:25:2a:db/192.168.1/24
    Dec 5 10:58 linux dhcpd: dhcpd startup succeeded
    
    看到這些就是成功的象徵啦!恭喜你啊!真是『福氣啦!』不過,萬一你看到的登錄檔是類似底下的模樣呢?
    Dec 5 11:11 linux dhcpd: /etc/dhcpd.conf line 10: semicolon expected.
    Dec 5 11:11 linux dhcpd: subnet
    Dec 5 11:11 linux dhcpd: ^
    Dec 5 11:11 linux dhcpd: Configuration file errors encountered -- exiting
    
    這表示應該是第 10 行左右有點問題,問題點應該是沒有分號 (semicolon) 而已。而分號應該是在指數符號 (^) 指的地方, 也就是 subnet 附近而已,很容易分辨吧!那如果是出現如下的模樣呢?
    ** You must add a ddns-update-style statement to /etc/dhcpd.conf.
       To get the same behaviour as in 3.0b2pl11 and previous
       versions, add a line that says "ddns-update-style ad-hoc;"
       Please read the dhcpd.conf manual page for more information. **
    
    這表示你忘記在 /etc/dhcpd.conf 裡面加入 ddns-update-style 的參數宣告啦! 瞧一瞧這個輸出資訊,就能夠曉得你的設定錯誤所在,根據錯誤來處理你的 dhcp 設定檔吧!


    內部主機的 IP 對應
    如果您有仔細的瞧過前幾章的網路基礎的話,那麼應該還會記得那個 /etc/hosts 會影響內部電腦的連線速度很大吧!那麼我現在使用 DHCP 之後,糟糕!我怎麼知道哪一部 PC 連上我的主機,那要怎麼填寫 /etc/hosts 的內容呢?這真是太簡單了!就將所有可能的電腦 IP 都加進去該檔案呀! ^_^ !以鳥哥為例,在這個例子中,鳥哥的分配的 IP 至少有 192.168.1.5, 192.168.1.21 ~ 192.168.1.100 ,所以 /etc/hosts 可以寫成:
    [root@linux ~]# vi /etc/hosts
    127.0.0.1   localhost.localdomain localhost
    192.168.1.254  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 用戶端的設定
    DHCP 的 Client 端,可以是 Windows 也可以是 Linux 呢!由於鳥哥的領域內剛好有兩部 Client 端的電腦,一部為 Linux (CentOS 4.4) 另一部為 Windows xp ,這裡就提一下,分別是怎樣設定的呢?


    Linux 用戶端
    Linux 的網路參數設定還記得吧?不記得的話就得要打屁股了!在連上 Internet 章節內我們談過自動取得 IP 的方式,設定真的很簡單:
    [root@client ~]# vi /etc/sysconfig/network-scripts/ifcfg-eth0
    DEVICE=eth0
    BOOTPROTO=dhcp  <==就是他!指定這一個就對了!
    ONBOOT=yes
    
    [root@client ~]# /etc/init.d/network restart
    
    改完之後,就將我們的整個網路重新啟動即可 (不要使用 ifdown 與 ifup ,因為還有預設路由要設定!) 。請注意,如果您是在遠端進行這個動作,您的連線『肯定會掛掉!』,因為網路卡被您關了嘛! 呵呵!所以請在本機前面才進行喔!如果執行的結果有找到正確的 DHCP 主機,那麼幾個檔案可能會被更動喔:
    1. DNS 的 IP 會被更動呢!查閱一下 resolv.conf 先:
    [root@linux ~]# cat /etc/resolv.conf
    ; generated by /sbin/dhclient-script
    search vbird.tsai          <==是否記得設定過 domain-name 呢?
    nameserver 168.95.1.1      <==這就是我們原本的設定值。
    nameserver 139.175.10.20
    
    2. 觀察一下路由啦!
    [root@linux ~]# route -n
    Kernel IP routing table
    Destination     Gateway        Genmask        Flags  Iface
    192.168.1.0     0.0.0.0        255.255.255.0  U      eth0
    169.254.0.0     0.0.0.0        255.255.0.0    U      eth0
    0.0.0.0         192.168.1.254  0.0.0.0        UG     eth0
    # 嗯!沒錯!路由也被正確的捉到了!OK的啦!
    
    3. 察看一下用戶端的指令吧!
    [root@linux ~]# netstat -tlunp
    Proto Recv-Q Send-Q Local Address  Foreign Address State  PID/Program name
    udp        0      0 0.0.0.0:68     0.0.0.0:*              3996/dhclient
    # 你沒看錯!確實是有個小程式在監測 DHCP 的連線狀態吶!
    
    4. 看一看用戶端租約所記載的資訊吧!
    [root@linux ~]# cat /var/lib/dhcp/dhclient-eth0.leases
    lease {
      interface "eth0";
      fixed-address 192.168.1.100;  <==這就是為啥我每次取得的 IP 是固定的。
      option subnet-mask 255.255.255.0;
      option routers 192.168.1.254;
      option dhcp-lease-time 259200;
      option dhcp-message-type 5;
      option domain-name-servers 168.95.1.1,139.175.10.20;
      option dhcp-server-identifier 192.168.1.254;
      option nis-domain "vbird.tsai";
      option broadcast-address 192.168.1.255;
      option domain-name "vbird.tsai";
      renew 3 2006/12/6 18:15:41;   <==下一次預計更新 (renew) 的時間點
      rebind 5 2006/12/8 05:26:26;
      expire 5 2006/12/8 14:26:26;
    }
    # 這個檔案會記錄該介面卡所曾經要求過的 DHCP 資訊喔!重要!
    # 有沒有看出來,他幾乎就與你設定的 /etc/dhcpd.conf 類似? ^_^
    
    5. 額外看一下 NIS 的領域名稱有沒有設定妥當啊?
    [root@linux ~]# nisdomainname
    vbird.tsai   <==因為我們有設定 nis-domain 的項目啊!
    
    有沒有發現其實你的用戶端取得的資料都被記載在 /var/lib/dhcp/dhclient-eth0.leases 裡頭啊? 如果你有多張網卡,那麼每張網卡自己的 DHCP 要求就會被寫入到不同檔名的檔案當中去! 觀察該檔案就知道你的資料是如何囉!這可也是挺重要的呦!


    Windows 用戶端
    在 Windows 底下設定 DHCP 協定以取得 IP 實在是很簡單喔!我們以目前最常用的 Windows XP 來說明的話, 你可以依據『開始』-->『設定』-->『控制台』-->『網路和網際網路連線』-->『網路連線』-->『區域連線』 來開始一步一步的進行下面的動作喔:
    1. 在點選了上面的區域網路後,你的桌面上應該會出現如下的圖示:

      區域網路的 DHCP 取得方式之設定
      圖二、區域網路的 DHCP 取得方式之設定

    2. 在上圖二的地方按下箭頭所指的『內容』處,就會出現如下畫面囉:

      區域網路的 DHCP 取得方式之設定
      圖三、區域網路的 DHCP 取得方式之設定

      在上面的畫面當中,建議你可以在箭頭所指的 1 處勾選那兩個項目,如此一來在桌面最底下的右側就會出現一個網路符號, 以後你就可以點選該圖示來進入這個畫面了!比較方便啦。然後在箭頭 2 的地方勾選 Internet Protocol (TCP/IP) 的項目, 並點選『內容』後,就可能進入到設定的畫面。

    3. 接下來如下圖所示,你只要勾選『自動取得 IP 位址』那個項目,然後按下『確定』並離開設定畫面, 如此一來 Windows 就會開始自動取得 IP 的工作了。

      區域網路的 DHCP 取得方式之設定
      圖四、區域網路的 DHCP 取得方式之設定

    4. 那你如何確認你的 IP 已經被順利的取得呢?如果是在早期的 Windows 95 ,你可以使用一個名為『 winipcfg 』 來觀察你的 IP 設定。不過在 windows 2000 以後,你可能需要使用命令提示字元來觀察才行。你可以使用: 『開始』-->『程式集』-->『附屬應用程式』-->『命令提示字元』來取出終端機,然後這樣處理看看:
      C:\Documents and Settings\dmtsai> ipconfig /all
      ....前面省略....
      Ethernet adapter 區域連線:
      
              Connection-specific DNS Suffix  . : vbird.tsai
              Physical Address. . . . . . . . . : 00-D0-18-AF-6E-81
              Dhcp Enabled. . . . . . . . . . . : Yes
              Autoconfiguration Enabled . . . . : Yes
              IP Address. . . . . . . . . . . . : 192.168.1.99
              Subnet Mask . . . . . . . . . . . : 255.255.255.0
              Default Gateway . . . . . . . . . : 192.168.1.254
              DHCP Server . . . . . . . . . . . : 192.168.1.254  <==這一部 DHCP 主機
              DNS Servers . . . . . . . . . . . : 168.95.1.1
                                                  139.175.10.20
              Lease Obtained. . . . . . . . . . : 2006年12月5日 下午 10:22:37
              Lease Expires . . . . . . . . . . : 2006年12月8日 下午 10:22:37
      
      C:\Documents and Settings\dmtsai> ipconfig /renew
      # 這樣可以立即要求更新 IP 資訊喔!
      
      這樣就 OK 的啦!簡單吧!

    伺服器端資料查閱

    檢查租約檔案
    用戶端會主動的紀錄租約資訊,那主機端更不能忘記記錄囉!主機端是記錄在這個地方:
    [root@linux ~]# cat /var/lib/dhcp/dhcpd.leases
    lease 192.168.1.99 {  <==就是那部 Windows 的紀錄
      starts 2 2006/12/05 14:23:37;
      ends 5 2006/12/08 14:23:37;
      binding state active;
      next binding state free;
      hardware ethernet 00-d0-18-af-6e-81;
      uid "\001\000\340\030\257n\003";
      client-hostname "vbird_work";
    }
    lease 192.168.1.100 { <==就是那部 Linux 的紀錄
      starts 2 2006/12/05 15:37:33;
      ends 5 2006/12/08 15:37:33;
      binding state active;
      next binding state free;
      hardware ethernet 00:30:20:1d:c3:6e;
    }
    
    從這個檔案裡面我們就知道有多少用戶端已經向我們申請了 DHCP 的 IP 使用了呢! 很容易瞭解吧!


    使用 ether-wake 實行遠端自動開機 (remote boot)
    既然已經知道用戶端的 MAC 位址了,如果用戶端的主機符合一些電源標準, 並且該用戶端主機所使用之網路卡暨主機板支援網路喚醒的功能時,我們就可以透過網路來讓用戶端電腦開機了。 如果你有一部主機想要讓他可以透過網路來啟動時,你必須要在這部用戶端電腦上進行:
    1. 首先你得要在 BIOS 裡面設定『網路喚醒』的功能,否則是沒有用的喔!
    2. 再來你必須要讓這部主機接上網路線,並且電源也是接通的。
    3. 將這部主機的 MAC 抄下來,然後關機等待網路喚醒。
    接下來請到永遠開著的主機 DHCP 主機上面 (其實只要任何一部 Linux 主機均可!) , 下載 ether-wake.c 這個檔案:
    然後開始編譯他:
    [root@linux ~]# gcc -O -Wall -o ether-wake ether-wake.c
    
    此時你的家目錄下應該會有一個名為 ehter-wake 的檔案,假設用戶端主機的 MAC 為 11:22:33:44:55:66 好了, 那麼你想要讓這部主機被喚醒,就這樣做吧:
    [root@linux ~]# ./ether-wake 11:22:33:44:55:66
    
    # 更多功能可以這樣查閱喔:
    [root@linux ~]# ./ether-wake -u
    
    然後你就會發現,哈哈!那部用戶端主機被啟動了!以後如果你要連到區域網路內的話, 只要能夠連上你的防火牆主機,然後透過這個 ether-wake 軟體,就能夠讓你區域網路內的主機啟動了, 控管上面就更加方便的啦!您說是吧! ^_^

    重點回顧

    課後練習

    參考資料

    2002/11/23:第一次完成
    2003/03/15:加入相關重點回顧、與練習題
    2003/09/10:修改版面去!
    2006/12/05:將舊的文章移動到此處
    2006/12/06:好累!怎麼老是在說累∼總之,完成囉∼新增加 ether-wake 的網路喚醒功能。