2008年6月13日 星期五

DHCP Message

DHCP MESSAGE

轉貼來源


DHCP(Dynamic Host Configuration Protocol,動態主機配置協議)是IETF為實現IP的自動配置而設計的協議,它可以為客戶機自動分配IP位址、子網路遮罩以及缺省閘道、DNS伺服器的IP地址等TCP/IP參數。瞭解DHCP工作過程可以説明我們排除有關DHCP服務遇到的問題。DHCP 協議是基於UDP層之上的應用,本文結合抓報所得資料分析DHCP協議實現原理

一、先瞭解一下需要抓取的DHCP報文

客戶發出的IP租用請求報文
  DHCP客戶機初始化TCP/IP,通過UDP埠67向網路中發送一個DHCPDISCOVER廣播包,請求租用IP位址。該 廣播包中的源IP位址為0.0.0.0,目標IP位址為255.255.255.255;包中還包含客戶機的MAC位址和電腦名。

DHCP回應的IP租用提供報文
  任何接收到DHCPDISCOVER廣播包並且能夠提供IP地址的DHCP伺服器,都會通過UDP埠68給客戶機回應一個DHCPOFFER廣播包,提供一個IP位址。該廣播包的源IP地址為DCHP伺服器IP,目標IP位址為255.255.255.255;包中還包含提供的IP位址、子網路遮罩及租期等資訊。

客戶選擇IP租用報文
  客戶機從不止一台DHCP伺服器接收到提供之後,會選擇第一個收到的DHCPOFFER包,並向網路中廣播一個 DHCPREQUEST消息包,表明自己已經接受了一個DHCP伺服器提供的IP地址。該廣播包中包含所接受的IP位址和伺服器的IP地址。 所有其他的DHCP伺服器撤銷它們的提供以便將IP地址提供給下一次IP租用請求。

DHCP伺服器發出IP租用確認報文
  被客戶機選擇的DHCP伺服器在收到DHCPREQUEST廣播後,會廣播返回給客戶機一個DHCPACK消息包,表明已經接受客戶機的選擇,並將這一IP位址的合法租用以及其他的配置資訊都放入該廣播包發給客戶機。
客戶配置成功後發出的公告報文
  客戶機在收到DHCPACK包,會使用該廣播包中的資訊來配置自己的TCP/IP,則租用過程完成,客戶機可以在網路中通信。
至此一個客戶獲取IP的DHCP服務過程基本結束,不過客戶獲取的IP一般是用租期,到期前需要更新租期,這個過程是通過租用更新資料包來完成的。

客戶IP租用更新報文
(1)在當前租期已過去50%時,DHCP客戶機直接向為其提供IP地址的DHCP伺服器發送DHCPREQUEST消息包。如果客戶機接收到該伺服器回應的DHCPACK消息包,客戶機就根據包中所提供的新的租期以及其它已經更新的TCP/IP參數,更新自己的配置,IP租用更新完成。如果沒收到該伺服器的回復,則客戶機繼續使用現有的
IP地址,因為當前租期還有50%。
(2)如果在租期過去50%時未能成功更新,則客戶機將在當前租期過去87.5%時再次向為其提供IP地址的DHCP聯繫。如果聯繫不成功,則重新開始IP租用過程。
(3)如果DHCP客戶機重新啟動時,它將嘗試更新上次關機時擁有的IP租用。如果更新未能成功,客戶機將嘗試聯繫現有IP租用中列出的缺省閘道。如果聯繫成功且租用尚未到期,客戶機則認為自己仍然位於與它獲得現有IP租用時相同的子網上(沒有被移走)繼續使用現有IP位址。 如果未能與缺省閘道聯繫成功,客戶機則認為自己已經被移到不同的子網上,將會開始新一輪的IP租用過程。

  DHCP客戶機在發出IP租用請求的DHCPDISCOVER廣播包後,將花費1秒鐘的時間等待DHCP伺服器的回應,如果1秒鐘沒有伺服器的回應,它會將這一廣播包重新廣播四次(以2,4,8和16秒為間隔,加上1~1000毫秒之間隨機長度的時間)。四次之後,如果仍未能收到伺服器的回應,則運行Windows 2000的DHCP客戶機將從169.254.0.0/16這個自動保留的私有IP位址(APIPA)中選用一個IP位址,而運行其他操作系統的DHCP客戶機將無法獲得IP地址。DHCP客戶機仍然每隔5分鐘重新廣播一次,如果收到某個伺服器的回應,則繼續IP租用過程。


DHCP

DHCP

轉貼來源



11.1 DHCP概述
11.1.1 採用DHCP的必要性
在TCP/IP網路上,每台工作站要能存取網路上的資源之前,都必須進行基本的網路配置,一些主要參數諸如IP位址,子網路遮罩,缺省閘道,DNS等必不可少,還可能需要一些附加的資訊如IP管理策略之類。對於一個稍微大點的網路而言,網路的管理和維護的任務是相當繁重的。一台電腦從一個子網轉移到另一個子網,就要重新對系統進行配置。對於普通水準的工作站使用者是不能賦予他們配置自己的工作站網路的許可權,而且也沒有這個必要。如果一個沒有相應技術水準的用戶出於好奇或想學習一下的目的錯誤地更改了工作站的網路配置,造成網路故障,後果不言而喻。因此,需要有一種機制來讓TCP/IP的配置和管理從使用者端轉移到網路管理端,實現IP的集中式管理。解決方案就是用DHCP。

11.1.2 DHCP的主要功能
DHCP的全稱是動態主機設定通訊協定(Dynamic Host Configuration Protocol),由IETF(Internet 網路工程師任務小組)設計,詳盡的協定內容在RFC文檔rfc2131和rfc1541裡。目的就是為了減輕TCP/IP網路的規劃、管理和維護的負擔,解決IP位址空間缺乏問題。運行DHCP的伺服器把TCP/IP網路設置集中起來,動態處理工作站IP位址的配置,用DHCP租約和預置的IP地址相聯繫,DHCP租約提供了自動在TCP/IP網路上安全地分配和租用IP位址的機制,實現IP位址的集中式管理,基本上不需要網路管理人員的人為干預。而且,DHCP本身被設計成BOOTP(自舉協定)的擴展,支援需要網路配置資訊的無盤工作站,對需要固定IP的系統也提供了相應支援。

11.2 DHCP的工作原理
11.2.1 幾個DHCP名詞
在介紹DHCP工作原理以前,先解釋這幾個名詞的含義:

DHCP客戶:DHCP客戶是一通過DHCP來獲得網路配置參數的Internet主機,通常就是普通使用者的工作站。

DHCP伺服器:DHCP伺服器是提供網路設置參數給DHCP客戶的Internet主機。

DHCP/BOOTP 中繼代理:在DHCP客戶和伺服器之間轉發 DHCP 消息的主機或路由器。

DHCP是基於客戶機/伺服器模型設計的,DHCP客戶和DHCP伺服器之間通過收發DHCP消息進行通訊。

11.2.2 DHCP 消息的格式:
0 1 2 3
0123456789 0123456789 0123456789 0123456789

op (1) htype (1) hlen (1) hops (1)
xid (4)
secs (2) flags (2)
ciaddr (4)
yiaddr (4)
siaddr (4)
giaddr (4)
chaddr (16)
sname (64)
file ( 128)
options ( 312)




DHCP 消息的格式與BOOTP消息大部分相同, 這樣設計可以增強BOOTP伺服器工具,同時為BOOTP和DHCP兩種客戶服務。另外,BOOTP的中繼代理可用來轉發跨子網的DHCP請求。

各段描述如下

括弧裡的數字代表這個段以8位元組為單位的大小,除options外,其餘的段的長度都是固定的,options段的長度至少是312個8位組。

如op(1)代表這個段的長度為一個8位組

op 是消息操作代碼,值為1 代表BOOTREQUEST(自舉請求)值為2 代表BOOTREPLY(自舉回應)

在DHCP客戶和DHCP伺服器對話期間,op段被DHCP客戶設置為BOOTREQUEST(1), 被DHCP伺服器設置為 BOOTREPLY(2)。

htype 是硬體網址類別型

hlen 是硬體位址長度

hops DHCP客戶置這項為零,中繼代理要用

xid DHCP客戶在尋求時產生的一個亂數, 它提供了對所有後續的DHCP消息中的客戶請求和伺服器回應的一

種聯合。

ciaddr 客戶機用來請求一個特定的IP位址, 這個位址以前曾經分配給該客戶機,希望保留。

yiaddr 由DHCP伺服器填寫,包含它提供給某一DHCP客戶的IP位址。

siaddr 伺服器的主機位址

giaddr 中繼代理的IP位址

chaddr DHCP客戶硬體位址

sname 伺服器主機名稱

file 開機檔案名

options 選項


在獲得IP位址前,DHCP客戶用 htype, hlen 和 chaddr 段表明它的硬體位址, 這個值由
向客戶硬體位址作出回應的伺服器和中繼代理利用。 以前BOOTP協議中的兩個沒有用到的8位組
的flags段在DHCP消息裡有了定義。這個段的高位比特用於表明客戶機能不能在IP位址沒有被配置前接
收Unicast 回應, 剩下的低位比特保留且必須置為零。 hops 和 secs 段在初始化過程中被中繼代理
有選擇地利用。 sname 和 file 域可以被BOOTP或無盤站利用。

關於 options 選項

選項附加在DHCP消息的固定長度段之後, 為了與BOOTP工具相容, 選項段的前四個8位組包含了
RFC1497中定義的magic cookies,餘下的段就都是DHCP 選項。在RFC1533裡定義了DHCP的所有的選項
的格式。大多數選項用於標誌網路傳輸設置值, 例如子網路遮罩 (mask)、 DNS 服 務 器 地 址 等其
他選項被DHCP協定利用, 且在大多數消息中是必需的。

DHCP 選項的編碼格式如下:

Code Length value

26 2 m1 m2




選項可以固定長度或可變長度,所有的選項都以一個8位元組標識碼開始,這個標識碼用來標識選項。不帶資料的固定長度選項就只由一個標識碼構成。而且只有選項0和255是固定長度,其它的選項都可變長度的,為了標明選項資料的長度,在標識碼後面是一個長度8位組,這個長度8位組的值不包含標識碼和長度碼本身。

例如,DHCP選項裡的子網路遮罩選項如下定義

Code Length Subnet Mask

1 4 m1 m2 m3 m4



標識碼是1,長度是4個8位組,隨後的4個8位組就是子網路遮罩


DHCP消息類型選項的標識碼是53,長度是1個8位組,值是從1到7,分別代表不同的DHCP消息類型。


Code Length Type

53 1 1-7




值 消息類型
1 DHCPDISCOVER
2 DHCPOFFER
3 DHCPREQUEST
4 DHCPDECLINE
5 DHCPACK
6 DHCPNAK
7 DHCPRELEASE




最後一項選項是零長度的End(選項 255), 表明這是選項的結束以便DHCP客戶處理。 採用選項編碼的好處是不論選項有多長,DHCP客戶都可以正確接收,即使是它不認識的選項(不見得所有的DHCP客戶程式都完全遵循RFC標準)。

不論是DHCP客戶還是DHCP伺服器,都是通過按DHCP消息格式要求來填寫各個段形成具體的DHCP消息,
DHCP用的傳輸協議的非連線導向的UDP(使用者資料包通訊協定),從DHCP客戶發出的DHCP消息送往DHCP服務
器的埠67,DHCP伺服器發給客戶的DHCP消息送往DHCP客戶的埠68,由於在取得伺服器賦予的IP之前,
DHCP客戶並沒有自己的IP,所以包含DHCP消息的UDP資料包的IP頭的源地址段是0.0.0.0,目的地址則是
255.255.255.255。

11.2.3 DHCP分配IP地址的過程:
DHCP客戶機初始化TCP/IP,在本地物理子網上廣播一個 DHCPDISCOVER 消息, 以確定DHCP伺服器位
置及其IP地址。如果DHCP伺服器和客戶不在同一個物理子網上,BOOTP中繼代理將轉發這個消息給DHCP伺服器。由於網路上可能不止一個DHCP伺服器,凡所有具有有效IP位址資訊的DHCP伺服器向客戶機發出一個提議。客戶機從接收到的第一個提議中選定IP位址資訊,並廣播一條租用位址的消息請求。由發出該提議的DHCP伺服器回應該消息,指定IP位址資訊給該客戶機並發送一個確認,而所有其它DHCP伺服器撤回各自的提議。客戶機完成TCP/IP協議的初始化和綁定。配置完成後,客戶機就可以使用普通網路通信和連接至其它IP主機時用到的所有IP服務和應用。

11.4 基本應用

從目前情況看,大多數Linux DHCP伺服器是為Windows95/98客戶平臺提供服務。

11.4.1 增加主機路由

為了使DHCP伺服器能為正確MS的DHCP客戶機器服務,需要創建一個到位址255.255.255.255
的路由,把這條路由命令加到/etc/rc.d/rc.local,使得每次機器啟動後自動運行。

#route add -host 255.255.255.255 dev eth0

在一些老Linux核心的系統裡可能會報告錯誤消息:

255.255.255.255: Unkown host

可以試著加下面的條目到/etc/hosts檔裡

255.255.255.255 dhcphost

再用下麵的命令

#route add -host dhcphost dev eth0

11.4.2 修改設定檔
DHCPd默認的設定檔是/etc/dhcpd.conf,這是一個文字檔,DHCPd裡有一個語法分析器,能對這個檔進行語法分析,獲得配置參數。dhcpd.conf 格式是遞迴下降的,關鍵字大小寫敏感,可以有注釋,注釋以#開頭,一直到該行結束。這裡給出一個簡單的dhcpd.conf的例子,所服務的網路為C類保留網路 192.168.1.0

#examples

# 缺省租約時間

default-lease-time 28800;

# 最大租約時間

max-lease-time 43200;

# 子網路遮罩選項

option subnet-mask 255.255.255.0;

# 廣播地址

option broadcast-address 192.168.1.255;

# 路由器地址

option routers 192.168.1.1;

# DNS地址

option domain-name-servers 192.168.1.1;

# 功能變數名稱

option domain-name \"netreslab.org\";

# 以上都是全域參數

# 子網聲明和遮罩

subnet 192.168.1.0 netmask 255.255.255.0 {

# 範圍
range 192.168.1.10 192.168.1.100;

# 範圍

range 192.168.1.150 192.168.1.200;

}

這段設定檔將允許DHCP伺服器分配兩段位址範圍給DHCP客戶,192.168.1.10-100 和192.168.1.150-200
如果DHCP客戶在申請租約時不請求一個特定租約失效時間,則以default-lease-time(28800秒)為租約時間,如果有請求一個特定的租約失效時間,則採用max-lease-time(432000秒)

伺服器發送下麵的參數給DHCP客戶機:

子網路遮罩是255.255.255.0 ,廣播地址是192.168.1.255,預設閘道器是192.168.1.1,DNS是192.168.1.1。

如果要為一台叫做hotdog的機器指定固定的IP位址,可以在dhcpd.conf文件加一條

host hotdog {

# hotdog上網卡的硬體位址
hardware ethernet 08:00:00:4c:58:23;
#固定IP
fixed-address 192.168.1.210;
}

11.4.3 dhcpd.leases

dhcpd.leases 是DHCP客戶租約的資料庫檔,預設目錄在/var/state/dhcp/,檔包含租約聲明,每次一個租約被獲取、更新或釋放,它的新值就被記錄到檔的的末尾。在DHCPd第一次安裝後,並不會生成這個檔。但DHCPd的運行需要這個檔,所以可以建立一個空的檔。

# touch /var/state/dhcp/dhcpd.leases

DHCPd記錄這個檔的格式是

lease ip-address { statements... }

每個記錄包含一個提供給客戶的IP位址,在花括弧裡的語句包含一些租約資訊。具體的租約資訊因客戶發出不同的DHCP請求而稍有差別。


11.4.4 運行DHCPd

要啟動DHCPd, 簡單地鍵入 /usr/sbin/dhcpd 或用ntsysv 把DHCPd服務自動啟動,也可以用

/etc/rc.d/init.d/dhcpd start,

這樣啟動後,DHCPd是啟動在eth0 上,如果DHCPd上的伺服器還有另外一塊網卡eth1, 想在eth1上啟動

dhcpd,就鍵入

#/usr/sbin/dhcpd eth1

以上述例子的dhcpd.conf來啟動dhcpd,如果我們啟動一Windows95機器,Windows95的網路配置的TCP/IP選項裡指定自動獲得IP位址,也就是啟用Windows95裡的DHCP客戶程式,這台95機器的主機名稱叫ONE,進入系統後,用winipcfg查看,如下圖:




在Windows95機器獲得租約後,DHCPd會在dhcp.leases裡建一條記錄

lease 192.168.1.154 {

starts 1 2000/05/15 13:36:42;
ends 1 2000/05/15 21:36:42;
hardware ethernet 00:00:21:4e:3f:58;
uid 01:00:00:21:4e:3f:58;
client-hostname \"one\";

}

要注意的是dhcpd.leases的時間記錄採用GMT時間,而不是本地時區的時間。 要查看本機的GMT時間可以用

date -u


11.5 進一步說明dhcpd.conf
11.5.1 dhcpd.conf 概述

前面說過,dhcpd.conf是個遞迴下降格式的設定檔,有點象C的來源程式風格,由參數和聲明兩大類語句構

成,參數類語句主要告訴DHCPd網路參數, 如租約的時間、閘道、DNS等,而聲明語句則是描述網路的拓撲,

用來表明網路上的客戶、要提供給客戶的IP位址、提供一個參數組給一組聲明等。

描述網路拓撲的聲明語句有 shared-network 和 subnet 聲明。.如果要給一個子網裡的客戶動態指定IP地

址,那麼在subnet聲明裡必須有一個 range 聲明,說明位址範圍。如果要給DHCP客戶靜態指定IP位址,那麼

每個這樣客戶都要有一個host 聲明。 對於每個要提供服務的與DHCP伺服器連接的子網,都要有一個 subnet

聲明,即使這是個沒有IP位址要動態分配的子網。

一個典型的dhcpd.conf如下

#example
#全域參數

shared-network 共用網路名 {

共用網路特定參數...

subnet 204.254.239.0 netmask 255.255.255.224 {

子網特定參數...

range 204.254.239.10 204.254.239.30;
}
subnet 204.254.239.32 netmask 255.255.255.224 {

子網特定參數...
range 204.254.239.42 204.254.239.62;
}
}

subnet 204.254.239.64 netmask 255.255.255.224 {

子網特定參數...

range 204.254.239.74 204.254.239.94;
}

group {

組特定參數...

host ws1.domain {
特定主機參數...
}
host ws2.domain {
特定主機參數...
}
host ws3.domain {
特定主機參數...
}
}





11.5.2 語句參考


因為DHCPd的語句很多,不可能一一列出,這裡給出最常用和最重要的語句。


11.5.1.1 聲明類語句


share-network 語句

shared-network name {

[ 參數 ]

[ 聲明 ]
}

share-network 用於告訴DHCP伺服器某些IP子網其實是共用同一個物理網路。任何一個在共用物理網路裡的

子網都必須聲明在 share-network 語句裡。當屬於其子網裡的客戶啟動時,將獲得在share-network語句裡

指定參數,除非這些參數被subnet 或 host 裡的參數覆蓋。用share-network是一種權宜之計,例如某公司

用B類網路145.252,公司裡的部門 A 被劃在子網 145.252.1.0 裡, 子網路遮罩為255.255.255.0,這裡子網

號為8個bit,主機號也為8個bit,但如果部門 A 急速增長,超過了254個節點,而物理網路還來不及增加,

就要在原來這個物理網路上跑兩個8bit遮罩的子網,而這兩個子網其實是在同一個物理網路上,

share-network 語句可以如下


shared-network share1 {

subnet 145.252.1.0 netmask 255.255.255.0 {
range 145.252.1.10 145.252.1.253;
}

subnet 145.252.2.0 netmask 255.255.255.0 {
range 145.252.2.10 145.252.1.253;
}


這裡的share1是個共用網路名。

subnet 語句:

subnet subnet-number netmask netmask {

[ 參數 ]

[ 聲明 ]
}

subnet 語句用於提供足夠的資訊來闡明一個IP位址是否屬於該子網。也可以提供指定的子網參數和指明那些

屬於該子網的IP位址可以動態分配給客戶,這些IP位址必須在 range 聲明裡指定。subnet-number 可以是個IP位址或

能被解析到這個子網的子網號的功能變數名稱。netmask 可以是個IP位址或能被解析到這個子網的遮罩的功能變數名稱。


range 語句:


range [ dynamic-bootp ] low-address [ high-address];

對於任何一個有動態分配IP位址的subnet語句裡,至少要有一個 range 語句,用來指明要分配的IP位址的範

圍。如果只指定一個要分配的IP位址,高位址部分可以省略。


host 語句:

host hostname {
[ 參數 ]

[ 聲明 ]
}

host語句的作用是為特定的客戶機提供網路資訊。



group 語句

group {
[ 參數 ]

[ 聲明 ]
}

組語句給一組聲明提供參數。


allow 和 deny 語句


allow和deny語句用來控制DHCPd對客戶的請求。

unknown-clients 關鍵字

allow unknown-clients;
deny unknown-clients;

allow unknown-clients 允許DHCPd可以動態分配IP給未知的客戶,而 deny unknown-clients 則不允許。

缺省是允許的。

bootp 關鍵字

allow bootp;
deny bootp;

指明DHCPd是否回應bootp查詢,默認是允許的。


11.5.1.2 參數類語句:

default-lease-time 語句

語法

default-lease-time time;


指定缺省租約時間,這裡的time是以秒為單位的。如果DHCP客戶在請求一個租約但沒有指定租約的失效時間,租約時間就是缺省租約時間。


max-lease-time 語句

語法

max-lease-time time;


最大的租約時間。如果DHCP在請求租約時間時有發出特定的租約失效時間的請求,則用最大租約時間。

hardware 語句

語法

hardware hardware-type hardware-address;

指明物理硬體介面類別型和硬體位址。硬體位址由6個8位組構成,每個8位組以“:”隔開。如00:00:E8:1B:54:97

例如:hard

server-name 語句

server-name \"name\";


用於告訴客戶伺服器的名字。


fixed-address 語句


fixed-address address [, address ... ];

fixed-address 語句用於指定一個或多個IP位址給一個DHCP客戶。只能出現在host聲明裡。



11.5.1.3 選項類語句

選項類語句以option 開頭,後面跟一個選項名,選項名後是選項資料,選項非常的多,這裡列出一些常用的

選項供參考

option routers ip-address[, ip-address];

指明在客戶子網內的路由器的位址,可以有多個;

option time-servers ip-address[, ip-address...];

指明時間伺服器的地址。

option domain-name-servers ip-address[, ip-address...];

指明DNS的地址

option host-anme string;

給客戶指定主機名稱,string是個字串。

option domain-name string;

指明功能變數名稱

option interface-mtu mtu;

指明網路介面的MTU,這裡mtu是個正整數

例 option interface-mtu 1500;

option broadcast-address ip-address;

指定廣播地址

11.6總結

以上就是DHCPd常用配置,實際應用DHCP還要考慮IP分配的一些策略問題,同時要保證網路的健壯性,必須至少要有兩台DHCP伺服器一起工作,如果一台出了故障,另一台可以繼續為DHCP客戶服務。然而目前DHCP協議裡並沒有能讓兩台DHCP伺服器協同工作的機制,不能保證分配的位址的唯一性,所以這兩台DHCP伺服器裡的可分配位址空間必須進行調整,不能有交叉重複的IP位址。

搜尋此網誌