UbuntuTW Guide ch15

出自Ubuntu 正體中文 Wiki

跳轉到: 導航, 搜尋

目錄

DHCP 伺服器

DHCP (Dynamic Host Configuration Protocol) 是要讓使用者端自動取得網路組態設定的協定。當沒有使用這個協定時,網管需要每台電腦都給與網路 IP,光是規劃就很麻煩了,而且大部份的使用者連怎樣設定 IP 都不大清楚,最後還得要網管親自出馬。

因此透過 DHCP Server 來讓各個 DHCP Client 自動設定好網路是很有效率的事情,網管從此之後就不需要一台一台的設定網路了,它可以自動配發某個網段的 IP,也可以用 MAC Address 來指定某幾台電腦使用固定 IP。在公司或學校,以及家中使用 IP 分享器來自動取得 IP,都是使用 DHCP 這樣的技巧。

在架設前,您應該先確認您所屬的區網能不能讓您架設 DHCP Server。當原來區網上已經有 DHCP Server,若您再架上第二台,會導致 Client 端不知道要聽那台配發的 IP,會造成網路大亂喔!

DHCP 的運作理論

當 DHCP Client 要和 DHCP Server 取得 IP 時,DHCP Client 還沒有設定好網路,那怎樣和 DHCP Server 要 IP 呢?記不記得在『網路概論』的地方談過區域網路內可以透過廣播的方式,把封包丟到所有區網上的電腦呢?DHCP Client 就是利用這種方式來連接 DHCP Server 的。簡單的流程如下:

  1. 首先 DHCP Client 丟出一個 UDP 封包 (DHCP Discover),裡面來源 IP 和 Port 分別填 0.0.0.0、68,目地 IP 和 Port 分別填 255.255.255.255、67。然後把它放在網路層包裝,並在框架表頭填上自己的 MAC Address 後,送出去廣播。
  2. 此時整個區域網路的電腦都會收到這個封包,但是解開以後,會發現目地是 255.255.255.255,所以一般的電腦都會把這個封包丟棄。但是當 DHCP Server 收到後,會發現這是要給它的,於是它會把該封包撿起來。之後會比對來源的 MAC Address 是否在 DHCP Server 上有設定要給與固定 IP,若有的話,則依照 Server 上的設定值傳回設定值給 Client 端。若沒有的話,會選取可發放 IP 裡面還沒有人用的 IP 給 Client 端,這時候傳回 Client 端的封包稱為 DHCP Offer。注意唷,在區網內只要有 MAC Address 就可以傳送封包,不需要等到設定好 IP 組態。
  3. 當 Client 收到 Server 給它的設定後,會先用 ARP 檢查該 IP 是否已經有人使用,若已經有人使用,Client 就會發一個 DHCP Declient 的封包給 Server,告訴 Server 不會使用該 IP,再重新從步驟 1 開始要其他的 IP。若 Client 端測試為該 IP 沒有人用,會發一個 DHCP Request 給 Server 確認使用該網路設定。
  4. 最後 Server 收到 DHCP Request 後,Server 端會再發一個 DHCP Pack 封包,確認給與的 IP 租約生效,此時才完成整個 DHCP 協定的流程。

在步驟 2 的時候,Server 會給 Client 端一個合約時間,當使用超過了合約時間就需要重新續約,也就是再重新跑一次 DHCP 的流程。通常當 Server 端可以分配的 IP 很充足時,續約會優先給同樣的 IP,若當 Server 端的 IP 用完後,可能會無法續約,就需要排隊等候了。

DHCP 實際安裝

( 表 16-2-1 DHCP Server 重要的相關檔案 )

功能 設定檔
控制 DHCP 啟動或關閉的 script 檔 /etc/init.d/dhcp3-server
DHCP 設定檔 /etc/dhcp3/dhcpd.conf
DHCP Client 租約紀錄檔 /var/lib/dhcp3/dhcpd.leases

要安裝 DHCP Server 很簡單,只要輸入以下指令就好了。

安裝 DHCP Server:

 sudo apt-get install dhcp3-server

安裝完後,它會自動把 /etc/init.d/dhcp3-server soft link 到 rc2.d ~ rc5.d,也就是開機後在這些 runlevel 中都會自動啟動 DHCP 伺服器。並且會在安裝完後順便啟動,當然此時設定檔還沒有設好,所以啟動會失敗。因此設定好設定檔後,讀者需要再自己重新啟動。

重新啟動 DHCP Server:

 sudo /etc/init.d/dhcp3-server restart

啟動 DHCP Server:

 sudo /etc/init.d/dhcp3-server start

關閉 DHCP Server:

 sudo /etc/init.d/dhcp3-server stop

上面的指令也可以用 invoke-rc.d 取代,不過筆者還是習慣執行 init.d 裡面的控制 script。

重新啟動 DHCP Server:

 sudo invoke-rc.d dhcp3-server restart  # 後面參數可以是 stop,start

若要讓它開機時不要自動執行,只要刪除 rcX.d 裡面的 soft link,這在『深入瞭解 Ubuntu 系統』那章有提及。這裡提醒讀者所採用的是 update-rc.d 的方式。

設定為開機時不要自動啟動 DHCP Server:

 sudo update-rc.d  -f dhcp3-server remove

設定為開機時自動啟動 DHCP Server:

 sudo update-rc.d  -f dhcp3-server defaults

發放浮動式 IP

因為 Ubuntu 預設的設定檔很長,所以這裡我們把它備份後,自己從頭來寫設定檔會比較方便。

備份原來的 DHCP Server 設定檔:

 sudo mv /etc/dhcp3/dhcpd.conf /etc/dhcp3/dhcpd.conf.bak

開始寫新的 DHCP Server 設定檔吧:

 sudo gedit /etc/dhcp3/dhcpd.conf

設定檔 dhcpd.conf 範例:

# 這個設定是當用戶續約使用 IP 時,是否要重新確認新的 DNS Server 
# 給客戶使用,由於 DHCP v2 不支援,所以為了相容性原因建議設為 none!
ddns-update-style none;

# 預設的租約秒數 (這裡可以不要設,也可以直接設定在後面的區域變數裡)
default-lease-time 600;

# 最大的租約秒數  (這裡可以不要設,也可以直接設定在後面的區域變數裡)
max-lease-time 7200;

# 設定網域 domain,當客戶端收到後,會加到 resolv.conf 裡面
# 而實際功能請讀者參考網路設定那一節,因此這個設定是可有可無的!
# 也可以這裡不寫,寫在區域變數裡。
option domain-name "emook.org";

# 告訴客戶端可以使用的 DNS Server,客戶端收到後,
# 可以自動設好 DNS,這個設定也可以寫在區域變數
option domain-name-servers 168.95.192.1, 168.95.1.1;

# 和 dhcp log 檔有關,讀者只需要寫上去即可
log-facility local7;

# 設定該網段的識別代號 (NetID),值為該網段第一個 IP
# netmask 就依照網段大小設定即可
subnet 192.168.0.0 netmask 255.255.255.0 {

     # 設配發的 IP 範圍,可以有數個
     # 在這個例子,將配發 10 到 20 和 35 到 45 的 IP
     range 192.168.0.10 192.168.0.20;
     range 192.168.0.35 192.168.0.45;

     # 設定所使用的 gateway (router)
     option routers 192.168.0.1;

     # 廣播地址 (broadcast),這可以從 netmask 和 subnet
     # 網段算出,所以可有可無,此值為該網段最後一個 IP
     option broadcast-address 192.168.0.255;

     ### 若全域變數有設的話,設到這裡就可以工作了
     default-lease-time 600;
     max-lease-time 7200;
     option domain-name "emook.org";
     option domain-name-servers 168.95.192.1, 168.95.1.1;
     ### 當全域變數和區域變數都有設定時,以這裡的區域
     ### 變數優先使用
}

由於 DHCP Server 可能插很多塊網路卡,服務數個網段,所以有些設定值可以寫在區域變數內,不用做全域設定。Server 上的網卡應該要有DHCP Server 所服務的網段 IP,當 DHCP Server 啟動錯誤時,讀者可以檢查看看,在 ifconfig 網路卡裡面的 IP 設定是否有在該服務網段內,匹配不起來是不能啟動的。

所謂的預設租約時間是當 Client 在和 Server 要 IP 時,若 Client 沒有提出要求,就用這個時間當租約時間。當 Client 有提出比較長的時間要求,最大不能超過最大租約時間。

讀者設定好後,記得重新啟動 DHCP Server 服務,讀者可以透過以下指令看到 DHCP Server 真的在運作呢!

看看 DHCP Server 是否真的在服務:

dbtsai@ubuntu:~ $ sudo netstat -upln
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:*        21861/dhcpd3

讀者也可以透過租約紀錄檔,瞭解到有哪一些機器和 DHCP Server 要 IP。

租約紀錄檔:

dbtsai@ubuntu:~ $ more /var/lib/dhcp3/dhcpd.leases

lease 192.168.0.44 {
  starts 6 2006/08/19 14:36:59;
  ends 6 2006/08/19 14:46:59;
  tstp 6 2006/08/19 14:46:59;
  binding state free;
  hardware ethernet 00:11:24:29:3c:bd;
}

發放固定式 IP

若要對單一主機設定固定 IP 的話,其實也不難,我們先編輯設定檔吧! 編輯 DHCP Server 設定檔:

 sudo gedit /etc/dhcp3/dhcpd.conf

設定發放固定式 IP 比浮動式 IP 只有多幾個設定而已,相信對讀者不會太難。 設定檔 dhcpd.conf 範例:

ddns-update-style none;
default-lease-time 600;
max-lease-time 7200;
option domain-name-servers 168.95.192.1, 168.95.1.1;
log-facility local7;

subnet 192.168.0.0 netmask 255.255.255.0 {
          ‧‧‧(省略浮動 IP 設定)‧‧‧
     option routers 192.168.0.1;
}

# 設定 ubuntu 這台機器取得固定 IP,ubuntu 是可以自己取的名稱
host ubuntu{  
        # 設定該機器的網卡 MAC Address
        hardware ethernet 00:11:22:33:44:55;

        # 設定要給該機器的 IP Address             
        fixed-address 192.168.0.150;
}

如以上範例,當有一台 client 的 MAC Address 是 00:11:22:33:44:55 並且向 DHCP Server 取得 IP 時,Server 就會自動給它 192.168.0.150 這個固定 IP。讀者或許會覺得奇怪,裡面沒有 netmask,gatway 等設定,網路怎麼會通?其實在這些固定配發 IP 的設定前一定要先有 subnet 來宣告該網段 netmask、gateway和 NetID 等組態。

所以當您設定好配發固定 IP 後,若有錯誤,要檢查一下您配發的 IP 是否已經在 subnet 裡面有先宣告該網段。若只要配發固定 IP,不要浮動 IP,那麼 subnet 也要宣告,但裡面的 range 設定可以省略。

設定好後,重新啟動服務,就應該可以正常運作了唷!