1. DHCP服務
DHCP動態主機配置協議(Dynamic Host Configuration Protocol),允許計算機不必手工配置即可動態地被分配IP地址以及所需要的網絡配置參數。
當網絡規模大到一定程度,它是開始變得難以管理。特別是在手工分發IP地址的網絡環境中最常見的問題是IP地址管理和IP地址沖突。處理這個問題的一個方法是為客戶機動態分配IP地址。DHCP是為大量客戶機提供快速、方便、有效地分配I P的方法。
DHCP允許賦給不可移動的服務器一個固定地址,該地址不會因為機器重啟動而改變。
DHCP使用客戶/服務器模式。當一台計算機啟動時,就發送一個DHCP請求給DHCP服務器。管理員能夠將一台DHCP服務器配置成兩種地址類型:賦給固定地址類型和按需分配的地址緩沖池類型。當一台計算機啟動並發送一個請求給DHCP,DHCP服務器查詢其數據庫找到配置信息。如果數據庫包含該計算機的條目,服務器就返回該條目。如果沒有該計算機的條目,服務器將從緩沖池中選擇下一個IP地址並賦給該計算機。
DHCP使用UDP協議,客戶端使用68端口,服務器使用67端口。
1.1 DHCP報文
1.1.1 DHCP報文格式
dhcp協議的報文格式如下:

其中各個字段意義如下:
-
OP:指明報文是請求(1)還是響應(2);
-
htype與hlen:指明網絡硬件類型和硬件地址的長度,對於以太網類型為1,地址長度為6。
-
hops:客戶機在字段HOPS設置為0,如果收到請求並決定將請求送到其他服務器(用作中繼時,就增加HOPS計數)。
-
xid:事務標識符,它是一個隨機數,用於匹配請求和響應的整數。
-
secs:延續時間,報告客戶機開始啟動后逝去的秒數,通常情況下設置為0。
-
flags:標志位,高位置為1,可請求服務器發送響應是使用硬件廣播而不是硬件單播。
-
ciaddr:客戶IP地址,如果客戶機含有IP地址,則設置為客戶的IP地址。
-
yiaddr:你的IP地址,如果客戶機IP地址為零,則服務器設置你的IP地址字段以返回提供給客戶機的IP地址。
-
siaddr:服務器IP地址,表明服務器的IP地址,在DHCPOFFER、DHCPACK中返回。
-
giaddr:路由器IP地址,它是中繼的IP地址,當中繼收到客戶機的DHCP請求,將其轉發到服務器之前,設置此字段為中繼的IP地址。
-
chaddr:客戶硬件地址。
-
sname:服務器主機名。
-
file:自舉文件名。
-
options選項,長度是可變的。
dhcp的options字段是比較重要的,一些附帶信息的下發均依靠這個字段,常用選項如下:
-
Subnet mask:子網掩碼,選項1,在DHCP響應報文中使用,用以指定客戶機的子網掩碼。
-
Requested IP address:請求的IP地址,選項50,在DHCPDISCOVER報文中用於向服務器請求指定的IP地址。
-
IP address lease time:IP地址租用時間,選項51,在DHCPDISCOVER或DHCPREQUEST報文中,用於向服務器請求指定的租用時間;在DHCPOFFER中,則表明服務器向客戶機提供的租用時間。
-
DHCP message type:DHCP消息類型,選項53,用以表示此報文的類型,BOOTP報文無此選項。報文的類型包括:DHCPDISCOVER、DHCPOFFER、DHCPREQUEST、DHCPDECLINE、DHCPACK、DHCPNACK、DHCPRELEASE、DHCPINFORM。
-
Server identifier:服務器標識,選項54,用於DHCPOFFER、DHCPREQUEST報文中,也可選擇地用於DHCPACK、DHCPNACK報文中。DHCP服務器在DHCPOFFER報文中使用此選項是為了讓客戶機區別不同的租用提供者。而客戶機使用此選項則是為了標識其租用提供者。
-
Parameter request list:參數請求列表,選項55,客戶機使用,用於請求特定的配置參數。
-
Maximum DHCP message size:最大DHCP報文長度,選項57,用於表明可以接收的DHCP報文的最大長度。
-
Renewal(T1) time value:更新時間值,選項58,用於指定更新時間。
-
Rebinding(T2) time value:重綁定時間值,選項59,用於指定重綁定時間值。
-
Client identifier:客戶端標識,選項61,用於唯一標識客戶端,CISCO用此作為服務器地址綁定表的索引。
1.1.2 DHCP報文類型
-
DHCPDISCOVER:客戶端用於地址申請的廣播報文。
-
DHCPOFFER:服務器端對客戶端DHCPDISCOVER報文的回復,包含了所提供的IP地址和網絡配置信息。
-
DHCPREQUEST:在不同的狀態下,用途不同:
- (a) 在請求狀態時,請求服務器同意開始使用所提供的IP地址。
- (b) 在更新狀態,請求提供IP地址的服務器更新IP地址租用時間。
- (c) 在重綁定狀態,廣播請求子網中的服務器,是否允許繼續使用當前的IP地址。
-
DHCPACK:服務器端對客戶端請求的同意報文。
-
DHCPNAK:服務器端對客戶端請求的否定報文。客戶端必須重新開始申請。
-
DHCPRELEASE:客戶端主動終止IP地址的使用,用於釋放IP地址報文。
-
DHCPDECLINE:由於地址已經被使用,客戶端對服務器提供的地址表示拒絕。
-
DHCPINFORM:客戶端要求服務器提供最新的網絡配置信息。
1.2 DHCP工作過程
dhcp的工作流程如下:

- 客戶機通過DHCPDISCOVER廣播提出請求,尋找局域網中的dhcp服務器。如果客戶機有一個永久性的租用地址,它可以直接請求那個地址。
- 服務器一旦收到請求,會從地址池中取出一個地址並返回一個附有可用IP地址的DHCPOFFER報文。
- 如果客戶機收到多個DHCPOFFER報文,它會選擇第一個DHCPOFFER報文提供的IP地址或其所請求的那一個。
- 客戶機廣播含有服務器標識的DHCPREQUEST報文並等待。
- 每一個服務器檢查收到的DHCPREQUEST報文,若發現不含它的標識,它會丟棄該報文。當被標識的服務器接收了報文后,它會返回一個DHCPACK報文,如果所請求的IP已被分配或者租期已滿,會發回DHCPNAK報文;沒有被標識的服務器收到報文后會返回DHCPNAK報文。
- 如果客戶機收到DHCPACK報文,它可以開始使用IP地址。如果它收到DHCPNAK,它會重新開始整個過程。假如IP有問題,客戶機會發送一個DHCPDECLINE報文給服務器並重新開始。
1.2.1 DHCP租期更新
- 當客戶端ip的租期達到50%時,客戶端會向服務器請求更新地址的租期,單播發送DHCPREQUEST報文請求更新租期,若服務器同意則回應DHCPACK消息,租期更新成功;如果該地址不可用,則服務器回復DHCPNAK消息。
- 若之前服務器沒有回復ACK消息,當客戶端ip的租期達到75%時,客戶端會再次請求更新租期,這次客戶端將以廣播形式發送DHCPREQUEST報文,若服務器同意則回應DHCPACK消息,租期更新成功;如果該地址不可用,則服務器回復DHCPNAK消息。如客戶端更新租期失敗,之后客戶端每隔5min會廣播請求地址。

1.2.2 DHCP中繼
中繼代理能中繼服務器和客戶機之間的交互報文。這樣可以使服務器能處理不在該服務器所在子網的DHCP報文。這意味着不必為每一個子網設置一個服務器,為每一個子網設置一個服務器開銷很大,以下幾步說明了中繼代理如何工作:
- DHCP客戶機廣播一個REQUEST消息。
- 中繼代理把收到報文的接口對應的IP地址放到消息的giaddr域中,然后單播至服務器。
- 服務器給中繼代理返回應答(通過單播)。應答包括與客戶機所請求相同的giaddr域。
- 中繼代理會從giaddr域中I P地址對應的接口中廣播應答。
1.4 DHCP服務配置
1.4.1 DHCP服務端配置
-
第一步:安裝dhcp軟件包,來自base倉庫。
[root@xuzhichao ~]# yum install dhcp -y查看dhcp包中提供的文件:
[root@xuzhichao ~]# rpm -ql dhcp /etc/NetworkManager /etc/NetworkManager/dispatcher.d /etc/NetworkManager/dispatcher.d/12-dhcpd /etc/dhcp/dhcpd.conf <==DHCP的配置文件 /etc/dhcp/dhcpd6.conf <==DHCP針對ipv6地址的配置文件 /etc/dhcp/scripts /etc/dhcp/scripts/README.scripts /etc/openldap/schema/dhcp.schema /etc/sysconfig/dhcpd /usr/bin/omshell /usr/lib/systemd/system/dhcpd.service <==dhcp的服務啟用文件 /usr/lib/systemd/system/dhcpd6.service /usr/lib/systemd/system/dhcrelay.service /usr/sbin/dhcpd /usr/sbin/dhcrelay /usr/share/doc/dhcp-4.2.5 /usr/share/doc/dhcp-4.2.5/dhcpd.conf.example <==DHCP的配置文件的樣例 /usr/share/doc/dhcp-4.2.5/dhcpd6.conf.example /usr/share/doc/dhcp-4.2.5/ldap /usr/share/doc/dhcp-4.2.5/ldap/README.ldap /usr/share/doc/dhcp-4.2.5/ldap/dhcp.schema /usr/share/doc/dhcp-4.2.5/ldap/dhcpd-conf-to-ldap /usr/share/man/man1/omshell.1.gz /usr/share/man/man5/dhcpd.conf.5.gz /usr/share/man/man5/dhcpd.leases.5.gz /usr/share/man/man8/dhcpd.8.gz /usr/share/man/man8/dhcrelay.8.gz /usr/share/systemtap/tapset/dhcpd.stp /var/lib/dhcpd /var/lib/dhcpd/dhcpd.leases <==記錄服務器已經分配的地址情況 /var/lib/dhcpd/dhcpd6.leases -
第二步:修改dhcp的配置文件
默認其配置文件/etc/dhcp/dhcpd.conf中沒有內容,可以把樣板文件復制過來進行修改
[root@xuzhichao ~]# cp /usr/share/doc/dhcp-4.2.5/dhcpd.conf.example /etc/dhcp/dhcpd.confdhcp的配置文件格式如下:
[root@xuzhichao ~]# vim /etc/dhcp/dhcpd.conf #authoritative; <==若果此dhcp是正式的dhcp服務器,該字段應取消注釋 log-facility local7; <==日志信息,默認存放在/var/log/bootlog文件中 subnet 192.168.50.0 netmask 255.255.255.0 { <==標題段,指明網絡號和掩碼 range 192.168.50.1 192.168.50.99; <==指定分配地址的范圍 option domain-name-servers 192.168.50.1,8.8.8.8; <==指定分配的DNS地址 option domain-name "xu.com"; <==指定分配的域名 option routers 192.168.50.100; <==指定分配的網關地址 default-lease-time 6000; <==指定分配的默認租期,單位秒 max-lease-time 72000; <==指定分配的最大租期,單位秒 }其中dns,網關,租期等信息可以在全局下定義,也可以在subnet中定義,若兩者都有定義,以subnet中的為准。
可以指定服務器提供dhcp服務的接口,在/etc/sysconfig/dhcpd文件中定義
[root@xuzhichao ~]# cat /etc/sysconfig/dhcpd #DHCPDARGS="eth1" -
第三步:啟用dhcp服務
注意:啟動dhcp服務前需要確保dhcp分配的網段在本機上存在同網段的可用地址。
[root@xuzhichao ~]# ip add show eth2 4: eth2: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000 link/ether 00:0c:29:2f:d0:e4 brd ff:ff:ff:ff:ff:ff inet 192.168.50.100/32 brd 192.168.50.100 scope global noprefixroute eth2 valid_lft forever preferred_lft forever inet6 fe80::80b9:b869:e531:3141/64 scope link noprefixroute valid_lft forever preferred_lft forever #啟動dhcpd服務 [root@xuzhichao ~]# systemctl start dhcpd.service #開機自啟dhcpd服務 [root@xuzhichao ~]# systemctl enable dhcpd.service #查看dhcp服務的狀態 [root@xuzhichao ~]# systemctl status dhcpd.service ● dhcpd.service - DHCPv4 Server Daemon Loaded: loaded (/usr/lib/systemd/system/dhcpd.service; disabled; vendor preset: disabled) Active: active (running) since Mon 2021-06-07 05:08:44 EDT; 6s ago Docs: man:dhcpd(8) man:dhcpd.conf(5) Main PID: 15392 (dhcpd) Status: "Dispatching packets..." CGroup: /system.slice/dhcpd.service └─15392 /usr/sbin/dhcpd -f -cf /etc/dhcp/dhcpd.conf -user dhcpd -group dhcpd --no-pid #查看dhcp的監聽端口是否啟動 [root@xuzhichao ~]# ss -una State Recv-Q Send-Q Local Address:Port Peer Address:Port UNCONN 0 0 127.0.0.1:323 *:* UNCONN 0 0 *:67 *:* <==此為dhcp服務端的端口 UNCONN 0 0 *:68 *:* UNCONN 0 0 [::1]:323 [::]:*
1.4.2 DHCP客戶端配置
修改網卡和服務器位於同一網段,修改地址為自動獲取方式:
[root@centos7_6 ~]# nmcli connection add con-name eth2-auto type ethernet ifname eth2 ipv4.method auto
Connection 'eth2-auto' (43205f88-3b6e-48a7-a93e-5e8138a1e18f) successfully added.
[root@centos7_6 ~]# nmcli connection up eth2-auto
Connection successfully activated (D-Bus active path: /org/freedesktop/NetworkManager/ActiveConnection/7)
#查看eth2接口獲取的地址,網關,dns等信息
[root@centos7_6 ~]# ip add show eth2
4: eth2: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:0c:29:16:20:d3 brd ff:ff:ff:ff:ff:ff
inet 192.168.50.1/24 brd 192.168.50.255 scope global noprefixroute dynamic eth2
valid_lft 5993sec preferred_lft 5993sec
inet6 fe80::da59:e2c9:e1eb:df70/64 scope link noprefixroute
valid_lft forever preferred_lft forever
[root@centos7_6 ~]# route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 192.168.2.1 0.0.0.0 UG 101 0 0 eth1
0.0.0.0 192.168.50.100 0.0.0.0 UG 104 0 0 eth2
172.20.125.0 0.0.0.0 255.255.255.0 U 103 0 0 eth3
192.168.2.0 0.0.0.0 255.255.255.0 U 101 0 0 eth1
192.168.20.0 0.0.0.0 255.255.255.0 U 100 0 0 eth0
192.168.50.0 0.0.0.0 255.255.255.0 U 104 0 0 eth2
192.168.122.0 0.0.0.0 255.255.255.0 U 0 0 0 virbr0
[root@centos7_6 ~]# cat /etc/resolv.conf
# Generated by NetworkManager
search lan xu.com
nameserver 192.168.2.1
nameserver 192.168.50.1
nameserver 8.8.8.8
查看服務器端的日志:
[root@xuzhichao ~]# tail /var/log/boot.log
Jun 7 05:08:44 xuzhichao dhcpd: Sending on Socket/fallback/fallback-net
Jun 7 05:47:15 xuzhichao dhcpd: DHCPDISCOVER from 00:0c:29:16:20:d3 via eth2
Jun 7 05:47:16 xuzhichao dhcpd: DHCPOFFER on 192.168.50.1 to 00:0c:29:16:20:d3 (centos7_6) via eth2
Jun 7 05:47:16 xuzhichao dhcpd: DHCPREQUEST for 192.168.50.1 (192.168.50.100) from 00:0c:29:16:20:d3 (centos7_6) via eth2
Jun 7 05:47:16 xuzhichao dhcpd: DHCPACK on 192.168.50.1 to 00:0c:29:16:20:d3 (centos7_6) via eth2
1.4.2.1 dhclient工具
dhclient工具可以啟動一個dhcp客戶端去獲取一個地址,默認所有網卡都會去自動獲取地址。
默認后台執行,前台執行使用-d選項:
[root@centos7_6 ~]# dhclient -d
Internet Systems Consortium DHCP Client 4.2.5
Copyright 2004-2013 Internet Systems Consortium.
All rights reserved.
For info, please visit https://www.isc.org/software/dhcp/
Listening on LPF/virbr0-nic/52:54:00:b9:1a:89
Sending on LPF/virbr0-nic/52:54:00:b9:1a:89
Listening on LPF/virbr0/52:54:00:b9:1a:89
Sending on LPF/virbr0/52:54:00:b9:1a:89
Listening on LPF/eth3/00:0c:29:16:20:dd
Sending on LPF/eth3/00:0c:29:16:20:dd
Listening on LPF/eth2/00:0c:29:16:20:d3
Sending on LPF/eth2/00:0c:29:16:20:d3
Listening on LPF/eth1/00:0c:29:16:20:c9
Sending on LPF/eth1/00:0c:29:16:20:c9
Listening on LPF/eth0/00:0c:29:16:20:bf
Sending on LPF/eth0/00:0c:29:16:20:bf
Sending on Socket/fallback
DHCPDISCOVER on virbr0-nic to 255.255.255.255 port 67 interval 7 (xid=0x2cfed07b)
DHCPDISCOVER on virbr0 to 255.255.255.255 port 67 interval 8 (xid=0x52cd2021)
DHCPDISCOVER on eth3 to 255.255.255.255 port 67 interval 5 (xid=0x3ec4ade1)
DHCPDISCOVER on eth2 to 255.255.255.255 port 67 interval 3 (xid=0x7e857e5e)
DHCPDISCOVER on eth1 to 255.255.255.255 port 67 interval 5 (xid=0x3e9927e7)
DHCPDISCOVER on eth0 to 255.255.255.255 port 67 interval 5 (xid=0x7a7a899f)
DHCPREQUEST on eth1 to 255.255.255.255 port 67 (xid=0x3e9927e7)
DHCPOFFER from 192.168.2.1
DHCPACK from 192.168.2.1 (xid=0x3e9927e7)
bound to 192.168.2.157 -- renewal in 33243 seconds.
DHCPREQUEST on eth0 to 255.255.255.255 port 67 (xid=0x7a7a899f)
DHCPOFFER from 192.168.20.254
DHCPACK from 192.168.20.254 (xid=0x7a7a899f)
bound to 192.168.20.16 -- renewal in 846 seconds.
DHCPDISCOVER on eth2 to 255.255.255.255 port 67 interval 6 (xid=0x7e857e5e)
DHCPDISCOVER on eth3 to 255.255.255.255 port 67 interval 9 (xid=0x3ec4ade1)
DHCPREQUEST on eth2 to 255.255.255.255 port 67 (xid=0x7e857e5e)
DHCPOFFER from 192.168.50.100
DHCPACK from 192.168.50.100 (xid=0x7e857e5e)
bound to 192.168.50.3 -- renewal in 2920 seconds.
DHCPDISCOVER on virbr0-nic to 255.255.255.255 port 67 interval 18 (xid=0x2cfed07b)
DHCPDISCOVER on virbr0 to 255.255.255.255 port 67 interval 12 (xid=0x52cd2021)
dhclient -r會清空所有接口獲取到的地址,包括配置的靜態地址,重啟網絡服務才能恢復。慎用!
1.4.3 為終端分配固定地址
對於一些服務器需要獲取固定的IP地址的情況,可以根據終端的MAC地址分配固定的ip地址:
-
在dhcp服務器的配置文件新增如下內容:
[root@xuzhichao ~]# vim /etc/dhcp/dhcpd.conf host server { hardware ethernet 00:0c:29:16:20:d3; <==指定客戶端的MAC地址 fixed-address 192.168.50.10; <==指定客戶端要分配的IP地址 option routers 192.168.50.100; <==指定網關,若不配置,會從subnet中分配 } -
重啟dhcp服務:
[root@xuzhichao ~]# systemctl restart dhcpd.service -
客戶端重新獲取ip地址:
[root@centos7_6 ~]# dhclient -r eth2 [root@centos7_6 ~]# dhclient eth2 [root@centos7_6 ~]# ip add show eth2 4: eth2: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000 link/ether 00:0c:29:16:20:d3 brd ff:ff:ff:ff:ff:ff inet 192.168.50.10/24 brd 192.168.50.255 scope global dynamic eth2 valid_lft 5995sec preferred_lft 5995sec inet6 fe80::639b:757c:18c4:4613/64 scope link noprefixroute valid_lft forever preferred_lft forever -
查看服務器端的相關日志:
[root@xuzhichao ~]# cat /var/log/boot.log #客戶端主動放棄地址,發送RELEASE Jun 7 05:55:05 xuzhichao dhcpd: DHCPRELEASE of 192.168.50.3 from 00:0c:29:16:20:d3 via eth2 (found) #靜態分配地址過程 Jun 7 06:13:26 xuzhichao dhcpd: DHCPDISCOVER from 00:0c:29:16:20:d3 via eth2 Jun 7 06:13:26 xuzhichao dhcpd: DHCPOFFER on 192.168.50.10 to 00:0c:29:16:20:d3 via eth2 Jun 7 06:13:26 xuzhichao dhcpd: Dynamic and static leases present for 192.168.50.10. Jun 7 06:13:26 xuzhichao dhcpd: Remove host declaration server or remove 192.168.50.10 Jun 7 06:13:26 xuzhichao dhcpd: from the dynamic address pool for 192.168.50.0/24 Jun 7 06:13:26 xuzhichao dhcpd: DHCPREQUEST for 192.168.50.10 (192.168.50.100) from 00:0c:29:16:20:d3 via eth2 Jun 7 06:13:26 xuzhichao dhcpd: DHCPACK on 192.168.50.10 to 00:0c:29:16:20:d3 via eth2
