1.客户端:利用广播封包发送搜索 DHCP 服务器的封包:
若客户端网络设定使用 DHCP 协议取得 IP (在 Windows 内为『自动取得 IP』),则当客户端开机或者是重新启动网络卡时, 客户端主机会发送出搜寻 DHCP 服务器的 UDP 封包给所有物理网段内的计算机。此封包的目标 IP 会是 255.255.255.255, 所以一般主机接收到这个封包后会直接予以丢弃,但若局域网络内有 DHCP 服务器时,则会开始进行后续行为。
2.服务器端:提供客户端网络相关的租约以供选择:
DHCP 服务器在接收到这个客户端的要求后,会针对这个客户端的硬件地址 (MAC) 与本身的设定数据来进行下列工作:
到服务器的登录文件中寻找该用户之前是否曾经用过某个 IP ,若有且该 IP 目前无人使用,则提供此 IP 给客户端;
若配置文件针对该 MAC 提供额外的固定 IP (static IP) 时,则提供该固定 IP 给客户端;
若不符合上述两个条件,则随机取用目前没有被使用的 IP 参数给客户端,并记录下来。
总之,服务器端会针对客户端的要求提供一组网络参数租约给客户端选择,由于此时客户端尚未有 IP ,因此服务器端响应的封包信息中, 主要是针对客户端的 MAC 来给予回应。此时服务器端会保留这个租约然后开始等待客户端的回应。
3.客户端:决定选择的 DHCP 服务器提供的网络参数租约并回报服务器:
由于局域网络内可能并非仅有一部 DHCP 服务器,但客户端仅能接受一组网络参数的租约。 因此客户端必需要选择是否要认可该服务器提供的相关网络参数的租约。当决定好使用此服务器的网络参数租约后, 客户端便开始使用这组网络参数来设定自己的网络环境。此外,客户端也会发送一个广播封包给所有物理网段内的主机, 告知已经接受该服务器的租约。此时若有第二台以上的 DHCP 服务器,则这些没有被接受的服务器会收回该 IP 租约。至于被接受的 DHCP 服务器会继续进行底下的动作。
4.服务器端:记录该次租约行为并回报客户端已确认的响应封包信息:
当服务器端收到客户端的确认选择后,服务器会回传确认的响应封包,并且告知客户端这个网络参数租约的期限, 并且开始租约计时。该次租约何时会到期而被解约:
客户端脱机:不论是关闭网络接口 (ifdown)、重新启动 (reboot)、关机 (shutdown) 等行为,皆算是脱机状态,这个时候 Server 端就会将该 IP 回收,并放到 Server 自己的备用区中,等待未来的使用;
客户端租约到期:前面提到 DHCP server 端发放的 IP 有使用的期限,客户端使用这个 IP 到达期限规定的时间,而且没有重新提出 DHCP 的申请时,就需要将 IP 缴回去!这个时候就会造成断线。但用户也可以再向 DHCP 服务器要求再次分配 IP 。
hostname | ip |
---|---|
server | 192.168.100.1 |
client |
[root@server ~]# yum install dhcp -y
[root@server ~]# cp /usr/share/doc/dhcp-4.2.5/dhcpd.conf.example /etc/dhcp/dhcpd.conf
cp:是否覆盖"/etc/dhcp/dhcpd.conf"? y
[root@server ~]# vim /etc/services
71 bootps 67/tcp # BOOTP server
72 bootps 67/udp
73 bootpc 68/tcp dhcpc # BOOTP client
74 bootpc 68/udp dhcpc
[root@server ~]# vim /etc/dhcp/dhcpd.conf
46 # A slightly different configuration for an internal subnet.
47 subnet 192.168.100.0 netmask 255.255.255.0 { #配置网段与本机同网段
48 range 192.168.100.50 192.168.100.100; #配置地址池
49 option domain-name-servers 192.168.100.1; #配置DNS IP
50 option domain-name "internal.example.org"; #配置域名
51 option routers 192.168.100.1; #路由
52 option broadcast-address 192.168.100.255; #广播地址
53 default-lease-time 600; #默认租约
54 max-lease-time 7200; #最大租约
55 }
[root@server ~]# systemctl start dhcpd
[root@server ~]# netstat -tnulp | grep dhcpd
udp 0 0 0.0.0.0:67 0.0.0.0:* 89718/dhcpd
[root@client ~]# systemctl restart network
[root@client ~]# ip a
1: lo: mtu 65536 qdisc noqueue state UNKNOWN
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eno16777736: mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 00:0c:29:7c:18:13 brd ff:ff:ff:ff:ff:ff
inet 192.168.100.50/24 brd 192.168.100.255 scope global dynamic eno16777736
valid_lft 605sec preferred_lft 605sec
inet6 fe80::20c:29ff:fe7c:1813/64 scope link tentative
valid_lft forever preferred_lft forever
[root@client ~]# route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 192.168.100.1 0.0.0.0 UG 100 0 0 eno16777736
192.168.100.0 0.0.0.0 255.255.255.0 U 100 0 0 eno1677773
[root@client ~]# cat /etc/resolv.conf
# Generated by NetworkManager
search internal.example.org
nameserver 192.168.100.1
[root@server ~]# cat /var/lib/dhcpd/dhcpd.leases
# The format of this file is documented in the dhcpd.leases(5) manual page.
# This lease file was written by isc-dhcp-4.2.5
server-duid "\000\001\000\001$\306\314\250\000\014)\213G\205";
lease 192.168.100.50 {
starts 0 2019/07/21 07:11:42;
ends 0 2019/07/21 07:21:42;
cltt 0 2019/07/21 07:11:42;
binding state active;
next binding state free;
rewind binding state free;
hardware ethernet 00:0c:29:7c:18:13;
client-hostname "client";
}
通过MAC地址与IP地址的对应关系为指定的物理地址分配固定IP
[root@server ~]# vim /etc/dhcp/dhcpd.conf
47 subnet 192.168.100.0 netmask 255.255.255.0 { #配置网段与本机同网段
48 range 192.168.100.50 192.168.100.100; #配置地址池
49 option domain-name-servers 192.168.100.1; #配置DNS IP
50 option domain-name "internal.example.org"; #配置域名
51 option routers 192.168.100.1; #路由
52 option broadcast-address 192.168.100.255; #广播地址
53 default-lease-time 600; #默认租约
54 max-lease-time 7200; #最大租约
55
56 host client {
57 hardware ethernet 00:0c:29:7c:18:13; #设置mac地址
58 fixed-address 192.168.100.66 #设置ip地址
59 }
60 }
[root@server ~]# systemctl restart dhcpd
[root@client ~]# systemctl restart network
[root@client ~]# ip a
1: lo: mtu 65536 qdisc noqueue state UNKNOWN
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eno16777736: mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 00:0c:29:7c:18:13 brd ff:ff:ff:ff:ff:ff
inet 192.168.100.66/24 brd 192.168.100.255 scope global dynamic eno16777736
valid_lft 605sec preferred_lft 605sec
inet6 fe80::20c:29ff:fe7c:1813/64 scope link tentative
valid_lft forever preferred_lft forever