DHCP協議格式、DHCP服務搭建、DHCP協商互動過程入門學習

Andrew.Hann發表於2014-05-03

相關學習資料

http://www.rfc-editor.org/rfc/rfc2131.txt
http://baike.baidu.com/view/7992.htm?fromtitle=DHCP協議&fromid=1989741&type=syn
http://blog.chinaunix.net/uid-20530497-id-2203830.html
http://www.datacentersky.com/dhcp-message-format.html
http://www.datacentersky.com/dhcp-state-machine.html
http://blog.csdn.net/baidu20008/article/details/9952601

 

目錄

1. DHCP簡介
2. DHCP協議資料包格式
3. DHCP伺服器搭建
4. DHCP協商互動過程

 

1. DHCP簡介

DHCP是DynamicHostConfigurationProtocol之縮寫﹐它的前身是BOOTP。DHCP可以說是BOOTP的增強版本﹐它分為兩個部份(C/S架構): 一個是伺服器端,而另一個是客戶端。所有的IP網路設定資料都由DHCP伺服器集中管理﹐並負責處理客戶端的DHCP要求﹔而客戶端則會使用從伺服器分配下來的IP環境資料。比較起BOOTP,DHCP透過"租約"的概念,有效且動態的分配客戶端的TCP/IP設定,而且,作為相容考量,DHCP也完全照顧了BOOTPClient的需求。

DHCP支援三種型別的地址分配:

1. 自動分配方式:
DHCP給主機指定一個永久的IP地址,一旦DHCP客戶端第一次成功的從DHCP伺服器端租用到IP位址之後﹐就永遠使用這個位址
2. 動態分配方式:
DHCP給主機指定一個有"時間限制(租約)"的IP地址,到時間(租約到期)或主機明確表示放棄這個地址(主機主動斷開連線)時,這個地址可以被其他的主機使用,當然,客戶端可以比其它主機更優先的延續(renew)租約,或是租用其它的IP位址
3. 手工分配方式:
主機的IP地址是由網路管理員指定的,它可以按照MAC地址來固定的分配IP位址﹐DHCP只是把指定的IP地址告訴主機,相當於將某個MAC和IP進行了靜態繫結

除了分配IP之外﹐DHCP還可以幫客戶端指定IP環境:

1. router(預設閘道器)
2. netmask(預設子網掩碼)
3. DNSServer(DNS伺服器IP)
4. WINSServer﹑等等專案

您在客戶端上面,除了將DHCP選項打勾之外,幾乎無需做任何的IP環境設定

DHCP有3個埠,其中:

1. UDP67: DHCP Server服務埠
2. UDP68: DHCP Client服務埠
3. UDP546: 用於DHCPv6 Client,而不用於DHCPv4,是為DHCP failover服務,這是需要特別開啟的服務,DHCP failover是用來做"雙機熱備"

DHCP協議主機配置的優缺點

1. DHCP協議主機配置方式最重要的特徵就是整個配置過程自動實現,而且所有配置資訊在一個地方集中控制,這就是DHCP SERVER的作用。
2. 最初的BOOTP/DHCP協議是在同一個物理子網中使用廣播方式實現的,無法穿越路由器擴充套件到不同的物理子網中,也就是要使用DHCP協議的每一個網路(廣播域)中必須配置一臺DHCP伺服器,為了克服這一缺陷,採用了DHCP RELAY(DHCP中繼伺服器)的方式使得BOOTP/DHCP協議能夠穿越路由器實現。
3. DHCP協議一般採用終端的硬體地址(如果是乙太網,就是我們常說的MAC地址)來唯一標識一個終端裝置。
4. DHCP協議通過設定IP地址使用租期,可以達到IP地址的分時複用效果,解決IP地址資源短缺的問題。
5. DHCP協議基本上是一個單向驅動協議,SERVER完全是被動的,其動作、行為基本完全由CLIENT的請求行為而激發,即SERVER端無法主動控制CLIENT端。因此其互動性和安全性就沒有PPP協議那麼完善,這是DHCP協議的一個安全風險點

 

 

2. DHCP協議資料包格式

0x1: DHCP協議的封裝

學習DHCP協議不能單純學習協議本身,還必須連帶了解它的封包結構,之所以這麼說,是因為DHCP是一個特殊的"服務發現"型別的協議,它用於客戶端"獲取某種資源",所以它的封包格式具有一定的特殊性

鏈路層頭

IP頭

UDP頭

DHCP報文

 

 

其中:

1. 鏈路層頭: 承載報文的鏈路層資訊頭,常見的有Ethernet_II格式、802.1Q格式、 IEEE802.3格式、令牌環鏈路層頭格式等。
2. IP頭: 標準的IP協議頭,IPV4中長度為20bytes,包括了SrcIp,DstIp等資訊。
3. UDP頭: 8bytes,包括了SrcPort,DstPort,報文長度及UDP校驗和等資訊。
4. DHCP報文:具體的DHCP報文內容。

由於DHCP協議是初始化協議,更簡單的說,就是讓終端獲取IP地址的協議,既然終端連IP地址都沒有,何以能夠發出IP報文呢?SERVER給CLIENT回送的報文該怎麼封裝呢?帶著這些疑問,繼續學習
為了解決這個問題,DHCP報文的封裝採取瞭如下措施:

1. 首先鏈路層的封裝必須是廣播形式,即讓在同一物理子網中的所有主機都能夠收到這個報文 
2. 由於終端目前沒有IP地址,IP頭中的SrcIp規定填為全0。
3、當終端發出DHCP請求報文,它並不知道DHCP SERVER的IP地址,因此IP頭中的DstIp填為有限的子網廣播IP——全1(廣播),以保證DHCP SERVER的IP協議棧不丟棄這個報文
4. 上面的措施保證了DHCP SERVER能夠收到終端的請求報文,但僅憑鏈路層和IP層資訊,DHCP SERVER無法區分出DHCP報文,因此終端發出的DHCP請求報文的UDP層中的SrcPort 為68,DstPort為67。即DHCP SERVER通過知名埠號67來判斷一個報文是否是DHCP報文
5. DHCP SERVER給終端的響應報文將會根據DHCP報文中的內容決定是廣播還是單播,一般都是廣播形式:
    5.1 廣播封裝時:
        5.1.1 鏈路層的封裝必須是廣播形式 
        5.1.2 IP頭中的DstIp填為有限的子網廣播IP——全1(廣播)
    5.2 單播封裝時
        5.2.1 鏈路層的封裝是單播形式(因為客戶端在傳送DHCP資料包的時候在鏈路層幀頭填寫了sourceMAC)
    5.2.2 IP頭中的DstIp填為有限的子網廣播IP(全1)、或者是即將分配給使用者的IP地址(當終端能夠接收這樣的IP報文時)

兩種封裝方式中的UDP層都是相同的,SrcPort 為67,DstPort為68。終端通過知名埠號68來判斷一個報文是否是DHCP SERVER的響應報文

0x2: DHCP協議本身的報文格式

接下來繼續學習在DHCP互動過程中,DHCP資料包本身的報文格式

1. OP: 
    1.1) client傳送給server的封包,設為1
    1.2) server傳送給client的封包,設為2
2. HTYPE: 硬體類別
    2.1) 1表示10Mb/s的乙太網(Ethernet)的硬體地址
3. HLEN: 硬體地址長度、
    3.1) Ethernet為6(位元組)
4. HOPS: 跳數,若封包需經過router傳送,每站加 1,若在同一網內,為0(客戶端的初始設定為0)
5. XID: TRANSACTION ID(事務ID),DHCP REQUEST 時產生的數值,伺服器和客戶端用來在它們之間交流請求和響應,客戶端用它對請求和應答進行匹配。該ID由客戶端設定並由伺服器返回,為32位整數。以作 DHCPREPLY 時的依據
5. SECONDS: 由客戶端填充,表示從客戶端開始獲得IP地址或IP地址續借後所使用了的秒數
6. FLAGS:
從0到15共16 bits
    6.1) 最左1Bit為1時表示 server將以廣播方式傳送封包給client
    6.2) 最左1Bit為0時表示 server將以單播方式傳送封包給client
其餘尚未使用。
7. ciaddr:
客戶端的IP地址。只有客戶端是Bound、Renew、Rebinding狀態,並且能響應ARP請求時,才能被填充。即要是 client 端想繼續使用之前取得的IP地址,則這個欄位會被填充
8. yiaddr: 從server送回client的DHCP OFFER與DHCPACK封包中,此欄填寫分配給client的IP地址。
9. siaddr:
表明DHCP協議流程的下一個階段要使用的伺服器的IP地址。
10. giaddr:若需跨網域進行DHCP獲取,此欄為 relay agent的地址,否則為0
11. chaddr:
客戶端硬體地址。客戶端必須設定它的"chaddr"欄位。UDP資料包中的乙太網幀首部也有該欄位,但通常通過檢視UDP資料包來確定乙太網幀首部中的該欄位獲取該值比較困難或者說不可能,而在UDP協議承載的DHCP報文中設定該欄位,使用者程式就可以很容易地獲取該值。
12. sname:
Server的名稱字串,由DHCP伺服器填寫,以0x00結尾。
13. file:
啟動檔名,是一個空結尾的字串。DHCP Discover報文中是"generic"名字或空字元,DHCP Offer報文中提供有效的目錄路徑全名。
14. options:
允許廠商定議選項(Vendor-Specific Area),以提供更多的設定資訊。
格式為CODE(佔1位元組)+LEN(佔1位元組)+VALUE(長度由LEN而定) 
    1) 14、Subnet Mask
    2) 3、n*4、Router(閘道器)
    3) 6、n*4、DNS Server
    4) 7、n*4、Log Server
    5) 262、Interface MTU
    6) 33、n*8、Static route
    7) 354、ARP cache timeout
    8) 42、n*4、NTP servers
    9) 514、IP address lease time    
    10) 531、Message type            
        10.1) 1: DHCPDISCOVER
        10.2) 2: DHCPOFFER 
        10.3) 3: DHCPREQUEST
        10.4) 4: DHCPDECLINE 
        10.5) 5: DHCPACK 
        10.6) 6: DHCPNAK 
        10.7) 7: DHCPRELEASE 
        10.8) 8: DHCPINFORM
    11) 54、DHCP Server Identifier
    12) 60、n、華為自定義: 可配置該終端裝置在發起DHCP請求時,通過Option 60攜帶域資訊。ME60收到DHCP報文時,可根據Option 60中攜帶的域資訊來分配IP地址。
    13) 82、n、華為自定義:ME60作為DHCP Relay,在中繼使用者DHCP報文時,可在Option 82中填寫使用者的物理位置資訊,通知DHCP伺服器按物理位置資訊對為使用者分配IP地址

從資料包格式的學習中我們可以看到,DHCP伺服器除了進行IP分配之外,還會負責給客戶端傳送DNS伺服器IP、預設閘道器IP、預設子網掩碼之類的資訊

0x3: DHCP報文型別

DHCP共有八種報文,不同報文之間的區別除了DHCP資料包本身之外,在封包上(UDP頭,IP頭、鏈路層頭)也有一些差別

1. DHCP Discover
DHCP客戶端請求地址時,並不知道DHCP伺服器的位置,因此DHCP客戶端會在本地網路內以廣播方式傳送請求報文,這個報文成為Discover報文,目的是發現網路中的DHCP伺服器,所有收到Discover報文的DHCP伺服器都會傳送回應報文,DHCP客戶端據此可以知道網路中存在的DHCP伺服器的位置。
2. DHCP Offer
DHCP伺服器收到Discover報文後,就會在所配置的地址池中查詢一個合適的IP地址,加上相應的租約期限和其他配置資訊(如閘道器、DNS伺服器等),構造一個Offer報文,傳送給使用者(可以廣播、也可以單播),告知使用者本伺服器可以為其提供IP地址。(注意,只是告訴client可以提供,是預分配,還需要client通過ARP檢測該IP是否重複)
3. DHCP Request
客戶端會在兩種情況下傳送DHCP Request
    1) DHCP客戶端可能會收到來自DHCP伺服器的很多Offer,所以必須在這些迴應中選擇一個。Client通常選擇第一個迴應Offer報文的伺服器作為自己的目標伺服器,並回應一個廣播Request報文,通告選擇的伺服器。注意,"Client通常選擇第一個迴應Offer報文的伺服器作為自己的目標伺服器"這裡存在一個安全問題,如果我們的偽DHCP伺服器能比原始DHCP伺服器先傳送Offer資料包,就能達到欺騙的目的,從而劫持目標使用者的流量
    2) 獲取DHCP客戶端成功獲取IP地址後,在地址使用租期過去1/2時,會向DHCP伺服器傳送單播Request報文續延租期,如果沒有收到DHCP ACK報文,在租期過去3/4時,傳送廣播Request報文續延租期。
4. DHCP ACK
DHCP伺服器收到Request報文後,根據Request報文中攜帶的使用者MAC來查詢有沒有相應的租約記錄(即之前的預分配過程中登記的那個MAC),如果有則傳送ACK報文作為迴應,通知使用者可以使用分配的IP地址。
5. DHCP NAK
如果DHCP伺服器收到Request報文後,沒有發現有相應的租約記錄或者由於某些原因無法正常分配IP地址,則傳送NAK報文作為迴應,通知使用者無法分配合適的IP地址。
6. DHCP Release
當使用者不再需要使用分配IP地址時,就會"主動"向DHCP伺服器傳送Release報文,告知伺服器使用者不再需要分配IP地址,DHCP伺服器會釋放被繫結的租約(在資料庫中清除某個MAC對某個IP的租約記錄,這樣,這個IP就可以分配給下一個請求租約的MAC)
7. DHCP Decline
DHCP客戶端收到DHCP伺服器迴應的ACK報文後,通過地址衝突檢測發現伺服器分配的地址衝突或者由於其他原因導致不能使用,則傳送Decline報文,通知伺服器所分配的IP地址不可用,我們在手工設定靜態IP、或者DHCP分配中有時會遇到"檢測到IP衝突"的提示就是因為客戶端利用ARP機制來在當前內網中確認當前指定的IP是否已經被佔用
8. DHCP Inform
DHCP客戶端如果需要從DHCP伺服器端獲取更為詳細的配置資訊,則傳送Inform報文向伺服器進行請求,伺服器收到該報文後,將根據租約進行查詢,找到相應的配置資訊後,傳送ACK報文迴應DHCP客戶端

 

 

3. DHCP伺服器搭建

1. 修改DHCP伺服器網路卡配置:

vim /etc/sysconfig/network-scripts/ifcfg-eth0

修改為:

DEVICE=eth0
BOOTPROTO=static 
HWADDR=00:0C:29:83:BB:21
ONBOOT=yes
IPADDR=192.168.159.128
NETMASK=255.255.255.0
BROADCAST=192.168.159.255
GATEWAY=192.168.159.2

重啟網路服務

service network restart

2. 安裝DHCP服務

yum -y install dhcp*

3. 配置DHCP服務

vim /etc/dhcpd.conf
cp /usr/share/doc/dhcp-3.0.5/dhcpd.conf.sample /etc/dhcpd.conf
vim /etc/dhcpd.conf

ddns-update-style interim; #定義所支援的DNS動態更新型別(必選),一般我們設定成關閉,interim和none都是關閉的意思  
ignore client-updates; #忽略客戶機更新DNS記錄

subnet 192.168.159.0 netmask 255.255.255.0 #設定子網宣告  
{ 
    # --- default gateway
        option routers                  192.168.159.2; #設定預設閘道器
        option subnet-mask              255.255.255.0; #設定客戶端的子網掩碼

        option nis-domain               "domain.org"; #為客戶設定NIS域  
        option domain-name              "LittleHann.com"; #為客戶設定域名
        option domain-name-servers      192.168.159.128; #為客戶設定域名伺服器(DNS)IP地址

        option time-offset              -18000; # Eastern Standard Time
#       option ntp-servers              192.168.1.1;
#       option netbios-name-servers     192.168.1.1;
# --- Selects point-to-point node (default is hybrid). Don't change this unless
# -- you understand Netbios very well
#       option netbios-node-type 2;

        range dynamic-bootp 192.168.159.150 192.168.159.254; #設定動態的地址池  
        default-lease-time 21600; #設定預設的地址租期
        max-lease-time 43200; #設定客戶端最長的地址租期  

        #這個域用於設定靜態MAC-IP分配繫結,即我們前面說的管理員可以指定某些MAC靜態分配一個IP,不變的
        host target.host.com 
    {    
        hardware ethernet 00:0c:29:4b:5c:be; #指定dhcp客戶的mac地址  
        fixed-address 192.168.63.130; #給指定的mac地址分配ip  
        option host-name  "target.host.com";  
    }   
}

啟動DHCP服務: 

service dhcpd start

重啟網路: 

service network restart

測試效果:

ifdown eth0
ifup eth0

可以看到,客戶端成功從DHCP伺服器獲取到了IP地址

 

 

4. DHCP協商互動過程

 

這張有限狀態機的轉換圖非常好的說明了DHCP的協商互動過程,我們用wireshark抓包軟體來親身實驗一下DHCP的互動過程

0x1: DHCPDISCOVER

客戶端在向內網中的DHCP伺服器請求進行DHCP互動

0x2: DHCPOFFER

DHCP伺服器對客戶端的請求進行迴應,在迴應之前,DHCP會先對將要進行分配的IP進行ARP確認,確認當前子網沒有客戶端在使用這個IP

可以看到,DHCP的OFFER迴應中包含了DNS伺服器IP、預設閘道器等資訊

0x3: DHCPREQUEST

客戶端會選擇"最先"接收到的OFFER資料包指示的IP地址,發起REQUEST請求,請求租約

0x4: DHCPASK

DHCP迴應客戶端的租約請求

 

同樣,DHCP伺服器的迴應資料包中包含了DNS、子網掩碼、閘道器、租約時間等資訊

 

在確認租約之後,DHCP伺服器還會傳送一個PING包進行確認

以上就是客戶端和DHCP伺服器的租約互動過程,renew、lease過程原理類似,大家可以用wireshark抓包進行實驗

 

 

Copyright (c) 2014 LittleHann All rights reserved

 

 

 

相關文章