天天看點

DHCP原了解析及其在cisco上的配置

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,如需轉載請自行聯系原作者

繼續閱讀