《Linux就該這麼學》第十四章_使用DHCP動態管理主機地址
《Linux就該這麼學》
第十四章
本章講解動態主機配置協議(DHCP,Dynamic Host Configuration Protocol),該協議用於自動管理區域網內主機的IP地址、子網掩碼、閘道器地址及DNS地址等引數,可以有效地提升IP地址的利用率,提高配置效率,並降低管理與維護成本。
本章詳細講解了在Linux系統中配置部署dhcpd服務程式的方法,剖析了dhcpd服務程式配置檔案內每個引數的作用,並通過自動分配IP地址、繫結IP地址與MAC地址等實驗,讓各位讀者更直觀地體會DHCP的強大之處。
14.1 動態主機地址管理協議
動態主機配置協議(DHCP)是一種基於UDP協議且僅限於在區域網內部使用的網路協議,主要用於大型的區域網環境或者存在較多移動辦公裝置的區域網環境中,用途是為區域網內部的裝置或網路供應商自動分配IP地址等引數,提供網路配置的“全家桶”服務。
簡單來說,DHCP就是讓區域網中的主機自動獲得網路引數的服務。在圖14-1所示的拓撲圖中存在多臺主機,如果手動配置每臺主機的網路引數會相當麻煩,日後維護起來也讓人頭大。而且當機房內的主機數量進一步增加時(比如有100臺,甚至1000臺),這個手動配置以及維護工作的工作量足以讓運維人員崩潰。藉助於DHCP,不僅可以為主機自動分配網路引數,還可以確保主機使用的IP地址是唯一的,更重要的是,還能為特定主機分配固定的IP地址。
DHCP的應用十分廣泛,無論是伺服器機房還是家庭、機場、咖啡館,都會見到它的身影。比如,本書的某位讀者開了一家咖啡廳,在為顧客提供咖啡的同時,還為顧客免費提供無線上網服務。這樣一來,顧客就可以一邊愜意地喝著咖啡,一邊連著無線網路刷朋友圈了。但是,作為咖啡廳老闆的您,肯定不希望(也沒有時間)為每一位造訪的顧客手動設定IP地址、子網掩碼、閘道器地址等資訊。另外,考慮到咖啡館使用的內網網段一般為192.168.10.0/24(C類私有地址),最多能容納的主機數為200多臺。而咖啡廳一天的客流量肯定不止200人。如果採用手動方式為他們分配IP地址,則當他們在離開咖啡廳時並不會自動釋放這個IP地址,這就可能出現IP地址不夠用的情況。這一方面會造成IP地址的浪費,另外一方面也增加了IP地址的管理成本。而使用DHCP,這一切都迎刃而解—老闆只需安心服務好顧客,為其提供美味的咖啡;顧客通過執行DHCP的伺服器自動獲得上網所需的IP地址,等離開咖啡廳時IP地址將被DHCP伺服器收回,以備其他顧客使用。
圖14-1 DHCP協議的拓撲示意圖
既然確定在今後的生產環境中肯定離不開DHCP了,那麼也就有必要好好地熟悉一下DHCP涉及的常見術語了。
作用域:一個完整的IP地址段,DHCP根據作用域來管理網路的分佈、IP地址的分配及其他配置引數。
超級作用域:用於管理處於同一個物理網路中的多個邏輯子網段,它包含了可以統一管理的作用域列表。
排除範圍:把作用域中的某些IP地址排除,確保這些IP地址不會分配給DHCP客戶端。
地址池:在定義了DHCP的作用域並應用了排除範圍後,剩餘的用來動態分配給客戶端的IP地址範圍。
租約:DHCP客戶端能夠使用動態分配的IP地址的時間。
預約:保證網路中的特定裝置總是獲取到相同的IP地址。
14.2 部署dhcpd服務程式
dhcpd是Linux系統中用於提供DHCP的服務程式。儘管DHCP的功能十分強大,但是dhcpd服務程式的配置步驟卻十分簡單,這也在很大程度上降低了在Linux中實現動態主機管理服務的門檻。
在確認軟體倉庫配置妥當之後,安裝dhcpd服務程式,其軟體包名稱為dhcp-server:
[root@linuxprobe ~]# dnf install -y dhcp-server
Updating Subscription Management repositories.
Unable to read consumer identity
This system is not registered to Red Hat Subscription Management. You can use subscription-manager to register.
AppStream 3.1 MB/s | 3.2 kB 00:00
BaseOS 2.7 MB/s | 2.7 kB 00:00
Dependencies resolved.
========================================================================================
Package Arch Version Repository Size
========================================================================================
Installing:
dhcp-server x86_64 12:4.3.6-30.el8 BaseOS 529 k
Transaction Summary
========================================================================================
Install 1 Package
………………省略部分輸出資訊………………
Installed:
dhcp-server-12:4.3.6-30.el8.x86_64
Complete!
檢視dhcpd服務程式的配置檔案內容:
[root@linuxprobe ~]# cat /etc/dhcp/dhcpd.conf
#
# DHCP Server Configuration file.
# see /usr/share/doc/dhcp-server/dhcpd.conf.example
# see dhcpd.conf(5) man page
#
是的,您沒有看錯!dhcp的服務程式的配置檔案中只有3行註釋語句,這意味著我們需要自行編寫這個檔案。如果讀者不知道怎麼編寫,可以看一下配置檔案中第2行的參考示例檔案,其組成架構如圖14-2所示。
圖14-2 dhcpd服務程式配置檔案的架構
一個標準的配置檔案應該包括全域性配置引數、子網網段宣告、地址配置選項以及地址配置引數。其中,全域性配置引數用於定義dhcpd服務程式的整體執行引數;子網網段宣告用於配置整個子網段的地址屬性。
考慮到dhcpd服務程式配置檔案的可用引數比較多,這裡挑選了最常用的引數(見表14-1),並逐一進行了簡單介紹,以便為接下來的實驗打好基礎。
表14-1 dhcpd服務程式配置檔案中使用的常見引數以及作用
引數 | 作用 |
---|---|
ddns-update-style 型別 | 定義DNS服務動態更新的型別,型別包括: none(不支援動態更新)、interim(互動更新模式)與ad-hoc(特殊更新模式) |
allow/ignore client-updates | 允許/忽略客戶端更新DNS記錄 |
default-lease-time 21600 | 預設超時時間 |
max-lease-time 43200 | 最大超時時間 |
option domain-name-servers 8.8.8.8 | 定義DNS伺服器地址 |
option domain-name "domain.org" | 定義DNS域名 |
range | 定義用於分配的IP地址池 |
option subnet-mask | 定義客戶端的子網掩碼 |
option routers | 定義客戶端的閘道器地址 |
broadcast-address 廣播地址 | 定義客戶端的廣播地址 |
ntp-server IP地址 | 定義客戶端的網路時間伺服器(NTP) |
nis-servers IP地址 | 定義客戶端的NIS域伺服器的地址 |
hardware 硬體型別 MAC地址 | 指定網絡卡介面的型別與MAC地址 |
server-name 主機名 | 向DHCP客戶端通知DHCP伺服器的主機名 |
fixed-address IP地址 | 將某個固定的IP地址分配給指定主機 |
time-offset 偏移差 | 指定客戶端與格林尼治時間的偏移差 |
14.3 自動管理IP地址
DHCP的設計初衷是為了更高效地集中管理區域網內的IP地址資源。DHCP伺服器會自動把IP地址、子網掩碼、閘道器、DNS地址等網路資訊分配給有需要的客戶端,而且當客戶端的租約時間到期後還可以自動回收所分配的IP地址,以便交給新加入的客戶端。
為了讓實驗更有挑戰性,來模擬一個真實生產環境的需求:
“機房運營部門:明天會有100名學員自帶膝上型電腦來我司培訓學習,請保證他們能夠使用機房的本地DHCP伺服器自動獲取IP地址並正常上網”。
機房所用的網路地址及引數資訊如表14-2所示。
表14-2 機房所用的網路地址以及引數資訊
引數名稱 | 值 |
---|---|
預設租約時間 | 21600秒 |
最大租約時間 | 43200秒 |
IP地址範圍 | 192.168.10.50~192.168.10.150 |
子網掩碼 | 255.255.255.0 |
閘道器地址 | 192.168.10.1 |
DNS伺服器地址 | 192.168.10.1 |
搜尋域 | linuxprobe.com |
在瞭解了真實需求以及機房網路中的配置引數之後,按照表14-3來配置DHCP伺服器以及客戶端。
表14-3 DHCP伺服器以及客戶端的配置資訊
主機型別 | 作業系統 | IP地址 |
---|---|---|
DHCP伺服器 | RHEL 8 | 192.168.10.1 |
DHCP客戶端 | Windows 10 | DHCP自動獲取地址 |
前文講到,作用域一般是個完整的IP地址段,而地址池中的IP地址才是真正供客戶端使用的,因此地址池應該小於或等於作用域的IP地址範圍。另外,由於VMware Workstation虛擬機器軟體自帶DHCP服務,為了避免與自己配置的dhcpd服務程式產生衝突,應該先按照圖14-3和圖14-4將虛擬機器軟體自帶的DHCP功能關閉。
圖14-3 單擊虛擬機器軟體的“虛擬網路編輯器”選單
圖14-4 關閉虛擬機器自帶的DHCP功能
可隨意開啟幾臺客戶端,準備進行驗證。但是一定要注意,DHCP客戶端與伺服器需要處於同一種網路模式—僅主機模式(Hostonly),否則就會產生物理隔離,從而無法獲取IP地址。建議開啟1~3臺客戶端虛擬機器驗證一下效果就好,以免物理主機的CPU和記憶體的負載太高。
在確認DHCP伺服器的IP地址等網路資訊配置妥當後,就可以配置dhcpd服務程式了。請注意,在配置dhcpd服務程式時,配置檔案中的每行引數後面都需要以分號(;)結尾,這是規定。另外,dhcpd服務程式配置檔案內的引數都十分重要,因此在表14-4中羅列出了每一行引數,並對其用途進行了簡單介紹。
[root@linuxprobe ~]# vim /etc/dhcp/dhcpd.conf
ddns-update-style none;
ignore client-updates;
subnet 192.168.10.0 netmask 255.255.255.0 {
range 192.168.10.50 192.168.10.150;
option subnet-mask 255.255.255.0;
option routers 192.168.10.1;
option domain-name "linuxprobe.com";
option domain-name-servers 192.168.10.1;
default-lease-time 21600;
max-lease-time 43200;
}
表14-4 dhcpd服務程式配置檔案中使用的引數以及作用
引數 | 作用 |
---|---|
ddns-update-style none; | 設定DNS服務不自動進行動態更新 |
ignore client-updates; | 忽略客戶端更新DNS記錄 |
subnet 192.168.10.0 netmask 255.255.255.0 { | 作用域為192.168.10.0/24網段 |
range 192.168.10.50 192.168.10.150; | IP地址池為192.168.10.50-150(約100個IP地址) |
option subnet-mask 255.255.255.0; | 定義客戶端預設的子網掩碼 |
option routers 192.168.10.1; | 定義客戶端的閘道器地址 |
option domain-name "linuxprobe.com"; | 定義預設的搜尋域 |
option domain-name-servers 192.168.10.1; | 定義客戶端的DNS地址 |
default-lease-time 21600; | 定義預設租約時間(單位:秒) |
max-lease-time 43200; | 定義最大預約時間(單位:秒) |
} | 結束符 |
在紅帽認證考試以及生產環境中,都需要把配置過的dhcpd服務加入到開機啟動項中,以確保當伺服器下次開機後dhcpd服務依然能自動啟動,並順利地為客戶端分配IP地址等資訊。真心建議大家能養成“配置好服務程式,順手加入開機啟動項”的好習慣。
[root@linuxprobe ~]# systemctl start dhcpd
[root@linuxprobe ~]# systemctl enable dhcpd
Created symlink /etc/systemd/system/multi-user.target.wants/dhcpd.service → /usr/lib/systemd/system/dhcpd.service.
把dhcpd服務程式配置妥當之後就可以開啟客戶端來檢驗IP分配效果了。在日常工作中,Windows 10是主流的桌面作業系統,所以只要確保兩個主機都處於同一個網路模式內,然後像如圖14-5那樣設定Windows系統的網路為DHCP模式,再稍等片刻即可自動獲取到網絡卡資訊了,如圖14-6所示。特別方便!
圖14-5 設定網絡卡模式
圖14-6 自動獲取到IP地址
如果是在生產環境中配置dhcpd服務,則有可能會因為DHCP沒有被防火牆放行而導致失敗,此時執行下面的命令即可:
[root@linuxprobe ~]# firewall-cmd --zone=public --permanent --add-service=dhcp
success
[root@linuxprobe ~]# firewall-cmd --reload
success
在正常情況下,DHCP的運作會經歷4個過程:請求、提供、選擇和確認。當客戶端順利獲得一個IP地址及相關的網路資訊後,就會發送一個ARP(Address Resolution Protocol,地址解析協議)請求給伺服器。在dhcpd服務程式收到這條資訊後,不會再把這個IP地址分配給其他主機,從根源上避免了IP地址衝突的情況。
14.4 分配固定IP地址
在DHCP協議中有個術語是“預約”,它用來確保區域網中特定的裝置總是獲取到固定的IP地址。換句話說,就是dhcpd服務程式會把某個IP地址私藏下來,只將其用於相匹配的特定裝置。這有點像高檔餐廳的預約服務,雖然客人還沒有到場,但是桌子上會放個寫著“已預定”的小牌子。
要想把某個IP地址與某臺主機進行繫結,就需要用到這臺主機的MAC地址。這個MAC地址即網絡卡上一串獨立的識別符號,具備唯一性,因此不會存在衝突的情況。在Linux系統中檢視MAC地址的示例如圖14-7所示,在Windows系統中查MAC地址的示例如圖14-8所示。
圖14-7 在Linux系統中檢視網絡卡MAC地址
圖14-8 在Windows系統中檢視網絡卡MAC地址
在Linux系統或Windows系統中,都可以通過檢視網路的狀態來獲知主機的MAC地址。在dhcpd服務程式的配置檔案中,按照如下格式將IP地址與MAC地址進行繫結。
host 主機名稱 { | ||||
---|---|---|---|---|
hardware | ethernet | 該主機的MAC地址; | ||
fixed-address | 欲指定的IP地址; | |||
} |
如果不方便檢視主機的MAC地址,該怎麼辦呢?比如,要給老闆使用的主機繫結IP地址,總不能隨便就去檢視老闆的主機資訊吧。針對這種情況,這裡告訴大家一個好辦法。我們首先啟動dhcpd服務程式,為老闆的主機分配一個IP地址,這樣就會在DHCP伺服器本地的日誌檔案中儲存這次的IP地址分配記錄。然後檢視日誌檔案,就可以獲悉主機的MAC地址了(即下面加粗的內容)。
[root@linuxprobe ~]# tail -f /var/log/messages
………………省略部分輸出資訊………………
Mar 22 00:28:54 linuxprobe cupsd[1206]: REQUEST linuxprobe.com- - "POST / HTTP/1.1" 200 183 Renew-Subscription client-error-not-found
Mar 22 00:29:35 linuxprobe dhcpd[30959]: DHCPREQUEST for 192.168.10.50 from 00:0c:29:dd:f2:22 (DESKTOP-3OGV50E) via ens160
Mar 22 00:29:35 linuxprobe dhcpd[30959]: DHCPACK on 192.168.10.50 to 00:0c:29:dd:f2:22 (DESKTOP-3OGV50E) via ens160
之前劉遄老師線上下講課時,講完DHCP服務後總會看到有些學員在撓頭。起初我很不理解,畢竟dhcpd服務程式是Linux系統中一個很簡單的實驗,總共就那麼十幾行的配置引數,大家還能寫錯?後來發現了原因—有些學員是以Windows系統為物件進行的IP與MAC地址的繫結實驗。而在Windows系統中看到的MAC地址,其格式類似於00-0c-29-dd-f2-22,間隔符為減號(-)。但是在Linux系統中,MAC地址的間隔符則變成了冒號(:)。
[root@linuxprobe ~]# vim /etc/dhcp/dhcpd.conf
ddns-update-style none;
ignore client-updates;
subnet 192.168.10.0 netmask 255.255.255.0 {
range 192.168.10.50 192.168.10.150;
option subnet-mask 255.255.255.0;
option routers 192.168.10.1;
option domain-name "linuxprobe.com";
option domain-name-servers 192.168.10.1;
default-lease-time 21600;
max-lease-time 43200;
host linuxprobe {
hardware ethernet 00:0c:29:dd:f2:22;
fixed-address 192.168.10.88;
}
}
確認引數填寫正確後就可以儲存並退出配置檔案,然後就可以重啟dhcpd服務程式了。
[root@linuxprobe ~]# systemctl restart dhcpd
需要說明的是,如果您剛剛為這臺主機分配了IP地址,由於它的IP地址租約時間還沒有到期,因此不會立即換成新繫結的IP地址。要想立即檢視繫結效果,則需要重啟一下客戶端的網路服務,如圖14-9所示。
圖14-9 重啟網絡卡裝置
然後就能看到效果了,如圖14-10所示。
圖14-10 檢視繫結後的網絡卡資訊