導讀 | DHCP(Dynamic Host Configuration Protocol,動態主機配置協議)是一個局域網的網絡協議,使用UDP協議工作, 主要有兩個用途:給內部網絡或網絡服務供應商自動分配IP地址、子網掩碼、網關以及DNS、(網絡批量安裝)等tcp/ip信息,給用戶或者內部網絡管理員作為對所有計算機作中央管理的方法。 |

A:客戶端進行IP請求
當一個DHCP客戶機啟動時,會自動將自己的IP地址配置成0.0.0.0,由於使用0.0.0.0不能進行正常通信,所以客戶機就必須通過DHCP服務器來獲取一個合法的地址。由於客戶機不知道DHCP服務器的IP地址,所以它使用0.0.0.0的地址作為源地址,使用UDP68端口作為源端口,使用255.255.255.255作為目標地址,使用UDP67端口作為目的端口來廣播請求IP地址信息。廣播信息中包含了DHCP客戶機的MAC地址和計算機名,以便使DHCP服務器能確定是哪個客戶機發送的請求。
B:服務器響應
當DHCP服務器接收到客戶機請求IP地址的信息時,它就在自己的IP地址池中查找是否有合法的IP地址提供給客戶機。如果有,DHCP服務器就將此IP地址做上標記,加入到DHCPOFFER的消息中,然后DHCP服務器就廣播一則包括下列信息的DHCPOFFER消息:DHCP客戶機的MAC地址;DHCP服務器提供的合法IP地址;子網掩碼;默認網關(路由);租約的期限;DHCP服務器的IP地址。因為DHCP客戶機還沒有IP地址,所以DHCP服務器使用自己的IP地址作為源地址,使用UDP67端口作為源端口,使用255.255.255.255作為目標地址,使用UDP68端口作為目的端口來廣播DHCPOFFER信息。
C:客戶機選擇IP
DHCP客戶機從接收到的第一個DHCPOFFER消息中選擇IP地址,發出IP地址的DHCP服務器將該地址保留,這樣該地址就不能提供給另一個DHCP客戶機。當客戶機從第一個DHCP服務器接收DHCPOFFER並選擇IP地址后,DHCP租約的第三過程發生。客戶機將DHCPREQUEST消息廣播到所有的DHCP服務器,表明它接受提供的內容。DHCPREQUEST消息包括為該客戶機提供IP配置的服務器的服務標識符(IP地址)。DHCP服務器查看服務器標識符字段,以確定它自己是否被選擇為指定的客戶機提供IP地址,如果那些DHCPOFFER被拒絕,則DHCP服務器會取消提供並保留其IP地址以用於下一個IP租約請求。
在客戶機選擇IP的過程中,雖然客戶機選擇了IP地址,但是還沒有配置IP地址,而在一個網絡中可能有幾個DHCP服務器,所以客戶機仍然使用0.0.0.0的地址作為源地址,使用UDP68端口作為源端口,使用255.255.255.255作為目標地址,使用UDP67端口作為目的端口來廣播DHCPREQUEST信息。
D:服務器確認租約
DHCP服務器接收到DHCPREQUEST消息后,以DHCPACK消息的形式向客戶機廣播成功的確認,該消息包含有IP地址的有效租約和其他可能配置的信息。雖然服務器確認了客戶機的租約請求,但是客戶機還沒有收到服務器的DHCPACK消息,所以服務器仍然使用自己的IP地址作為源地址,使用UDP67端口作為源端口,使用255.255.255.255作為目標地址,使用UDP68端口作為目的端口來廣播DHCPACK信息。當客戶機收到DHCPACK消息時,它就配置了IP地址,完成了TCP/IP的初始化。
如果DHCPREQUEST不成功,例如客戶機試圖租約先前的IP地址,但該IP地址不再可用,或者因為客戶機移到其他子網,該IP無效時,DHCP服務器將廣播否定確認消息DHCPNACK。當客戶機接收到不成功的確認時,它將重新開始DHCP租約過程。
DHCP客戶機會在租期過去50%的時候,直接向為其提供IP地址的DHCP服務器發送DHCPREQUEST消息包。如果客戶機接收到該服務器回應的DHCPACK消息包,客戶機就根據包中所提供的新的租期以及其它已經更新的TCP/IP參數,更新自己的配置,IP租用更新完成。如果沒有收到該服務器的回復,則客戶機繼續使用現有的IP地址,因為當前租期還有50%。
如果在租期過去50%的時候沒有更新,則DHCP客戶機將在租期過去75%的時候再次向為其提供IP地址的DHCP服務器聯系。如果還不成功,到租約的100%時候,DHCP客戶機必須放棄這個IP地址,重新申請。如果此時無DHCP服務器可用,DHCP客戶機會使用169.254.0.0/16中隨機的一個地址,並且每隔5分鍾再進行嘗試。
LINUX DHCP 服務配置詳解
安裝軟件包
yum install -y dhcp
yum install -y dhcp-common
yum install -y dhcp-lib
dhcp包包含的主要文件
rpm -ql dhcp #查看dhcp包安裝了哪些文件和程序
/etc/dhcpd.conf #主配置文件
/etc/rc.d/init.d/dhcpd #服務啟動腳本
/etc/rc.d/init.d/dhcrelay #繼dhcp服務啟動腳本
/etc/sysconfig/dhcpd #次要配置文件
/etc/sysconfig/dhcrelay
/usr/share/doc/dhcp-4.2.5/dhcpd.conf.example #示例文件
/ust/lib/systemd/system/dhcpd.services # 服務啟動腳本 systemctl start dhcpd
/var/lib/dhcpd/dhcpd.leases #租約信息存放的文件
客戶機和服務器配置文件
/var/lib/dhclient/dhclient.leases #客戶端租約文件
/var/lib/dhcpd/dhcpd.leases #服務器端的租約文件在
/etc/dhcp/dhcpd.conf #dhcp配置文件
服務端口對應配置文件
cat /etc/services #linux下基本服務的端口,協議,描述等信息。
http 80/tcp www www-http # WorldWideWeb HTTP httpd服務
bootps 67/tcp # BOOTP server 這就是dhcp服務端口
bootps 67/udp ##是dhcp服務
常用命令
systemctl start dhcp
systemctl stop dhcpd
配置dhcp服務器
配置文件都放在/etc/dhcp目錄下,主配置文件為dhcpd.conf
- 編寫dhcpd.conf (可以復制dhcpd.conf.example模板文件來修改,也可以直接編輯dhcpd.conf)
-
## 1、拷貝示例文件覆蓋原來的空文件。通過rpm -ql dhcp查看自己模板配置文件(不一定和我一樣的版本)
-
cp /usr/share/doc/dhcp-
4.
2.
5/dhcpd.conf.example /etc/dhcp/dhcpd.conf
-
-
## 2、預先處理,去掉 注釋和空行,保留 生效語句,和可選語句。
-
sed -ri '/(^#[[:space:]]+|^#$|^$)/{d}' /etc/dhcp/dhcpd.conf
刪除沒用的那些行,保留內容如下:
-
主配置文件樣板:
-
-
#ddns-update-style none;
-
#authoritative;
-
log-facility
local7;
-
-
subnet
10.1
.1
.0
netmask
255.255
.255
.0 {
-
range
10.1
.1
.100
10.1
.1
.200
;
##地址池
-
option
domain-name-servers
202.96
.128
.166
;
##DNS服務器地址
-
option
domain-name
"class.com"
;
##域名
-
option
routers
10.1
.1
.1
;
##默認路由
-
option
broadcast-address
10.1
.1
.255
;
##廣播地址
-
default-lease-time
300
;
##默認租約時間
-
max-lease-time
7200
;
##最大租約時間
-
}
-
注意:dhcp服務器必須要有一張網卡在10.1.1.0/24網絡,並且它只會給這張網卡所在網絡(廣播域)主機分配ip。
- 一個dhcp服務器給多局域網提供服務
1、先將兩張網卡接入兩個不同網絡,並設置靜態ip
2、修改配置文件/etc/dhcp/dhcpd.conf 如下:
-
#ddns-update-style none;
-
#authoritative;
-
log-facility
local7;
-
-
subnet
10.1
.1
.0
netmask
255.255
.255
.0 {
-
range
10.1
.1
.100
10.1
.1
.200
;
##地址池
-
option
domain-name-servers
202.96
.128
.166
;
##DNS服務器地址
-
option
domain-name
"class.com"
;
##域名
-
option
routers
10.1
.1
.1
;
##默認路由
-
option
broadcast-address
10.1
.1
.255
;
##廣播地址
-
default-lease-time
300
;
##默認租約時間
-
max-lease-time
7200
;
##最大租約時間
-
}
-
-
subnet
192.168
.100
.0
netmask
255.255
.255
.0 {
-
range
192.168
.100
.3
192.168
.100
.100
;
##地址池
-
option
domain-name-servers
202.96
.128
.166
;
##DNS服務器地址
-
option
domain-name
"class.com"
;
##域名
-
option
routers
192.168
.100
.1
;
##默認路由
-
option
broadcast-address
192.168
.100
.255
;
##廣播地址
-
default-lease-time
300
;
##默認租約時間
-
max-lease-time
7200
;
##最大租約時間
-
}
-
小結:系統在收到dhcp請求時,會看是哪張網卡收到的請求,根據該網卡的ip地址選擇對應配置文件里的地址池給對應網絡主機分配地址。
mac綁定ip (嵌套一段就好)
-
#ddns-update-style none;
-
#authoritative;
-
log-facility
local7;
-
-
subnet
10.1
.1
.0
netmask
255.255
.255
.0 {
-
range
10.1
.1
.100
10.1
.1
.200
;
##地址池
-
option
domain-name-servers
202.96
.128
.166
;
##DNS服務器地址
-
option
domain-name
"class.com"
;
##域名
-
option
routers
10.1
.1
.1
;
##默認路由
-
option
broadcast-address
10.1
.1
.255
;
##廣播地址
-
default-lease-time
300
;
##默認租約時間
-
max-lease-time
7200
;
##最大租約時間
-
-
host
serverftp {
## 備注名稱,可以自行定義。
-
hardware
ethernet
12
:34:56:78:AB:CD;
##靜態綁定mac和ip
-
fixed-address
10.1
.1
.5
;
-
}
-
}
dhcp配置文件中下面配置作用:客戶機通過dhcp獲得dns域名和IP地址,並且將dns--ip 保存到/etc/resolv.conf中!
option domain-name-servers 202.96.128.166; ##DNS服務器地址
option domain-name "class.com"; ##域名
客戶機/etc/resolv.conf配置文件
; generated by /usr/sbin/dhclient-script ##腳本加載客戶端租約文件/var/lib/dhclient/dhclient.leases
search localdomain ##dhcp分配的dns域名
nameserver 192.168.109.2 ##dhcp分配的dns服務器的ip
默認租約時間 與 最大租約時間
注意:這里的時間都是utc時間,比如我們是15:00獲取的ip 配置文件里顯示的是07:00,比北京時間少8小時
客戶機續約過程如下:
假如:默認使用 10 小時租約期 ,10小時內續約,可以繼續使用該IP地址。
1、在線:第5小時找一次dhcp自動續約
2、(1請求失敗)8.5小時的時候,再嘗試
3、(2請求失敗)找別的dhcp服務器
4、(3請求失敗)繼續使用原先的IP地址,直到過期。根據默認租約期限
####服務器的 /var/lib/dhcpd/dhcpd.lease 信息文件。
starts 起始時間點:
ends 結束(過期時間點):
相隔時間= default-lease-time 的設置。
(從這個時間間隔中可以推測出下一次該IP地址的續約時間。)
#### 客戶端的 /var/lib/dhclient/dhcpd-eth0.lease 信息文件。
得到的資源信息:
renew:下一次去找dhcpd服務器續約的時間點。 = 租約時間的50%
rebind:renew失敗后,重試的時間點。 =租約時間的 85% 左右
expire:過期的時間點
每次續約成功,就會更新一次 /var/lib/dhclient/dhcpd-eth0.lease 租約文件。
最大租約期限
max-lease-time 43200; 最大租約時間(秒)12小時
說明:最大和默認租約時間,機制一樣,在客戶端沒有特殊的租約時間請求的時候,都會
統一的指 派默認租約時間(多數情況)。 如果客戶端請求了自定義的租約時間,服務器將會啟用最大租約時
間作為限制,客戶端自己請求的租約時間不能大於該值。max time
自定義 日志輸出路徑和級別
update /etc/rsyslog.conf file
# Save boot messages also to boot.log
local7.* /var/log/boot.log ##默認與 boot.log 放在一起,
local2.* /var/log/dhcpd.log ## 自定義獨立存放。
#define KERN_EMERG "<0>" /* system is unusable */
#define KERN_ALERT "<1>" /* action must be taken immediately */
#define KERN_CRIT "<2>" /* critical conditions */
#define KERN_ERR "<3>" /* error conditions */
#define KERN_WARNING "<4>" /* warning conditions */
#define KERN_NOTICE "<5>" /* normal but significant condition */
#define KERN_INFO "<6>" /* informational */
#define KERN_DEBUG "<7>" /* debug-level messages */