原文鏈接地址:https://bbs.51cto.com/thread-800321-1.html
最近看到大家經常由於DHCP的問題犯愁, 為了讓大家更明白的了解DHCP並且會配置,特此發這個貼
相信大家認證看完對DHCP就會了如指掌
1.配置DHCP Server
(1)開啟DHCP 功能
r2(config)#service dhcp
(2)配置DHCP 地址池
r2(config)#ip dhcp pool ccie1 地址池名為ccie1
r2(dhcp-config)#network 10.1.1.0 255.255.255.0 可供客戶端使用的地址段
r2(dhcp-config)#default-router 10.1.1.1 網關
r2(dhcp-config)#dns-server 10.1.1.1 10.1.1.2 DNS
r2(dhcp-config)#lease 1 1 1 租期為1 天1 小時1 分(默認為一天)
r2(config)#ip dhcp pool ccie2 地址池名為ccie1
r2(dhcp-config)#network 20.1.1.0 255.255.255.0 可供客戶端使用的地址段
r2(dhcp-config)#default-router 20.1.1.1 網關
r2(dhcp-config)#dns-server 20.1.1.1 20.1.1.2 DNS
r2(dhcp-config)#lease 1 1 1 租期為1 天1 小時1 分(默認一天)
(3)去掉不提供給客戶端的地址
注:因為某些IP 地址不希望提供給客戶端,比如網關地址,所以我們要將這些地址
從地址池中移除,這樣服務器就不會將這些地址發給客戶端使用。
r2(config)#ip dhcp excluded-address 10.1.1.1 10.1.1.10 移除10.1.1.1 到10.1.1.10
r2(config)#ip dhcp excluded-address 20.1.1.1 20.1.1.10 移除20.1.1.1 到20.1.1.10
2.配置DHCP Client
(1)配置接口使用DHCP
r1(config)#int f0/1
r1(config-if)#ip address dhcp
3.查看命令:
(1)在服務器上查看哪些地址分配給了哪些主機:
R2#Show ip dhcp binding
4.查看結果
查看DHCP Client 會看到接口 F0/0 的IP 地址為10.1.1.11 並且產生一條指向
10.1.1.1 的默認路由(換成PC 就會變成網關是10.1.1.1),路由器並不需要得到DNS。
在這里,DHCP Server 上明明配了兩個地址池,網段分別為 10.1.1.0/24 和
20.1.1.0/24,為什么客戶端向服務器請求地址的時候,服務器就偏偏會把10.1.1.0/24
網段的地址發給客戶,而不會錯把20.1.1.0/24 網段的地址發給客戶呢。這是因為服
務器從哪個接口收到DHCP 請求,就只能向客戶端發送地址段和接收接口地址相同
的網段,如果不存在相同網段,就會丟棄請求數據包。圖中接收接口地址為10.1.1.1,
而地址池ccie1 中的網段10.1.1.0/24 正好和接收接口是相同網段,所以向客戶端發
送了IP 地址10.1.1.11。
DHCP 中繼
如圖中所示,當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 分配不同地址
如圖3 中所示,兩個DHCP 客戶端分別位於交換機上兩個不同的VLAN,交換機
上的VLAN 接口將作為他們的網關,R3 是DHCP 服務器,這兩個客戶端必須得到不
同網段的地址,否則無法與外網通信,在這種情況下,服務器R3 也必須正確為R1
分配10.1.1.0/24 網段的地址,必須為R2 分配20.1.1.0/24 的地址,配置如下:
1.配置DHCP Server
(1)開啟DHCP 功能
R3(config)#service dhcp
(2)配置DHCP 地址池
R3(config)#ip dhcp pool ccie1 地址池名為ccie1
R3(dhcp-config)#network 10.1.1.0 255.255.255.0 可供客戶端使用的地址段
R3(dhcp-config)#default-router 10.1.1.1 網關
R3(config)#ip dhcp pool ccie2 地址池名為ccie1
R3(dhcp-config)#network 20.1.1.0 255.255.255.0 可供客戶端使用的地址段
R3(dhcp-config)#default-router 20.1.1.1 網關
(3)去掉不提供給客戶端的地址
R3(config)#ip dhcp excluded-address 10.1.1.1 10.1.1.10 移除10.1.1.1 到10.1.1.10
R3(config)#ip dhcp excluded-address 20.1.1.1 20.1.1.10 移除 20.1.1.1 到
20.1.1.10
(4)配置正確地址池的路由
R3(config)#ip route 10.1.1.0 255.255.255.0 30.1.1.1
R3(config)#ip route 20.1.1.0 255.255.255.0 30.1.1.1
2.配置交換機
(1)配置相應接口信息
sw(config)#vlan 10
sw(config-vlan)#exit
sw(config)#vlan 20
sw(config-vlan)#exit
sw(config)#int f0/1
sw(config-if)#switchport mode access
sw(config-if)#switchport access vlan 10
sw(config-if)#exit
sw(config)#int f0/2
sw(config-if)#switchport mode access
sw(config-if)#switchport access vlan 20
sw(config-if)#exit
sw(config)#int vlan 10
sw(config-if)#ip address 10.1.1.1 255.255.255.0
sw(config-if)#ip helper-address 30.1.1.3 單播前轉DHCP 廣播到30.1.1.3
sw(config-if)#exit
sw(config)#int vlan 20
sw(config-if)#ip address 20.1.1.1 255.255.255.0
sw(config-if)#ip helper-address 30.1.1.3 單播前轉DHCP 廣播到30.1.1.3
3.配置DHCP Client
(1)配置R1
r1(config)#int f0/1
r1(config-if)#ip address dhcp
(2)配置R2
r2(config)#int f0/1
r1(config-if)#ip address dhcp
4.查看結果:
按上述配置完之后,客戶端R1 的F0/0 便能夠收到地址10.1.1.11,客戶端R2 便
能夠收到地址20.1.1.11,然后就可以全網通信。在上述的情況下,服務器R3 能夠
正確為R1 分配10.1.1.0/24 網段的地址,能夠正確為R2 分配20.1.1.0/24 網段的地址,
同樣也是因為交換機在收到R1 的DHCP 廣播包后,將giaddr 的參數改成了10.1.1.1,
收到R2 的廣播包后,將giaddr 的參數改成了20.1.1.1,所以最后服務器R3 能夠根
據 giaddr=10.1.1.1 的包分配10.1.1.0/24 的地址,根據giaddr=20.1.1.1 的包分配
20.1.1.0/24 的地址。
IP 與MAC 地址綁定
在配置DHCP 時,地址池中除了移除掉的IP 地址之外,所有的地址都會按順序
分配給客戶,所以客戶機得到的 IP 地址是無法固定的,有時需要每次固定為某些
PC 分配相同的IP 地址,那么這時就可以配置DHCP 服務器以靜態將IP 地址和某些
MAC 綁定,只有相應的MAC 地址才能獲得相應的IP 地址。在Cisco 設備上靜態將
IP 與MAC 綁定的方法為,需要將某個IP 地址綁定給MAC 地址,就為該IP 地址單獨
創建地址池,稱為host pool,地址池中需要注明IP 地址和掩碼位數,並且附上一個
MAC 地址,以后這個IP 地址就只分配給這個MAC 地址,所以host pool 只能有一個
IP 地址和一個MAC 地址,如果需要為多個客戶綁定IP 和MAC,就必須得單獨為每
個客戶都配置各自的host pool,還要注意的是,在host pool 中,MAC 地址的表示
方法和平常不一樣,比如一個主機網卡的MAC 地址為aabb.ccdd.eeff,在地址池中,
需要在前面加上01 (01 表示為以太網類型),結果為01aa.bbcc.ddee.ff
1.配置host pool:
(1)配置pool 名
r1(config)#ip dhcp poo ccie
(2)配置IP 地址
r1(dhcp-config)#host 10.1.1.100 /24
(3)配置與該IP 地址對應的MAC 地址
r1(dhcp-config)#client-identifier 01aa.bbcc.ddee.ff
2.查看配置結果:
(1)查看服務器地址分配狀態
r1#sh ip dhcp binding
Bindings from all pools not associated with VRF:
IP address Client-ID/ Lease expiration Type
Hardware address/
User name
10.1.1.100 01aa.bbcc.ddee.ff Infinite Manual
r1#
說明:從以上結果可以看出,IP 地址10.1.1.100 已經手工與MAC 地址aabb.ccdd.eeff
做了綁定,以后只要MAC 地址為aabb.ccdd.eeff 的客戶端請求IP 地址時,才能獲得
IP 地址10.1.1.100。
DHCP 安全ARP
Cisco 設計的DHCP 安全ARP 也許不是絕對的安全,但也起到了一定的作用,原
本設計為一個需要計費的公共熱點PVLAN (公共無線場所),如圖4 中所示,R3 為
DHCP 服務器,為付費的R1 提供正確IP 地址以提供網絡服務,當服務器R3 為客戶
端R1 提供IP 地址 10.1.1.2 之后,就已經記住了它的MAC 地址,在正常情況下,如
果R1 退出,服務器是不知道的,並且當網絡中有欺騙者接入后,也可冒充10.1.1.2
這個地址進行上網,當然R1 和R2 的MAC 地址肯定是不一樣的,如果這時服務器
R3 由於自動更新ARP 表的MAC 地址,就能夠順利讓R2 上網。
基於上述原因,需要在服務器R3 和客戶端R1 之間提供某種安全機制,即服務器
定期ARP 訊問10.1.1.2 是否還存在,在訊問時,只有R1 能夠回答。
在完成這種機制,需要兩個feature 來支持,第一個是Update Arp,在地址池模
式下開啟,這個feature 便是定期訊問網絡中DHCP 客戶端的;第二個是Authorized
ARP (ARP 授權),只能在以太網接口下開啟,功能是禁止該接口下通過ARP 自動更
新和學習MAC 地址,這樣一來,接口下將不能有手動配置IP 的設備接入,因為手
工配置IP 接入后,服務器不會更新自己的ARP 表,也就無法完成到新設備的二層
MAC 地址封裝,也就無法和新設備進行通信,只有合法的DHCP 客戶端才能正常通
信,所以,如果為遠程客戶端分配IP 地址,就無法做這樣的保護,並且到遠程客戶
端的下一跳必須是自己的客戶端,因為如果不是,是無法通信的,因為ARP 不存在
到它的條目。
1.配置安全ARP:
(1)開啟DHCP 功能
R3(config)#service dhcp
(2)配置DHCP 地址池
R3(config)#ip dhcp pool ccie1 地址池名為ccie1
R3(dhcp-config)#network 10.1.1.0 255.255.255.0 可供客戶端使用的地址段
R3(dhcp-config)#default-router 10.1.1.1 網關
R3(dhcp-config)#update arp 開啟定期ARP 訊問
(3)去掉不提供給客戶端的地址
R3(config)#ip dhcp excluded-address 10.1.1.1 10.1.1.10 移除10.1.1.1 到10.1.1.10
(4)在接口下開啟Authorized ARP
R3(config)#int f0/0
R3(config-if)#Router(config-if)# arp authorized 禁止動態更新ARP
R3(config-if)# arp timeout 60 60 秒客戶無應答則刪除ARP 條 目
說明:通過以上配置之后,當DHCP 客戶端從服務器獲得IP 地址后,服務器便會定
期查訊該IP 地址,如果60 秒沒有回答,便從ARP 表中刪除該條目。
DHCP 監聽
如圖5 中所示,客戶端R1 只有正確從服務器R3 中獲得10.1.1.0/24 網段的IP
地址才能夠正確上網,如果當網絡中出現另外一台錯誤的DHCP 服務器(圖中R2),
R2 向客戶端R1 發出20.1.1.0/24 的地址,那么將導致R1 網絡中斷,在這樣的情況下,
就需要禁止不合法的DHCP 服務器向網絡中提供DHCP 服務,這就需要DHCP 監聽
(DHCP Snooping)。DHCP Snooping 是在交換機上完成的,如上圖中,只要告訴交換
機,只有F0/3 發來的DHCP 應答地址才轉發給客戶端,其它接口發來的應答地址統
統被丟棄。要做到這一點,就要告訴交換機,F0/3 接口是它可能信任的DHCP 地址,
其它接口都是不可信的,不能提供DHCP 應答,那么在實現這個功能時,就需要將
交換機上的接口分為可信任接口和不可信任接口兩種,默認交換機全為不可信任接
口,也就是說交換機開啟DHCP Snooping 之后,沒有任何一個接口上的DHCP 服務
器能提供服務。在交換機上配置DHCP Snooping 時,必須指明在哪個VLAN 上進行
監聽,其它沒有監聽的VLAN 不受上述規則限制。
1.交換機上配置DHCP Snooping
注:交換機上所有接口全部划入VLAN1
(1)在交換機上開啟DHCP Snooping
sw(config)#ip dhcp snooping 開啟DHCP Snooping
sw(config)#ip dhcp snooping vlan 1 在交換機上啟用DHCP Snooping
(2)將相應接口變為信任接口(默認全部為不可信)
sw(config-if)#ip dhcp snooping trust
2.查看命令:
(1)查看dhcp snooping
Sw#sh ip dhcp snooping
說明:通過以上配置之后,只有交換機F0/3 接口上(信任接口)的設備能夠應
答DHCP 請求,而其它所有接口,比如R2 過來的DHCP 應答是會被丟棄的。但是你
會發現,在這之后,R1 還是無法獲得服務器R3 發來的DHCP 地址。這是因為開了
DHCP Snooping 的交換機默認會產生中繼效果,即將DHCP 請求包的giaddr 的參數改
成0.0.0.0,交換機的這種中繼效果是無法關閉的,當一個服務器收到中繼后並且將
giaddr 設置為0.0.0.0 而不是IP 地址的請求包時,默認是要丟棄該數據包而不作應答
的,所以服務器R3 丟棄了該請求數據包。要讓客戶R1 能夠正常收到DHCP 提供的
IP 地址,就要讓DHCP 服務器對即使giaddr 為0.0.0.0 的請求包也作出應答。配置如
下:
R3(config-if)#ip dhcp relay information trusted
最后,從上圖中,如果R3 本身還不是DHCP 服務器,如果DHCP 服務器還在遠程
網絡,需要R3 提供中繼並轉發該請求包到服務器的話,那么R3 除了在接口下配置
ip dhcp relay information trusted 之外,還必須配置ip helper-address,兩者缺一不可。