本文环境:DHCP服务器IP 192.168.1.211(RHEL5.2)
当局域网中有大量的主机时,如果逐一为每台主机手动配置IP地址、默认网关、DNS服务器地址等网络参数,显示会非常费力。而DHCP(Dynamic Host Configuration Protocol,动态主机配置协议)服务器的应用,正好可以解决这个问题。
1-)DHCP协议的工作方式:
(1)客户端:利用广播发送DHCP服务器的请求数据包
若客户端网络设置DHCP自动获取IP,则当客户端开机或者是重新启动网卡时,客户端主机会发送出查找DHCP服务器的UDP数据包给所有物理网段内的计算机。此数据包的目标IP会是255.255.255.255(广播),所以一般主机收到这个数据包后会直接丢弃,但局域网内若有DHCP服务器的话,则会进行后续行为。
(2)服务器端:提供客户端网络相关的租约以供选择
DHCP服务器在收到客户端的请求后,会针对这个客户端的硬件地址(MAC)与本身的设置数据来进行以下工作:
到服务器的日志文件中查找该用户之前是否曾经组用过某个IP,若有且该IP目前无人使用,则提供该IP给客户端
若配置文件针对MAC地址提供特定的固定IP时,则提供该固定IP给客户端
若不符合以上两个条件时,则随机选取当前没有使用的IP参数给客户端,并记录下来
总之,服务器会针对客户端的要求提供一组网络参数租约给客户端选择,由于此时客户端尚未有IP,因此在服务器端响应的数据包信息中,主要是针对客户端的MAC来给予回应的(单播响应客户端)。此时服务器会保留这个租约等待客户端的回应。
(3)客户端:决定选择DHCP服务器提供的网络参数租约并向服务器确认
由于局域网内并非仅有一台DHCP服务器,但客户机仅能接受一组网络参数租约。 若网络中有多台DHCP服务器响应客户端,则哪台DHCP服务器先响应客户端,客户端就会接受这台DHCP服务器提供的网络参数。当决定使用此服务器提供的网络参数租约后,客户端便开始使用这组网络参数来设置自己的网络环境。此外,客户端也会发送一个广播数据包给所有物理网段的主机,告知已经接受该服务器的的租约。此时若有两台以上的DHCP服务器时,则这些没有被接受的服务器会收回该IP租约。被接受的服务器会进行以下动作
(4)服务器端:记录该次租约行为并向客户端确认
当服务器收到客户端的确认选择后,服务器会回送确认的响应数据包,并且告知该客户端这个网络参数租约的期限,并且开始租约倒计时。
2-)关于租约期限:
除非客户端关闭网络接口、重新启动、关机等脱机行为,这个时候server端就会将该IP收回,并放到server的备用区中,以便日后使用。
既然有租约期限,那么是否代表在某个时间点还需手动获取新的IP呢?不需要的,目前的DHCP客户端程序大多会主动依据租约时间去重新申请IP(renew)。
一般来说,假设租约期限为T小时,那么客户端会在0.5T时主动向DHCP服务器发出重新要求网络参数的数据包(直接从第3步开始,不会再次广播查找DHCP服务器),若这次请求没有成功,则会在0.85T时再次发送数据包一次。 正因如此,服务器会启动Port67监听客户端请求,而客户端会启动Port 68主动向服务器请求。
3-)配置DHCP服务器:
先执行“rpm –q dhcp” 命令查看系统中是否已经安装了dhcp软件,若未安装则安装吧
安装完毕后,开始建立配置文件 /etc/dhcpd.conf(RHEL5),该文件中默认并不包含有效的配置,需管理员手动建立。我们可以根据文件范本来建立新的dhcpd.conf文件。需要注意的是:在RHEL6.X中dhcp的配置文件名为/etc/dhcp/dhcpd.conf(RHEL6),会在后续介绍。
3-1)/etc/dhcpd.conf文件的构成:
1-)全局设置(会影响整个dhcp服务器)
假设dhcpd管理的只有一个子网的局域网,那么除了IP之外的许多网络参数就可以放在全局设置的区域中,包括租约期限、DNS主机的IP地址、路由器的IP地址及动态DNS(DDNS)更新的类型等。当固定IP及动态IP内没有定义到某些设置时,则以全局设置为准。
default-lease-time 时间:默认的租约时间,单位秒,表示客户机租约这个IP的默认时间
max-lease-time 时间:最大租约时间,单位秒,表示允许客户机请求的最大租约时间
option domain-name “域名”:默认搜索区域,如果在/etc/resolv.conf里面设置了一个search google.com,这表示当你要查找主机名时,DNS系统会主动帮你在所要查找的主机名后面加上这个域名后缀。
option domain-name-serversIP1,IP2:为客户机指定解析域名时使用的DNS服务器地址,该配置选项可以修改客户端的/etc/resolv.conf文件,即nameserver后面接的DNS IP,多个DNS地址以逗号分隔
ddns-update-style 类型:因为DHCP客户端所取得的IP通常是一直变动的,所以某台主机的主机名与IP的对应就很难处理。此时DHCP可以通过ddns来更新主机名与IP的对应关系。可设为none
ignore client-updates:与上一个设置值有关,客户端可以通过dhcpd服务器来更新DNS相关的信息。不过在这里我们不谈这个,因此将它设置为ignore(忽略)了
option routers 路由器的地址:设定路由器的IP地址,routers记得需要加s才对!
2-)subnet网段声明
一台DHCP服务器可以为多个网段提供服务,因此subnet网段声明必须有而且可以有多个。
那么上图括号内还有什么参数呢?那就是到底IP是固定的还是动态的。
range IP1 IP2:在这个局域网中,给予一个连续的IP地址段用来发放给客户端使用,IP1 IP2指的是分配给客户端使用的IP范围。
host 主机名{ … }:这个host就是指定固定IP对应到MAC的设置值,主机名可以自行设置,在大括号内需要指定MAC与固定的IP了。那么这两个值怎么设置呢?看看下图吧
3-2)一个局域网的DHCP案例
公司要求为内部局域网中的主机提供DHCP服务,内部eth0的IP为192.168.1.211。
内部网段设置为192.168.1.0/24,且内部计算机的router为192.168.1.254
此外DNS地址设为202.106.0.20、202.106.148.1
每个用户的默认租约为3天,最长为6天
要分配的IP只有192.168.1.100~192.168.1.200,其他IP保留
还有一台主机,其MAC地址是00:50:56:C0:00:08,设置其主机名为lisi且IP为192.168.1.88
注意:客户机保留的IP不要出现在range中。以上要求配置如下图:
接下来就需要启动相关的服务了,在启动dhcpd服务之前,应确保DHCP服务器具有静态IP,并且至少有一个网络接口的IP与DHCP服务器中的一个subnet网段相对应,否则无法正常启动dhcpd服务。例如,以下操作启动dhcpd服务,并检查UDP 67端口是否在监听,以确认DHCP服务器是否正常。
在早期的Linux系统中(CentOS5.X后不存在),当主机有多个接口的话,可能会让多个接口同时来监听,那就可能会出现错误。假设还有一个接口eth1在10.0.0.0/8,那万一DHCP同时监听两个接口的话,想一想若10.0.0.0/8网络中的客户端发出DHCP数据包的请求时,会取得什么IP呢?当然是192.168.1.X啦。针对这种情况我们可以编辑/etc/sysconfig/dhcpd文件来指定它所要监听的网络接口,我们可以这样做:
通过日志文件来观察DHCP服务的启动情况(看到下图的信息就说明成功了)
若dhcpd服务启动失败呢?我们来看看日志文件里究竟是什么原因吧
上图的数据我们发现在第5、9行有错误,设置错误的地方在行号下面还用指数符号(^)特别标注出来,由上面的情况来看,第5行应该是routers忘加s了,第9行应该是netmask而非network。
在服务器中查看一下租约文件吧,看看有哪些主机记录:
我们再打开一个win7和Linux,win7为固定IP(即lisi),Linux则动态获取。
通过上图我们发现配置文件保留的IP(主机)将不会出现在该租约文件中。
4-)DHCP客户端的设置
设置Linux客户机使用DHCP的方式自动获取IP地址,更改网卡配置文件:
同时需要注释掉自己的默认路由的设置。现在我们来查看一下吧!
看一下自己获取的ip地址吧:
查阅一下/etc/resolv.conf文件吧
查看一下路由:
看一看客户端租约所记载的信息:
在上图中,可以发现客户端取得的数据都被记录在/var/lib/dhclient/dhclient*-eth0.leases文件中,如果你有多个网卡,那么每个网卡自己的DHCP请求就会被写入到不同文件名的文件中去。通过观察该文件就知道你的数据如何啦。
也许大家会发现,有时候客户端每次取得的IP都是固定的,可是我们不是随机获取的吗?因为上面的dhclient-eth0.leases文件里面的fixed-address指定了想要固定的IP选项。如果DHCP服务器的该IP没有被分配他用,也在规定的range设定值内,那么会再次把这个IP分配给这个客户端。 如果你想要不同的IP呢?那将你想要的IP取代上述的设置值即可。
在前面我们谈到局域网内如果有多个DHCP服务器(假设有DHCP1、DHCP2),那么每次客户端对整个物理网段广播时,DHCP服务器将是先抢先得的局面。但是若第一次取得DHCP1服务器的IP后,以后重新启动网络,都只会取得DHCP1的网络参数,这也是因为上述的dhclient-eth0.leases客户端文件。因为主机想要获取上次取得的网络参数,因此将会对DHCP1请求网络参数。如果想要使用先抢先得的方式取得IP,或者想使用DHCP2来取得IP,那么需要修改或者删除dhclient-eth0.leases文件即可。
在Linux客户机中,可以使用dhclient工具来测试DHCP服务器。若直接执行dhclient命令,则dhclient将尝试为除回环接口lo以外的所有网络接口通过DHCP方式申请新的地址(当前若是静态的则需要修改网卡配置文件BOOTPROTO的参数)。若要为指定接口来自动获取IP可以结合-d选项,释放IP时可以结合-r选项,如下图:
我们上面介绍的 DHCP工作方式、搭建DHCP服务器、配置DHCP客户端 都是基于RHEL5环境的。而在RHEL6版本中,DHCP的配置文件为/etc/dhcp/dhcpd.conf。其他的配置选项基本相同。
注:以上图片上传到红联Linux系统教程频道中。