DHCP(Dynamic Host Configuration Protocol,動态主機配置協定)是IETF為實作IP的自動配置而設計的協定,它可以為客戶機自動配置設定IP位址、子網路遮罩以及預設網關、DNS伺服器的IP位址等TCP/IP參數。了解DHCP工作過程可以幫助我們排除有關DHCP服務遇到的問題。DHCP 協定是基于UDP層之上的應用,dhcp使用udp攜帶封包,udp封裝在ip資料包中發送。我們先來看下dhcp封包格式
<a href="http://blog.51cto.com/attachment/201012/222325678.png" target="_blank"></a>
OP:若是client送給server的封包,設為1,反向為2;
Htype:硬體類别,ethernet為1;
Hlen:硬體長度,ethernet為6;
Hops:若資料包需經過router傳送,每站加1,若在同一網内,為0;
Transaction ID:事務ID,是個随機數,用于客戶和伺服器之間比對請求和相應消息;
Seconds:由使用者指定的時間,指開始位址擷取和更新進行後的時間;
Flags:從0-15bits,最左一bit為1時表示server将以廣播方式傳送封包給 client,其餘尚未使用;
Ciaddr:使用者IP位址;
Yiaddr:客戶IP位址;
Siaddr:用于bootstrap過程中的IP位址;
Giaddr:轉發代理(網關)IP位址;
Chaddr:client的硬體位址;
Sname:可選server的名稱,以0x00結尾;
File:啟動檔案名;
Options:,廠商辨別,可選的參數字段
下面我們主要說下客戶機從dhcpserver擷取ip的過程,它處于6中狀态分别是初始狀态,選擇狀态,請求狀态,綁定狀态,重新擷取狀态,重新綁定狀态。我們就結合我下面畫的這張圖好好說下
<a href="http://blog.51cto.com/attachment/201012/222821862.png" target="_blank"></a>
1.主機啟動,dhcp處于INI狀态為了擷取ip位址,DHCP客戶機初始化TCP/IP,通過UDP端口67向網絡中發送一個DHCPDISCOVER廣播包,請求租用IP位址。該 廣播包中的源IP位址為0.0.0.0,目标IP位址為255.255.255.255;包中還包含客戶機的MAC位址和計算機名,本地所有的dhcpserver會收到這個封包,資料包中的目标端口設為BOOTP67端口。這時dhcp會處于select狀态。
2.處于select狀态的主機會接受dhcpserver發來的dhcpoffer封包,每個封包中會包含為客戶機配置的資訊以及server為客戶機提供的租用ip,一般主機會受到零個或者多個offer封包(一般主機會響應第一個offer封包),并與server協商相關事宜,為此主機會發送一個dhcpquest封包,并進入request狀态。
3.dhcpserver會給客戶機一個ack的确認資訊,這時一個dhcp擷取過程結束。主機進入BIND穩定狀态。
4.假如主機不需要ip位址或者需要換個ip,這時主機會發送一個dhcprelease封包向dhcpserver,這時主機重新處于初始狀态。
5.一般伺服器給客戶機的ip位址都有租期,時間長短不等,而dhcp主機會有3個計時器,當擇期過半50%,這時主機會發送一個dhcprequest封包要求續租進入renew狀态,serverdhcp會響應這個封包發送ack确認資訊,這時dhcp會重新進入BOND狀态。
6.假如dhcpserver沒有響應主機的請求,等租期到了87.5%這時主機會重新發送dhcprequest封包要求續租,主機進入rebind狀态,假如這時候dhcpserver不高興(ip位址不夠用)發送來一個否确認資訊,這時主機會重新進入初始狀态再次按照1——4步驟重新申請ip。假如收到ack老大的确認續租成功,說明這個ip我們還可以繼續使用。沒有響應,我們的主機隻有等到我們ip租期耗盡,重新進入初始狀态重新擷取。
封包類型:
1)DHCPDISCOVER(0x01),此為Client開始DHCP過程的第一個封包
2)DHCPOFFER(0x02),此為Server對DHCPDISCOVER封包的響應
3)DHCPREQUEST(0x03),此封包是Slient開始DHCP過程中對server的DHCPOFFER封包的回應,或者是client續延IP位址租期時發出的封包
4)DHCPDECLINE(0x04),當Client發現Server配置設定給它的IP位址無法使用,如IP位址沖突時,将發出此封包,通知Server禁止使用IP位址
5)DHCPACK(0x05),Server對Client的DHCPREQUEST封包的确認響應封包,Client收到此封包後,才真正獲得了IP位址和相關的配置資訊。
6)DHCPNAK(0x06),Server對Client的DHCPREQUEST封包的拒絕響應封包,Client收到此封包後,一般會重新開始新的DHCP過程。
7)DHCPRELEASE(0x07),Client主動釋放server配置設定給它的IP位址的封包,當Server收到此封包後,就可以回收這個IP位址,能夠配置設定給其他的Client。
8)DHCPINFORM(0x08),Client已經獲得了IP位址,發送此封包,隻是為了從DHCP SERVER處擷取其他的一些網絡配置資訊,如route ip,DNS Ip等,這種封包的應用非常少見。
如:運作IPCONFIG/RELEASE後,PC會發出釋放IP的封包,DHCP Message Type是7,他的作用是主動釋放server配置設定給它的IP位址的封包,Server收到此封包後,就可以回收這個IP位址,能夠配置設定給其他的Client。
如果一台客戶機未從該DHCP伺服器擷取過位址,或者它獲得的位址已過期,那麼它将需要經過全部四個步驟才能得到一個IP位址。
我們說完了dhcp擷取過程,下面我們說下cisco路由下dhcp配置(這是借用論壇一個例子我就不配了呵呵^)
<a href="http://blog.51cto.com/attachment/201012/225541744.png" target="_blank"></a>
如圖中所示,當R1 的接口配置為DHCP 獲得位址後,那麼将從F0/0 發出目的
地為255.255.255.255 的廣播請求包,如果R2 為DHCP 伺服器,便會響應用戶端,
但它不是DHCP 伺服器,是以R2 收到此廣播包後便預設丢棄該請求包。而真正的
DHCP 伺服器是R4,R1 的廣播包又如何能到達R4 這台伺服器呢,R4 又如何向R1
用戶端發送正确的IP 位址呢。
路由器是不能夠轉發廣播的,是以,除非能夠讓R2 将用戶端的廣播包單點傳播發向
R4 這台伺服器。我們的做法就是讓R2 将廣播包通過單點傳播繼續前轉到R4 這台服務
器,稱為DHCP 中繼,通過IP help-address 功能來實作。
1.R2 配置
(1)配置将DHCP 廣播前轉到34.1.1.4
注:IP help-address 功能預設能夠前轉DHCP 協定,是以無需額外添加。
R2(config)#int f0/0
R2(config-if)#ip helper-address 34.1.1.4
2.配置DHCP Server:
(1)開啟DHCP 功能
R4(config)#service dhcp
(2)配置DHCP 位址池
R4(config)#ip dhcp pool ccie1 位址池名為ccie1
R4(dhcp-config)#network 10.1.1.0 255.255.255.0 可供用戶端使用的位址段
R4(dhcp-config)#default-router 10.1.1.1 網關
R4(config)#ip dhcp pool ccie2 位址池名為ccie1
R4(dhcp-config)#network 34.1.1.0 255.255.255.0 可供用戶端使用的位址段
R4(dhcp-config)#default-router 34.1.1.4 網關
(3)去掉不提供給用戶端的位址
R4(config)#ip dhcp excluded-address 10.1.1.1 10.1.1.10 移除10.1.1.1 到10.1.1.10
R4(config)#ip dhcp excluded-address 34.1.1.1 34.1.1.10 移除 20.1.1.1 到
20.1.1.10
(4)配置正确位址池的路由
R4(config)#ip route 10.1.1.0 255.255.255.0 34.1.1.3
注: R3 無需做任何配置!
3.檢視結果
檢視DHCP Client 會看到接口F0/0 的IP 位址為10.1.1.11,那麼DHCP 伺服器R4
又是根據什麼來判斷出用戶端需要的是哪個網段的IP 位址呢,為什麼還是沒有錯把
34.1.1.0/24 網段的位址發給客戶呢。不是說伺服器從哪個接口收到請求,就把這個
接口相同網段的位址發給用戶端嗎?按照之前的理論,應該是發送34.1.1.0/24 的地
址給客戶啊。在這裡,能夠指導伺服器發送正确IP 位址給用戶端,是因為有一個被
稱為option 82 的選項,這個選項隻要DHCP 請求資料包被中繼後便會自動添加,此
選項,中繼路由器會在裡面的giaddr 位置寫上參數,這個參數,就是告訴伺服器,客
戶端需要哪個網段的IP位址才能正常工作。中繼路由器從哪個接口收到客戶的DHCP
請求,就在option 82 的giaddr 位置寫上該接收接口的IP 位址,然後伺服器根據giaddr
位置上的IP 位址,從位址池中選擇一個與該IP 位址相同網段的位址給客戶,如果
沒有相應位址池,則放棄響應,是以,伺服器R4 能夠正确發送10.1.1.0/24 的位址
給客戶,正是因為R2 在由于IP help-address 的影響下,将giaddr 的參數改成了自己
接收接口的位址,即将giaddr 參數改成了10.1.1.1,通過debug 會看到如下過程:
*Mar100:28:36.666: DHCPD: setting giaddr to 10.1.1.1.
*Mar100:28:36.666HCPD:BOOTREQUESTfrom0063.6973.636f.2d30.3031.322e.
6439.6639.2e63.3638.302d.4661.302f.30 forwarded to 34.1.1.4.
從上面debug 資訊可以看到R2 是将giaddr 改成 10.1.1.1 後發中繼發向34.1.1.4
的,需要知道的是,經過中繼後發來的DHCP 請求包如果giaddr 位置不是某個IP 地
址而是0.0.0.0 的話,伺服器是丢棄該請求而不提供IP 位址的。
注:當伺服器上存在10.1.1.0/24 網段的位址池時,伺服器要将該位址池發送給客戶,
就必須存在到達10.1.1.0 網段的路由(預設路由也行),并且用戶端必須位于該路由的
方向,如果方向不對,該位址池也是不能夠發給客戶使用的。
我主要說下vlan間的hdcp配置
<a href="http://blog.51cto.com/attachment/201012/230221260.png" target="_blank"></a>
sw1(config)#service dhcp
sw1(config)#ip dhcp pool dhcp1
sw1(dhcp-config)#network 20.1.1.0 255.255.255.0
sw1(dhcp-config)#default-router 20.1.1.1
sw1(dhcp-config)#lease 7
sw1(config)#ip dhcp pool dhcp2
sw1(dhcp-config)#network 40.1.1.0 255.255.255.0
sw1(dhcp-config)#default-router 40.1.1.1
sw1(config)#ip dhcp excluded-address 20.1.1.1 20.1.1.10
sw1(config)#ip dhcp excluded-address 40.1.1.1 40.1.1.10
sw1(config)#vlan 10
sw1(config-vlan)#exit
sw1(config)#vlan 20
sw2(config)#int f0/1
sw2(config-if)#switchport mode access
sw2(config-if)#switchport access vlan 20
sw2(config-if)#exit
sw3(config)#int vlan 40
sw3(config-if)#ip address 40.1.1.1 255.255.255.0
sw3(config-if)#ip helper-address 50.1.1.5
sw3(config-if)#exit
sw3(config)#int vlan 20
sw3(config-if)#ip address 20.1.1.1 255.255.255.0
sw3(config-if)#ip helper-address 50.1.1.5
pc1(config)#int f0/1
pc1(config-if)#ip address dhcp
pc2(config)#int f0/1
pc2(config-if)#ip address dhcp
<a href="http://blog.51cto.com/attachment/201012/231317999.png" target="_blank"></a>
下面我們在說先dhcp欺騙
現在網絡中有台機子冒充dhcp伺服器,我們知道客戶機一般會響應最早的那個dhcpoffer,這樣客戶機就接受了假冒那台dhcpserver提供的ip位址,這時我們不願意看到的。我們可以設定dhcp監聽來防止
本文轉自q狼的誘惑 51CTO部落格,原文連結:http://blog.51cto.com/liangrui/449093,如需轉載請自行聯系原作者