相關學習資料
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) 1、4、Subnet Mask 2) 3、n*4、Router(網關) 3) 6、n*4、DNS Server 4) 7、n*4、Log Server 5) 26、2、Interface MTU 6) 33、n*8、Static route 7) 35、4、ARP cache timeout 8) 42、n*4、NTP servers 9) 51、4、IP address lease time 10) 53、1、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) 5、4、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