当前位置: 代码迷 >> 综合 >> Linux DHCP 服务
  详细解决方案

Linux DHCP 服务

热度:102   发布时间:2023-12-04 06:15:57.0

一、概述

DHCP :动态主机设置协议(英语:Dynamic Host Configuration Protocol,DHCP)是一个局

域网的网络协议,使用UDP协议工作,主要有两个用途:用于内部网或网络服务供应商自动

分配IP地址;给用户用于内部网管理员作为对所有计算机作中央管理的手段。

DHCP协议采用客户端/服务器模型,主机地址的动态分配任务由网络主机驱动。当DHCP服

务器接收到来自网络主机申请地址的信息时,才会向网络主机发送相关的地址配置等信息,

以实现网络主机地址信息的动态配置。

1、DHCP具有以下功能:

(1)保证任何IP地址在同一时刻只能由一台DHCP客户机所使用。

(2)DHCP可以给用户分配永久固定的IP地址。

(3)DHCP可以同用其他方法获得IP地址的主机共存(如手工配置IP地址的主机)。

(4)DHCP服务器应当向现有的BOOTP客户端提供服务。

2、DHCP有三种机制分配IP地址:

1) 自动分配方式(Automatic Allocation),DHCP服务器为主机指定一个永久性的IP地址,

一旦DHCP客户端第一次成功从DHCP服务器端租用到IP地址后,就可以永久性的使用该地

址。

2) 动态分配方式(Dynamic Allocation),DHCP服务器给主机指定一个具有时间限制的IP地

址,时间到期或主机明确表示放弃该地址时,该地址可以被其他主机使用。

3) 手工分配方式(Manual Allocation),客户端的IP地址是由网络管理员指定的,DHCP服务

器只是将指定的IP地址告诉客户端主机。三种地址分配方式中,只有动态分配可以重复使用客户端不再需要的地址。

DHCP消息的格式是基于BOOTP(Bootstrap Protocol)消息格式的,这就要求设备具BOOTP

中继代理的功能,并能够与BOOTP客户端和DHCP服务器实现交互。BOOTP中继代理的功

能,使得没有必要在每个物理网络都部署一个DHCP服务器。RFC 951和RFC 1542对BOOTP协

议进行了详细描述。

3、DHCP的运作方式:

客户端传输广播包给整个物理网络段内的所有主句,如局域网内有DHCP服务器时,才会响

应客户端的IP参数要求,所以DHCP服务器与客户端应该在同一个物理网段内。

客户端与DHCP服务器之间连接的过程如下图:

 

1)客户端:利用广播包发送搜索DNCP服务器的包

2)服务器端:提供客户端网络相关的租约选择

3)客户端:决定选择的DHCP服务器提供的网络参数租约并汇报给服务器

4)服务器端:记录这次租约并回报给客户端相关的封包信息

4、简单来说下DHCP工作原理:

(1)客户机寻找服务器:广播发送discover包,寻找dhcp服务器

(2)服务器响应请求:单播发送offer包,对客户机做出响应。提供客户端网络相关的租约以

供选择其中服务器在收到客户端的请求后,会针对客户端的mac地址与本身的设定数据进行

一下工作:

a)到服务器的登录文件中寻找该用户之前曾经使用过的ip,若有且该ip目前没有人使用,这

提供此ip为客户机

b)若配置文件中有针对该mac提供额外的固定ip,且该ip没有被使用,则提供此ip给客户机

c)如果没有符合以上两个条件,则随机取用目前没有被使用的ip参数给客户机并记录leases

文件中。

(3)客户机发送ip请求:广播request包,选择一个服务器提供的网络参数租约回报服务器

此外,客户机会发送一个广播封包给局域网内的所有主机,告知自己已经接受服务器的租

约。

(4)服务器确认租约:单播Ack包,服务器与客户机确认租约关系并记录到服务器的leases文

件中 。

5、DHCP涉及概念简介:

DHCP Client:DHCP客户端,通过DHCP协议请求IP地址的客户端。DHCP客户端是接口级的

概念,如果一个主机有多个以太接口,则该主机上的每个接口都可以配置成一个DHCP 客户

端。交换机上每个Vlan接口也可以配置成一个DHCP客户端。

DHCP Server:DHCP 服务端,负责为DHCP客户端提供IP地址,并且负责管理分配的IP地

址。

DHCP Relay:DHCP中继器,DHCP客户端跨网段申请IP地址的时候,实现DHCP报文的转发功

能。

DHCP Security:DHCP安全特性,实现合法用户IP地址表的管理功能

DHCP Snooping:DHCP监听,记录通过二层设备申请到IP地址的用户信息

二、DHCP工作原理

DHCP工作大致可以分为一下几个阶段:

1、发现阶段:

即DHCP客户端寻找DHCP服务端的过程,对应于客户端发送DHCP Discovery,因为DHCP

Server对应于DHCP客户端是未知的,所以DHCP 客户端发出的DHCP Discovery报文是广播

包,源地址为0.0.0.0目的地址为255.255.255.255。网络上的所有支持TCP/IP的主机都会收到

该DHCP Discovery报文,但是只有DHCP Server会响应该报文。

如果网络中存在多个DHCP Server,则多个DHCP Server均会回复该DHCP Discovery报文。

如果同一个vlan内没有DHCP Server,而该VlanIf配置了DHCP Relay功能,则该Vlanif即为

DHCP中继,DHCP中继会将该DHCP报文的源IP地址修改为该Vlanif的IP地址,而目的地址则

为DHCP Relay配置的DHCP Server的IP地址。同时修改DHCP报文中,giaddress为VlanIf的IP地

址。并以单播将DHCP Discovery发送到DHCP Server端。

2、DHCP Server 提供阶段:

DHCP Server提供阶段,即为DHCP Server响应DHCP Discovery所发的DHCP Offer阶段

DHCP Server收到DHCP Discovery报文后,解析该报文请求IP地址所属的Subnet。并从

dhcpd.conf文件中与之匹配的subnet中取出一个可用的IP地址(从可用地址段选择一个IP地址

后,首先发送ICMP报文来ping该IP地址,如果收到该IP地址的ICMP报文,则抛弃该IP地址,

重新选择IP地址继续进行ICMP报文测试,直到找到一个网络中没有人使用的IP地址,用以达

到防治动态分配的IP地址与网络中其他设备IP地址冲突,这个IP地址冲突检测机制,(可配

置),设置在DHCP Discovery报文中yiaddress字段中,表示为该客户端分配的IP地址,并且为

该Lease设置该Subnet配置的Option,例如默认leases租期,最大租期,router等信息。

DHCP从地址池中选择IP地址,以如下优先级进行选择:

1)当前已经存在的Ip Mac的对应关系

2)Client以前的IP地址

3)读取Discovery报文中的Requested Ip Address Option的值,如果存在并且IP地址可用

4)从配置的Subnet中选择IP地址:

DHCP Server解析DHCP Discovery请求的IP所属的Subnet,首先看该DHCP Discovery报文中

giaddress是否有DHCP Relay,如果有,则从giaddress所述的subnet中可用IP地址段中获取,

并分配IP。如果giaddress没有IP地址,则从该DHCP Server绑定的接口的IP地址所属的网段分

配IP地址。

3、DHCP Client 选择阶段:

DHCP Client收到若干个DHCP Server响应的DHCP Offer报文后,选择其中一个DHCP Server作

为目标DHCP Server。选择策略通常为选择第一个响应的DHCP Offer报文所属DHCPServer。

然后以广播方式回答一个DHCP Request报文,该报文中包含向目标DHCP请求的IP地址等信

息。之所以是以广播方式发出的,是为了通知其他DHCP Server自己将选择该DHCP Server所

提供的IP地址。

4、DHCP Server确认阶段:

当DHCP Server收到DHCP Client发送的DHCP Request后,确认要为该DHCP Client提供的IP地

址后,便想该DHCP Client响应一个包含该IP地址以及其他Option的报文,来告诉DHCP Client

可以使用该IP地址了。然后DHCP Client即可以将该IP地址与网卡绑定。另外其他DHCP

Server都将收回自己之前为DHCP Client提供的IP地址。

5、DHCP Client重新登录网络:

当DHCP Client重新登录后,发送一个以包含之前DHCP Server分配的IP地址信息的DHCP

Request报文,当DHCP Server收到该请求后,会尝试让DHCP客户端继续使用该IP地址。并

回答一个ACK报文。

但是如果该IP地址无法再次分配给该DHCP Client后,DHCP回复一个NAK报文,当DHCP

Client收到该NAK报文后,会重新发送DHCP Discovery报文来重新获取IP地址。

6、DHCP Client更新租约:

DHCP获取到的IP地址都有一个租约,租约过期后,DHCP Server将回收该IP地址,所以如果

DHCP Client如果想继续使用该IP地址,则必须更新器租约。更新的方式就是,当前租约期

限过了一半后,DHCP Client都会发送DHCP Renew报文来续约租期。

三、DHCP服务实践

某公司决定在内部网络中架设一台DHCP服务器,用于给局域网中的100台主机动态分配IP地址和网络环境配置信息。服务端操作系统选用Linux,客户端中有50台是Windows系统,还有50台是Linux系统。网管员为局域网规划的IP地址段是192.168.x.0/24,DHCP服务器地址是192.168.x.11/24,网关地址是192.168.x.254/24,公司还部署了内部的主从DNS服务器两台,进行内部域名y.com的名称解析,主DNS服务器地址是192.168.x.11/24,从DNS服务器地址是192.168.x.12/24,地址租期默认1天,最大3天;另外需要为老板的主机(MAC是00:0C:29:51:E6:BD)绑定IP地址192.168.x.188/24。

一、环境准备

1、实验规划

角色 主机名 操作系统 网卡 IP地址 备注
在实验中所起的作用 主机的名称 操作系统类型和版本 网络连接模式:网卡标识 IP地址/子网掩码 虚拟机或者物理机
DHCP服务器 gc1.test.com CentOS 7.4 仅主机:ens32 192.168.233.11/24 虚拟机
DHCP客户机 gc2.test.com CentOS 7.4 仅主机:ens32 动态获取 虚拟机
DHCP客户机 BOSS Windows 10 仅主机:vmnet1 动态获取 物理机

2、初始化配置

(1)主机1DHCP服务器

  • 修改静态地址

[root@loccalhost ~]# vi /etc/sysconfig/network-scripts/ifcfg-ens32
TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=none
IPADDR=192.168.233.11
NETMASK=255.255.255.0
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
NAME=ens32
DEVICE=ens32
ONBOOT=yes
  • 修改主机名

[root@localhost ~]# hostnamectl set-hostname gc1.test.com
[root@localhost ~]# hostname
gc1.test.com
  • 禁用防火墙

[root@gc1 ~]# systemctl stop firewalld
[root@gc1 ~]# systemctl disable firewalld
Removed symlink /etc/systemd/system/multi-user.target.wants/firewalld.service.
Removed symlink /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service.
  • 禁用SELINUX

[root@gc1 ~]# vi /etc/selinux/config 
# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
#     enforcing - SELinux security policy is enforced.
#     permissive - SELinux prints warnings instead of enforcing.
#     disabled - No SELinux policy is loaded.
SELINUX=disabled
# SELINUXTYPE= can take one of three two values:
#     targeted - Targeted processes are protected,
#     minimum - Modification of targeted policy. Only selected processes are protected.
#     mls - Multi Level Security protection.
SELINUXTYPE=targeted
  • 配置本地YUM仓库 


[root@gc1 ~]# rm -fv /etc/yum.repos.d/*.repo
[root@gc1 ~]# mkdir /dvd
[root@gc1 ~]# ehco "/dev/sr0 /dvd iso9660 defaults,ro 0 0" >> /etc/fstab 
[root@gc1 ~]# mount -a
[root@gc1 ~]# cat >> /etc/yum.repos.d/dvd.repo <<EOF
> [dvd]
> name=local
> baseurl=file:///dvd
> gpgcheck=0
> EOF
[root@gc1 ~]# yum clean all ;yum makecache ; yum repolist all?
  • 安装常用工具

[root@gc1 ~]# yum install vim lrzsz wget elinks tree net-tools zip unzip bash-completion -y
[root@gc1 ~]# yum groups install 'Development Tools' -y

(2)主机2 客户机

  • 修改静态地址

[root@localhost ~]# vi /etc/sysconfig/network-scripts/ifcfg-ens32
TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=dhcp
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
NAME=ens32
DEVICE=ens32
ONBOOT=yes
  • 修改主机名

[root@localhost ~]# hostnamectl set-hostname gc2.test.com
[root@localhost ~]# hostname 
gc2.test.com
  • 禁用防火墙

[root@localhost ~]# systemctl stop firewalld
[root@localhost ~]# systemctl disable firewalld
Removed symlink /etc/systemd/system/multi-user.target.wants/firewalld.service.
Removed symlink /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service.
  • 禁用SELINUX

[root@gc2 ~]# vi /etc/selinux/config 
# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
#     enforcing - SELinux security policy is enforced.
#     permissive - SELinux prints warnings instead of enforcing.
#     disabled - No SELinux policy is loaded.
SELINUX=disabled
# SELINUXTYPE= can take one of three two values:
#     targeted - Targeted processes are protected,
#     minimum - Modification of targeted policy. Only selected processes are protected.
#     mls - Multi Level Security protection.
SELINUXTYPE=targeted
  • 配置本地YUM仓库

[root@localhost ~]# rm -f /etc/yum.repos.d/*.repo
[root@localhost ~]# mkdir /dvd
[root@localhost ~]# echo "/dev/sr0 /dvd iso9660 defaults,ro 0 0" >> /etc/fstab
[root@localhost ~]# mount -a
[root@localhost ~]# cat >> /etc/yum.repos.d/dvd.repo << EOF
> [DVD]
> name=local
> baseurl=file:///dvd
> gpgcheck=0
> EOF
[root@localhost ~]# yum clean all ;yum makecache ;yum repolist all
  • 安装常用工具

[root@localhost ~]# yum install vim lrzsz wget elinks tree net-tools zip unzip bash-completion -y
[root@localhost ~]# yum groups install 'Development tools' -y

二、配置DHCP服务

1、安装服务软件包

[root@gc1 ~]# rpm -qa dhcp
[root@gc1 ~]# yum install dhcp -y

2、查看软件包的文件列表

[root@gc1 ~]# rpm -ql dhcp
/etc/NetworkManager
/etc/NetworkManager/dispatcher.d
/etc/NetworkManager/dispatcher.d/12-dhcpd
/etc/dhcp/dhcpd.conf
/etc/dhcp/dhcpd6.conf
/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
/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
/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

3、修改配置文件

[root@gc1 ~]# vim /etc/dhcp/dhcpd.conf 
subnet 192.168.233.0 netmask 255.255.255.0 {range 192.168.233.51 192.168.233.160;option domain-name-servers 192.168.233.11,192.168.233.12option domain-name "gongchi1.com";option routers 192.168.233.254;option broadcast-address 192.168.233.255;default-lease-time 86400;max-lease-time 259200;
}
host boss {hardware ethernet 00:50:56:c0:00:01;fixed-address 192.168.233.188;
}

4、配置文件检测

[root@gc1 ~]# dhcpd | grep error
Internet Systems Consortium DHCP Server 4.2.5
Copyright 2004-2013 Internet Systems Consortium.
All rights reserved.
For info, please visit https://www.isc.org/software/dhcp/
Not searching LDAP since ldap-server, ldap-port and ldap-base-dn were not specified in the config file
Wrote 0 deleted host decls to leases file.
Wrote 0 new dynamic host decls to leases file.
Wrote 0 leases to leases file.
Listening on LPF/ens32/00:0c:29:fd:0b:a0/192.168.233.0/24
Sending on   LPF/ens32/00:0c:29:fd:0b:a0/192.168.233.0/24
Sending on   Socket/fallback/fallback-net

5、启用服务

[root@gc1 ~]# systemctl start dhcpd
[root@gc1 ~]# systemctl status dhcpd
● dhcpd.service - DHCPv4 Server DaemonLoaded: loaded (/usr/lib/systemd/system/dhcpd.service; disabled; vendor preset: disabled)Active: active (running) since Thu 2021-03-04 22:24:14 CST; 11s agoDocs: man:dhcpd(8)man:dhcpd.conf(5)Main PID: 12953 (dhcpd)Status: "Dispatching packets..."CGroup: /system.slice/dhcpd.service└─12953 /usr/sbin/dhcpd -f -cf /etc/dhcp/dhcpd.conf -user dhcpd -group dhcpd --no-pid
?
Mar 04 22:24:14 gongchi1.test.com dhcpd[12953]: All rights reserved.
Mar 04 22:24:14 gongchi1.test.com dhcpd[12953]: For info, please visit https://www.isc.org/software/dhcp/
Mar 04 22:24:14 gongchi1.test.com dhcpd[12953]: Not searching LDAP since ldap-server, ldap-port and ldap-base-dn were not specified in ...ig file
Mar 04 22:24:14 gongchi1.test.com dhcpd[12953]: Wrote 0 deleted host decls to leases file.
Mar 04 22:24:14 gongchi1.test.com dhcpd[12953]: Wrote 0 new dynamic host decls to leases file.
Mar 04 22:24:14 gongchi1.test.com dhcpd[12953]: Wrote 0 leases to leases file.
Mar 04 22:24:14 gongchi1.test.com dhcpd[12953]: Listening on LPF/ens32/00:0c:29:fd:0b:a0/192.168.233.0/24
Mar 04 22:24:14 gongchi1.test.com dhcpd[12953]: Sending on   LPF/ens32/00:0c:29:fd:0b:a0/192.168.233.0/24
Mar 04 22:24:14 gongchi1.test.com dhcpd[12953]: Sending on   Socket/fallback/fallback-net
Mar 04 22:24:14 gongchi1.test.com systemd[1]: Started DHCPv4 Server Daemon.
Hint: Some lines were ellipsized, use -l to show in full.

6、设置服务开机自启动

[root@gc1 ~]# systemctl enable dhcpd
Created symlink from /etc/systemd/system/multi-user.target.wants/dhcpd.service to /usr/lib/systemd/system/dhcpd.service.

三、客户端测试

1、Linux客户端

[root@gc2 ~]# systemctl restart network
[root@gc2 ~]# ifconfig ens32
ens32: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500inet 192.168.233.51  netmask 255.255.255.0  broadcast 192.168.233.255inet6 fe80::20c:29ff:fead:c567  prefixlen 64  scopeid 0x20<link>ether 00:0c:29:ad:c5:67  txqueuelen 1000  (Ethernet)RX packets 2793  bytes 180044 (175.8 KiB)RX errors 0  dropped 0  overruns 0  frame 0TX packets 118  bytes 18844 (18.4 KiB)TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
[root@gongchi2 ~]# route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         192.168.233.254 0.0.0.0         UG    100    0        0 ens32
192.168.233.0   0.0.0.0         255.255.255.0   U     0      0        0 ens32
192.168.233.0   0.0.0.0         255.255.255.0   U     100    0        0 ens32
[root@gongchi2 ~]# cat /etc/resolv.conf 
; generated by /usr/sbin/dhclient-script
search gongchi1.com test.com
nameserver 192.168.233.11
nameserver 192.168.233.12

2、Windows客户端

以太网适配器 VMware Network Adapter VMnet1:
连接特定的 DNS 后缀: gongchi1.com
描述: VMware Virtual Ethernet Adapter for VMnet1
物理地址: ?00-50-56-C0-00-01
已启用 DHCP: 是
IPv4 地址: 192.168.233.188
IPv4 子网掩码: 255.255.255.0
获得租约的时间: 2021年3月4日 23:30:14
租约过期的时间: 2021年3月5日 23:30:14
IPv4 默认网关: 192.168.233.254
IPv4 DHCP 服务器: 192.168.233.11
IPv4 DNS 服务器: 192.168.233.11, 192.168.233.12
IPv4 WINS 服务器: 
已启用 NetBIOS over Tcpip: 是
连接-本地 IPv6 地址: fe80::2cdb:180b:695b:f220%3
IPv6 默认网关: 
IPv6 DNS 服务器: