可能是目前最全的講 DHCP 的文章了

對於 DHCP 協議,你可能想知道以下幾個問題:

  • DHCP 是啥

  • 爲啥需要 DHCP

  • DHCP 的工作機制

  • DHCP 如何分配地址

  • DHCP 報文格式長啥樣

  • DHCP 中繼是啥

  • DHCP 有什麼問題

  • DHCP 使用到哪些工具

下面我們就帶着這些問題,來一探究竟。

01 DHCP 是啥

DHCP 全稱是 Dynamic Host Configuration Protocol,動態主機配置協議,主要用來給主機配置 IP 地址等網絡信息的。IP 地址可以手動配(用 ifconfig/ipconfig/ip addr 等工具),也可以自動配,自動配就通過 DHCP 這個協議來完成,IPv6 有對應的 DHCPv6 協議。

02 爲啥需要 DHCP

首先當然是方便了,手動配一臺可以,如果讓你去配一個數據中心所有的主機,怎麼辦?

還有有些主機可能經常要移動,這就意味着要提供靈活的重新分配地址的機制,不然人工操作相當麻煩。

再有有些系統,可能不僅僅需要配置某個網卡的地址,還需要配置出口網關地址,DNS 域名服務器地址等等,這同樣面臨操作成本的問題。

最後相比程序化的機器,人是最容易出錯的,如果不小心操作不當,那可能會面臨嚴重的 IT 事故。

因此,急需一個程序(協議)來自動化完成這件事,這就是 DHCP 必然存在的原因。

03 DHCP 的工作機制

DHCP 協議以 C/S 的方式進行工作。現在的操作系統的協議棧中都是包含 DHCP 功能的,當你的主機啓動時,它就是一臺 DHCP 客戶端,會向當前局域網內的 DHCP 服務器獲取 IP 地址等網絡信息。

DHCP 服務器爲了能夠正確分發 IP 地址,需要完成兩方面的內容:

  • IP 地址管理:包括維護 IP 地址池、IP 地址租約管理等

  • 配置數據交付:包括 DHCP 協議的消息格式和狀態機處理等

IP 地址管理

DHCP 服務器通常會維護兩張表:IP 地址池表和租約表(通常保存在持久性存儲器中,比如非易失性內存或磁盤中)。

IP 地址池表是專門爲 DHCP 用途而分配的一個連續的 IP 地址範圍,我們可以在開啓 DHCP 服務的主機上看到,大概像這樣:

#cat /etc/dhcp/dhcpd.conf
subnet 10.10.0.0 netmask 255.255.0.0 {
  range 10.10.0.2 10.10.0.254;
  option routers 10.10.0.1;
}

所有新的客戶端請求都會從 IP 地址池表中選擇一個地址作爲響應,等到確定該地址可以給某個客戶端使用時,將其加入租約表中進行管理。

租約表主要維護已分配地址的租約時間。DHCP 協議規定每個地址都有一定的租約週期要求,要不然這個地址池分分鐘就被耗盡了。有了租約時間,DHCP 服務器就可以動態地管理自己所管轄範圍內的所有主機的進進出出,就像去餐廳喫飯,位置就那麼幾個,但是服務的客流量可能很大。

租約時間可以從幾分鐘到幾天或更長時間。租約時間的長短各有利弊,時間較長,會較快耗盡可用的地址池,但卻提供穩定的地址和減少網絡開銷(因爲續租請求較少);反之亦然。所以,確定租約時間的最佳值需要對預期客戶數、地址池大小和地址穩定性等因素進行權衡。常見的默認值包括 12~24 小時 。而微軟則建議較小的網絡採用 8 天 ,較大的網絡採用 16~24 天

客戶端在租約時間 過半時 需要向服務端嘗試續訂租約,服務端在確定本次續約成功後,也會更新相關的租約信息。

爲了更好地給用戶體驗,很多系統都會提供配置 DHCP 地址池的界面:

配置數據交付

DHCP 客戶端和服務端通過數據交互來完成地址的分配和租約更新。這些消息有不同的格式和作用,雙方會根據收到的不同消息,進入不同的狀態進行處理。

總的來說,包括以下 8 種消息:

  • DHCP DISCOVER

  • DHCP OFFER

  • DHCP REQUEST

  • DHCP ACK

  • DHCP NAK

  • DHCP RELEASE

  • DHCP DECLINE

  • DHCP INFORM

那這 8 種消息是如何進行交互來分配 IP 地址的呢?下面就來一探究竟。

04 DHCP 如何分配地址(消息交互流程)

如下圖,是客戶端接入網絡時發生的消息交互流程:

① 客戶端初始請求 DHCP 服務器:發送 DHCP DISCOVER 包

當 DHCP Client 第一次啓動接入網絡時,此時還沒有 IP 地址,它就向網絡當中所有的 DHCP Server 發送一個 DCHP DISCOVER 的廣播包。其中包的源目的端口分別是 67、68(DHCP 基於 UDP 協議,使用 UDP 67、68 端口來指代客戶端和服務端);源目的 IP 地址分別是 0.0.0.0255.255.255.255;然後包的內容會包含標識客戶端的 MAC 地址和主機名等信息。(等於向網絡傳達:我是新人,誰能給我分配個 IP)。

DHCP DISCOVER 消息有超時時間限制,默認是 1s。如果包發出去,在 1s 之內沒有得到迴應,就會發第二次,還是沒有迴應,就繼續發,一共會發 四次,以 2、4、8、16s 爲時間間隔。

如果 四次之後還是沒有得到 DHCP Server 的迴應,Client 就會從 169.254.0.0/16 這個自動保留的私有 IP 地址域中選用一個 IP 地址。同時它還會繼續向服務端請求,每隔 5min 請求一次,如果收到Server 響應了,就選用響應的地址。

② 服務端響應 IP 地址租用:發送 DHCP OFFER 包

網絡中可能存在着多臺 DHCP Server ,它們都會收到 DHCP DISCOVER 包,然後從自身維護的 IP 地址池中根據一定的規則選擇一個可用的 IP 地址(比如看是否有 IP 之前分配給該 Client,如沒有,則選擇一個最小可用的 IP ),併發送 DHCP OFFER 廣播包。其中,包的源目的端口號分別爲 68、67,源 IP 爲該 Server 的 IP,目的 IP 仍然爲廣播地址,包的內容包含 IP 地址、子網掩碼、租約時間以及其他配置信息(如網關、DNS 服務器等)。(等於告訴 Client:我這有可用的地址,你可以使用)。

同時,DHCP Server 會爲此 Client 保留爲它提供的 IP 地址信息,不讓其他 Client 分配此 IP。

③ 客戶端進行 IP 地址租約:發送 DHCP REQUEST 包

Client 可能會收到多臺 DHCP Server 的響應,它會按照一定的規則選擇一個 DHCP OFFER(一般是先到達的那個)。這個時候 Client 還不能使用這個 DHCP OFFER 提供的 IP,因爲網絡中其他的 DHCP Server 還不知情,所以 Client 會再發一個 DHCP REQUEST 廣播包,一方面是告訴它接受 IP 的 DHCP Server:我打算用你分配的 IP 了,另一方面也是告訴其他 DHCP Server,我已經接受了別人分配的 IP,你們給我分配的 IP 可以撤銷了。

其中,包的源 IP 仍然是 0.0.0.0,因爲還沒有得到 DHCP Server 的確認,包的內容包含 Client 的 MAC 地址、接受租約的 IP 地址以及提供此租約的 DHCP Server 的地址等信息。

DHCP REQUEST 包除了以上初始化的過程用到,在整個地址租約生命週期內都會用到,比如租約更新、重新分配等等,不過在租約更新過程中使用的是單播包,因爲這個時候 Server 的地址是明確的,也不需要告知其他 Server。

④ 服務端對 IP 租約進行確認:發送 DHCP ACK 包

當被 Client 接受的 DHCP Server 收到 DHCP REQUEST 包時,會根據 REQUEST 包中攜帶的 Client 的 MAC 來查找是否有相應的租約記錄,如果有則廣播一個 DHCP ACK 包,仍然還是廣播,因爲 Client 的地址還是未知的。其中,包的內容包含分配的 IP 地址、租約時間等確定的信息。

當 Client 收到包之後,並不會立馬使用,詳細解釋見 DHCP DECLINE 包的部分。

⑤ 服務端拒絕本次租約:發送 DHCP NAK 包

DHCP Server 可能存在這種情況:待分配的 IP 無法使用了,或者與 DHCP Client 的 MAC 無法對應,這個時候,DHCP Server 就會發送 DHCP  NAK 包給 Client,表示:這個 IP 目前異常,不能分配給你了。

⑥ 客戶端不再使用該 IP 地址,發送 DHCP RELEASE 包

但 Client 不再使用已分配的 IP 地址時,會主動向 DHCP Server 發送一個 DHCP RELEASE 的單播包,告訴 Server 我不再使用該地址了,你可以釋放相關的租約信息了。

⑦ 客戶端發現地址衝突不可用,發送 DHCP DECLINE 包

在 Client 收到 DHCP ACK 包之後,它並不會立即就使用。因爲網絡當中可能存在多臺 Client 同時在請求地址,這勢必會造成信息的不同步,也就是說可能當前 Client 分配的 IP 可能被其他 Client 分配了。

所以當前 Client 收到 ACK 包之後,會通過發送 ARP 請求來檢查地址是否衝突(會發送三次 ARP),如果出現衝突了,表明該地址不能使用了,遂向 DHCP Server 發送 DHCP DECLINE 的單播包,並重新進入 DHCP DISCOVER 的流程。DHCP Server 端也會顯示該 IP 地址爲 BAD_ADDRESS,避免被再次分配。

⑧ 客戶端想獲取除 IP 外更爲詳細的網絡信息,發送 DHCP INFORM 包

以上所有的包類型,一般只是針對主機的 IP 地址進行分配,當然,DHCP 是可以提供更多的網絡信息的,比如網關地址、DNS 服務器地址等等,這些信息一般就是通過 DHCP INFORM 消息單獨獲得,當 DHCP Server 收到該報文時,會查詢相關的租約信息,找到相應的配置信息後,發送 DHCP ACK 報文給到 Client。

OK,以上就是 8 種消息的交互流程,及可能出現的場景,有些消息通過抓包一探了究竟,下面看看報文格式具體長啥樣,讓大家有更直觀的認識。

05 DHCP 報文格式長啥樣

DHCP 有一個前身協議,叫 BOOTP,DHCP 擴展了 BOOTP 的報文格式。BOOTP 是最早用於分配 IP 地址的協議,常用於無盤工作站的局域網中。DHCP 爲了和它保持兼容,就選擇在它的基礎上進行擴展。

其中:

  • Op:分別表示請求(1)or 應答(2)

  • HW 類型:二層類型值,比如以太網,值爲 1

  • HW 長度:表示硬件(MAC)地址的長度,以太網值爲6

  • 跳步數:記錄消息傳輸過程中的中繼次數,發送方將該值置爲 0,每次中繼時遞增

  • 事務ID:Client 產生的一個隨機數,用於標識當前的事務,Server 響應時需要攜帶同樣的 ID,將請求和響應進行匹配

  • 秒數:Client 進行設置,表示第一次嘗試申請或重新申請地址經過的秒數,用於地址租約

  • 標誌:廣播標誌,表示 Client 只能處理廣播包

  • ciaddr:Client IP 地址,如果未知,就是 0.0.0.0

  • yiaddr:“你的”IP 地址,Server 向 Client 提供的 IP 地址

  • siaddr:(下一)服務器 IP 地址,這個用於 Client 的自舉過程

  • giaddr:網關(中繼)IP 地址,這個地址一般由 DHCP 中繼填寫(如果有),它們在轉發 DHCP 消息時填寫

  • chaddr:Client 硬件地址,標識一個唯一的 Client,Server 利用它可以爲同一個 Client 每次的請求分配同一個 IP 地址

  • sname:服務器名,非必須填寫,可附到 options 字段中

  • bootfile:引導文件名,非必須填寫,可附到 options 字段中

  • options:選項字段,長度可變,有多種選項,其中選項 53 就用於標識上述的各種消息

常見的選項有:

填充(0)、子網掩碼(1)、路由器地址(3)、域名服務器(6)、域名(15)、請求的 IP 地址(50)、地址租用期(51)、 DHCP 消息類型(53) 、服務器標識符(54)、DHCP 錯誤消息(56)、租約更新時間(58)、租約重新綁定時間(59)、客戶機標識符(61)和結束(255)。

其中,DHCP 消息類型(53)就指代上面提到的各種消息,如:DHCP DISCOVER(1)、DHCP OFFER(2)、DHCP REQUEST(3)、DHCP DECLINE、(4)DHCP ACK(5)、DHCP NAK(6)、DHCP RELEASE(7)、DHCP INFORM(8)等。

06 DHCP 中繼

DHCP 消息交互過程中,全程都是使用的 UDP 廣播通信。這就問題來了:

如果 DHCP 服務器和客戶端不是在同一個子網內,而路由器又不能轉發廣播包,這個時候該怎麼辦呢?難道每個子網都要配一個 DHCP 服務器嗎?這顯然不合常理。

爲了解決這一問題,就出現了 DHCP 中繼代理。

DHCP 中繼解決了跨越多個網段申請 IP 地址的問題,對不同網段的 IP 地址分配可以只由一個 DHCP 服務器進行統一管理和運維。

每個網段可以設置一個 DHCP 中繼(可以在路由器上設或者直接在主機上配置),它可以配置 DHCP 服務器的地址,這樣通過中繼代理即可完成和 DHCP 服務器之間的交互(通過選項字段來標識 DHCP 中繼的信息)。

具體地,當 DHCP 中繼收到 DHCP Client 發來的廣播請求包(DHCP 只中繼廣播包),由於事先配置好了 DHCP Server 的地址,所以 DHCP 中繼發送單播包給到 DHCP  Server,Server 收到包之後再向 DHCP 中繼響應,由於之前 DHCP 中繼接收請求包時已經記錄下 Client 的 MAC 地址,所以這時直接將包轉發給 DHCP Client。

由此,通過 DHCP 中繼即可完成了跨不同網絡的 IP 地址申請(實際上,DHCP 中繼遠比上面描述的要複雜,比如二層中繼和三層中繼等,大家有興趣可以進一步查閱相關資料瞭解)。

07 DHCP 的問題

一定程度上說,DHCP  服務器就是個活雷鋒,爲網絡上的設備提供公共服務,掌握了很大的公共權力,一些黑客就比較青睞這種角色,如果攻陷了 DHCP 服務器,自己也相應獲取了 DHCP 服務器的權力。

比較典型的攻擊還是泛洪攻擊,攻擊者可以不斷髮出 DHCP 請求,冒充新入網的客戶端,這樣,DHCP 服務器的地址池就會被耗幹,無法爲正常的用戶提供服務。接着攻擊者可能繼續下連環套,從 DHCP 服務器騙取了大量 IP 地址,自己就可以裝扮成新的 DHCP 服務器,將騙來的地址分配給 DHCP 客戶端,從而控制客戶端。

進一步,還有更危險的,因爲 DHCP 還能提供其他的網絡信息,比如 DNS 服務器地址和網關地址,攻擊者就可以讓自己成爲 DNS 服務器或者網關,於是,客戶端的域名解析和外網通信,都必須經過攻擊者的電腦。這個時候,攻擊者的權限就很大了,它可以偷聽通信、僞裝、假扮成某個域名的網站,比如說,攻擊者可以篡改域名解析,讓你在訪問 www.baidu.com 的時候,實際上訪問的是攻擊者提供的一個網頁。當你在這個網頁上輸入用戶名和密碼時,信息就會泄露給攻擊者。

DHCP 攻擊讓人防不勝防。DHCP 協議在設計中並沒有考慮到安全性的問題,所以很難從軟件上杜絕 DHCP 攻擊。某些品牌的交換機上,可以指定特定端口給合法的DHCP 服務器,以免其他人僞裝。當然,最重要的保護方式,還是防止攻擊者連入局域網。

08 DHCP 使用到了哪些工具

首先是 Windows 上的工具,主要是 ipconfig

  • ipconfig /all 查看 DHCP 分配到的所有網絡信息

  • ipconfig /release 釋放 DHCP 租約

  • ipconfig /renew 獲取/更新 DHCP 租約

Linux 上,主要是 dhclient 工具:

  • dhclient 獲取/更新 DHCP 租約

  • dhclient -r 釋放 DHCP 租約

09 總結

本文從 DHCP 的工作機制、報文格式、交互的消息報文到 DHCP 中繼、存在的問題,再到用戶可以用到的配置工具,全面地介紹了 DHCP 協議。DHCP 是針對的 IPv4 地址,IPv6 則是 DHCPv6,和 DHCP 有些許的不同,這塊就留作後面的文章再來講解。


參考:

極客時間《趣談網絡協議專欄》

《TCP/IP 協議詳解卷一》

https://mp.weixin.qq.com/s/RC5usdL7SkAzck10H8vSM

後臺回覆“加羣”,帶你進入高手如雲交流羣


推薦閱讀:
不想裝系統?這8個網站讓你在線體驗 Linux

10個工具搞定Linux性能分析

11個步驟完美排查Linux機器是否已經被入侵

超讚,極客時間竟然可以免費學了

HTTP/3 原理實戰

Linux 下10個幫助你調試的命令

Nginx爲什麼快到根本停不下來?

OVS 和 OVS-DPDK 對比

微軟出品的最新K8S學習指南3.0下載
瞭解HTTPS工作原理,看這一篇就夠了
值得收藏的14個Linux下CPU監控工具

Linux 硬盤結構長啥樣,瞭解一下

謹慎使用的 Linux 命令

史上最硬核的Linux依賴問題解決方案
一文搞懂HTTP+TCP的長連接和短連接

正確理解CPU使用率和平均負載的關係

和麪試官之間關於操作系統的一場對弈

Linux 系統 UDP 丟包問題分析思路
▼

喜歡,就給我一個“在看”

10T 技術資源大放送!包括但不限於:雲計算、虛擬化、微服務、大數據、網絡、Linux、Docker、Kubernetes、Python、Go、C/C++、Shell、PPT 等。在公衆號內回覆「1024」,即可免費獲取!!
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章