实验环境:RHEL5.8 32Bit

DHCP服务详解

·DHCP(Dynamic Host Configuration Protocol:动态主机配置协议)

    DHCP的前身是BOOTP(Boot Protocol)。

·BOOTP

    早期的计算机网络中的工作站,只有一台服务器在工作着,服务器上面有一块硬盘,这个硬盘的空间会比较大,这个服务器管理着很多台客户机,这些客户机上面都有CPU、内存、键盘鼠标显示器等等,还有主板,就是没有硬盘,这样的工作站叫做无盘工作站,早期的网吧都是这样的,但是客户机上面如果没有硬盘的话,那么客户机的操作系统安装在什么地方呢?因为没有操作系统任何计算机都是无法启动起来的,因此对于用户来讲操作系统是一个非常重要的人机交互通用软件层,但是无盘工作站中的客户机是没有硬盘的,那么用户要如何使用呢?因为在当时硬盘算是一种比较昂贵的资源,我们无法在每个主机上面都安装上硬盘,而且也没有必要安装,因为当时的计算机的性能都很差,因此无盘工作站中的每一个客户机的操作系统都是安装在服务器的硬盘中的对应区域中的,每一个客户机在开机的时候都会到各自的区域中去加载自己的操作系统的,那就意味着,每一台客户机要想正常使用必须能够和服务器进行通信,又由于计算机之间的通信使用的都是TCP/IP协议,因此无盘工作站中的每一个客户机要想和服务器进行通信的话必须得拥有自己的ip地址,但是问题又来了,我们知道ip地址是在操作系统中配置的,那么客户机又没有操作系统该如何和服务器进行通信呢?此时我们的每一台客户机上面都需要有一个特殊的网卡,该网卡自身拥有ROM芯片,这种网卡在启动的时候,它上面的ROM芯片就会向整个局域网发送广播通告,该通告就是一种获取ip地址的请求,我们的服务器刚好可以接收这种请求,并且服务器内部拥有很多ip地址可供外界使用,这些ip地址组成一个地址列表,这个地址列表我们一般叫做地址池,于是我们的服务器在接收到这种请求之后就会在地址池中查找到一个空闲地址提供给发起请求的客户机进行使用,并且只要该地址分配出去就不能将该地址再次分配给其它客户机再次使用了,而且该地址就永远属于对应的那个客户机了,即服务器在分配给客户机地址的时候是动态分配的,但是地址分配之后,服务器就会标记该地址,之后该地址就永远的属于对应的客户机了,服务器是通过对应客户机网卡上的MAC地址来标记分配出去的ip地址的,服务器分配一个ip地址就会使用对应客户机网卡上的MAC地址和分配出去的ip地址建立关联关系,以后只要是已经在服务器内部建立了关联关系之后的对应MAC地址的客户机再来服务器上面申请地址的话,服务器就会将对应的ip地址分配给它,即实现了将ip地址保留给被分配的客户机永久使用,现在客户机有了ip地址,那么接下来客户机就可以和服务器进行通信了,客户机上面的网卡是智能的,这种特殊的网卡能够实现自动将服务器上面的操作系统加载进客户机的内存中并启动起来,从而达到启动操作系统的目的,但是这种方法获取ip地址有一个缺陷,一旦客户机从服务器上面获取了一个ip地址,以后客户机再向服务器申请ip地址的时候获取的还是同一个地址,而且该地址也只能归这一台客户机所使用,因此客户机永远都得依靠地址来引导操作系统,并且该地址还可以标记我们客户机的操作系统在服务器上面的安装位置,像这种能够实现ip地址的动态分配,但仅仅是在客户机第一次申请ip地址时的动态分配而已,并且可以引导客户机正常启动的机制就叫做bootp。


    但是后来随着计算机的发展,每一个计算机都可以拥有自己的硬盘了,也就意味着工作站中的每一个客户机都可以自己安装操作系统,并且即使客户机没有ip地址,也可以启动操作系统并且使用,但是尽管如此,我们一个局域网内部的主机数量可能会非常的多,如果我们期望这么多主机可以互相进行通信的多,每一个主机还是得拥有自己的ip地址,为了方便管理局域网内部客户机的ip地址,就有了BOOTP的增强版DHCP的出现。

·DHCP

    DHCP引入了一个BOOTP没有的概念,叫做lease(租约)。

·lease

    我们知道dhcp服务器可以给客户机动态分配ip地址,客户机可以使用该ip地址,但是不像bootp那样可以永久使用,而是有使用期限的,这个使用期限就是lease,当客户机的租约到期的时候通过dhcp协议动态获取的ip地址就会重新被释放到dhcp服务器的地址池中,一旦有其他客户机向服务器申请地址的时候,那么该地址就可以重新被分配给其它客户机进行使用,就和租房子是一个道理,dhcp的概念原本就是需要就分配,不需要就回收,在某台客户机的租约到期之后,如果客户机还想继续使用这个地址的话还可以进行续租,但是当客户机的租约到达二分之一的时候就得决定是否进行续租,比如说某个ip地址允许某台主机使用的租约是两个小时,要想续租的话,那么客户机在到达一个小时的时候就得向服务器发起续租请求,续租成功后,剩余的一个小时就会变为两个小时,相当于延长了一个小时,即一次续租只能延长二分之一租约的时间,但是如果在到达二分之一租约的时候,客户机向服务器发起续租请求,而服务器没有响应的时候,那么客户机就会在在接下来的二分之一的时间内再走过二分之一时间的时候即四分之一租约时继续发起请求,如果得到响应那么租约就会继续变为两个小时,如果还没有得到响应,那么客户机就会在时间走过八分之一租约的时候继续发起请求,依次类推,知道租约到期,如果客户机还是得不到服务器的响应的话,它就会将该地址释放掉,并重新申请其他的ip地址。


    在同一个局域网中,客户机获取ip地址的请求是以广播的形式发送的,如果在我们的局域网中同时有多个dhcp服务器都可以给客户机提供ip地址,那么我们的客户机应该选择哪个服务器提供的ip地址呢?一般是哪个服务器响应的快,客户机就会选择哪个服务器提供的ip地址,所以客户机一般使用第一个响应的dhcp服务器提供的ip地址,以上就是dhcp协议工作的基本过程。

·一台客户机在配置网卡的时候至少需要配置几个属性

    1,首先ip地址和掩码是必须的,只有ip地址没有掩码是不行的,如果没有掩码我们就无法判断远程主机和本地主机,所以一般ip地址和掩码是成对出现的。

    2,网关不是必须配置的,没有网关我们无非就是不能和外网进行联系而只能进行本地通信而已。

    3,DNS服务器地址没有也是可以的。

    所以对一个局域网内的客户机来说,最重要的TCP/IP属性就是ip地址和子网掩码,不过通常还得提供网关地址和DNS服务器的地址。


    那么很显然dhcp服务器至少得给我们的客户机提供ip地址和子网掩码,那么dhcp服务器到底能给哪些主机提供ip地址和子网掩码,而且这些地址中有多少个是可用的,这些都是事先规划好的,像这样能够事先规划好提供给外部客户机使用的地址空间列表我们称之为地址池。

    那么同一个局域网中。客户机查找dhcp服务器的方式到底是怎样的呢?其实就是通过广播的方式,局域网内的dhcp服务器收到该请求后就会发起响应,但是由于此时客户机没有ip地址而只有MAC地址,故服务器的响应也是以广播的形式发送的,但是如果局域网内部有多个dhcp服务器存在,客户机决定使用哪个服务器提供的地址也得广播发送,被使用地址的服务器在得到客户机使用自己的地址的广播后,还得广播发送一个确认信息,而另一台没有被使用地址的服务器则不发送任何消息,故dhcp服务器分配ip地址给客户机的整个过程都是以广播的形式进行的,只不过不同的阶段发送的是不同的报文而已:

    第一阶段

        客户机以广播的形式在局域网内发起获取ip地址的请求,这个阶段客户机没有ip地址,但是还是得将数据封装成为对应协议的报文,一般是基于UDP协议的报文,而且该报文的名字叫做DHCPDISCOVER(DHCP的发现报文)。

    第二阶段

        服务器以广播的形式在局域网内向客户机发送相关数据报文,这个报文叫做DHCPOFFER。

    第三阶段

        客户机广播发送确认使用某台服务器提供的ip地址等信息的报文,这个报文叫做DHCPREQUEST。

    第四阶段

        服务器广播发送确认报文,这个报文叫做DHCPACK。

    以上四个报文都是以广播的形式发送的,但是客户机的租约到期后,客户机寻求续租时候向服务器发送的报文的形式是单播。

    续租阶段

        客户机向对应dhcp服务器单播发送续租请求,此时的数据报文叫做DHCPREQUEST,服务器同样以单播的形式响应该请求,并且发送一个DHCPACK报文,如果客户机在发送完成DHCPREQUEST之后得不到服务器的响应,那么它就会隔一段时间之后继续向服务器发起请求,直到租约到期客户机才会释放掉该地址并重新广播发送DHCPDISCOVER报文。

    所以dhcp的整个地址的获取过程都是以广播的形式进行的,而只有续租的过程是单播的。


    我们知道路由器隔离的是广播域,它是不会帮我们转发广播包的,由此dhcp服务无法跨物理网络进行实现,但是我们可以通过将路由器配置成为dhcp的中继器(relay)来实现跨物理网络的dhcp服务器动态地址分配。假设我们公司内部有三个部门,而且三个部门的网络是使用同一个路由器连接起来的,并且只有其中一个部门里面配置有dhcp服务器,如果要想使得其它部门也可以使用dhcp服务的话,我们只需要将路由器配置称为dhcp中继器即可,这时如果其它部门里的主机要想通过dhcp服务器动态获取ip地址的话,就会以广播的形式在部门局域网内发起请求,路由器在收到该请求后以单播的形式将该请求转发至dhcp服务中去,接下来服务器在接收到该请求后会以单播的形式将DHCPOFFER发送给路由器,然后路由器再以广播的形式发送到发起请求的那个部门的局域网里,接下来客户机再以广播的形式发送DHCPREQUEST,路由收到后继续以单播的形式转发给dhcp服务器,接下来dhcp服务器再以单播的形式将DHCPACK发送给路由器,最后由路由器以广播的形式发送到对应部门的局域网里,这样就实现了即便我们的局域网里面没有dhcp服务器,那么也可以借助于其它局域网中的dhcp服务器进行工作了,但是不管怎样,我们的dhcp服务器中必须有一个地址池提供给本地客户机进行使用,并且该地址池中的地址必须和dhcp服务器的地址处于同一个网段,这是用来表明dhcp服务器就是给本地网络提供服务的,否则的话dhcp服务器会出错,此外dhcp服务器中可以再维护一个地址池来给外部网络提供服务,而且来自外部网络中的客户机只会到属于自己局域网的地址池中进行地址的申请,那么它是怎么做到这一点的呢,这一点是由路由器完成的,路由器在转发请求的时候会给dhcp服务器标记这是属于哪一个网络的请求。

·如何配置一台DHCP服务器给本地主机提供ip地址、掩码、网关以及DNS服务器的地址

    我们学习配置DHCP的主要目的是为了学习PXE技术。

·保留地址

    假设我们公司内部没有远程网络,全部都是本地网络,公司内部有很多台客户机,还有一台dhcp服务器和一台文件服务器,而且这些客户机通常都会访问这个文件服务器去下载一些文件进行使用,所以这台文件服务器的ip地址三天两头的变动肯定是不合适的,故我们应该给这台文件服务器配置一个固定的ip地址,那就意味着我们得通过dhcp服务器给这台文件服务器分配一个静态的ip地址,这种地址我们称之为保留地址,即该地址是永远保留给某一特定主机使用的ip地址,但是保留地址不可以使用dhcp服务器中的地址池中的地址,而应该使用地址池以外的地址,而且该地址也应该和我们的dhcp服务器的ip地址处于同一个网段,并且该地址是依靠MAC地址来识别对应的客户机的。


    dhcp的服务端软件包的名称就叫做dhcp,和DNS的软件包一样,它也是由ISC提供的,但是我们这里同样使用rpm包来安装,首先我们使用yum命令来查看和dhcp相关的软件包都有哪些:

    DHCP服务

    dhcp.i386就是dhcp服务端的rpm包,我们使用yum命令安装这个软件包就可以了,安装完成之后我们可以使用rpm命令来查看安装完成该软件包之后都生成了哪些文件:

    

[[email protected] ~]# rpm -ql dhcp
/etc/dhcpd.conf
/etc/rc.d/init.d/dhcpd #这个是dhcpd服务的控制脚本
/etc/rc.d/init.d/dhcrelay #这个是dhcrelay服务的控制脚本
/etc/sysconfig/dhcpd #这个是dhcpd服务控制脚本的配置文件
/etc/sysconfig/dhcrelay #这个是dhcrelay服务控制脚本的配置文件
/usr/bin/omshell
/usr/sbin/dhcpd #这个就是dhcp服务端的程序
/usr/sbin/dhcrelay #这个就是dhcp中继器,所以我们在安装了dhcp服务端软件之后,也可以将dhcp
                   #服务器作为dhcp中继器来使用,我们只需要启用dhcrelay功能即可,一般来
                   #讲dhcrelay和dhcpd功能不可以同时启用,这就是dhcp服务端软件包的名字叫做
                   #dhcp而不叫做dhcpd的原因,因为服务端软件包提供了两个功能,一个dhcpd,
                   #一个dhcrelay,对我们而言,只使用dhcpd就可以了  
/usr/share/doc/dhcp-3.0.5
/usr/share/doc/dhcp-3.0.5/IANA-arp-parameters
/usr/share/doc/dhcp-3.0.5/README
/usr/share/doc/dhcp-3.0.5/RELNOTES
/usr/share/doc/dhcp-3.0.5/api+protocol
/usr/share/doc/dhcp-3.0.5/dhcpd.conf.sample
/usr/share/doc/dhcp-3.0.5/draft-ietf-dhc-authentication-14.txt
/usr/share/doc/dhcp-3.0.5/draft-ietf-dhc-dhcp-dns-12.txt
/usr/share/doc/dhcp-3.0.5/draft-ietf-dhc-failover-07.txt
/usr/share/doc/dhcp-3.0.5/ja_JP.eucJP
/usr/share/doc/dhcp-3.0.5/ja_JP.eucJP/dhclient-script.8
/usr/share/doc/dhcp-3.0.5/ja_JP.eucJP/dhclient.8
/usr/share/doc/dhcp-3.0.5/ja_JP.eucJP/dhclient.conf.5
/usr/share/doc/dhcp-3.0.5/ja_JP.eucJP/dhclient.leases.5
/usr/share/doc/dhcp-3.0.5/ja_JP.eucJP/dhcp-eval.5
/usr/share/doc/dhcp-3.0.5/ja_JP.eucJP/dhcp-options.5
/usr/share/doc/dhcp-3.0.5/rfc1542.txt
/usr/share/doc/dhcp-3.0.5/rfc2131.txt
/usr/share/doc/dhcp-3.0.5/rfc2132.txt
/usr/share/doc/dhcp-3.0.5/rfc2485.txt
/usr/share/doc/dhcp-3.0.5/rfc2489.txt
/usr/share/doc/dhcp-3.0.5/rfc951.txt
/usr/share/man/man1/omshell.1.gz
/usr/share/man/man5/dhcp-eval.5.gz
/usr/share/man/man5/dhcp-options.5.gz
/usr/share/man/man5/dhcpd-eval.5.gz
/usr/share/man/man5/dhcpd-options.5.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
/var/lib/dhcpd
/var/lib/dhcpd/dhcpd.leases #我们将地址池中的某个地址分配给哪个客户机使用了得进行记录
                            #这些记录就保存在这些文件里面
[[email protected] ~]#

    dhcp服务端的配置文件是/etc/dhcpd.conf:

    DHCP服务

    由上图知,该文件是空的,不过它给我们留了一条线索,我们可以将这个模板覆盖为我们的配置文件:

    DHCP服务

    该配置文件内容如下:

  1 ddns-update-style interim; #该行表示动态DNS的更新方式,动态DNS指的是,一般情况下,
                               #DNS服务器中的区域文件中的资源记录是不会轻易改变的,但是
                               #如果我们的客户机使用dhcp服务器动态获取的ip地址的话,那么
                               #我们主机的ip地址就很有可能会经常变动,这样一来,DNS服务器
                               #中有关我们主机的资源记录就会失效,因此我们的主机就无法在
                               #互联网上面得到解析,因此动态DNS指的是dhcp服务器在每一次
                               #分配ip地址的时候,如果我们主机的地址发生了改变,dhcp服务
                               #器就会动态的去通知DNS服务器去修改区域文件中资源记录的内
                               #容,但是这样做会带来一个非常大的安全隐患,如果有人恶意的
                               #通过精巧的设计,将DNS服务器中我们的域名对应的ip地址,改为
                               #它的主机的ip地址,这样一来,用户在访问我们的域名的时候就
                               #访问到它的主机上去,这样一来对用户就非常的危险,这其实
                               #是一种***DNS的方法,还有一种方法叫做缓存毒化,因此动态
                               #DNS功能我们一般都不启用,因为它非常的危险,动态DNS常用
                               #的方式一共有三种,但是另外两种都已经废弃了,因此只使用
                               #interim这一种方式就可以了。
  2 ignore client-updates; #该行表示是否忽略客户端的更新,这仍然是配合动态DNS使用的,指的
                           #是如何更新DNS服务器上面的数据的,这两行我们可以不用管
  3 #一下使用#注释起来的内容是配置文件的格式,该配置文件有两种格式的参数,一种是:
          #option    参数    参数的值
    #另一种是:
          #参数    参数的值
  4 subnet 192.168.0.0 netmask 255.255.255.0 { #subnet参数表示子网,用来定义地址池列表,
                                               #我们可以定义多个子网,但是本地地址池的网
                                               #段必须要和我们dhcp服务器的网卡中的地址
                                               #在同一个网段中,这是必须的,否则dhcp服务器
                                               #无法启动
  5 #option表示给子网配置一些额外的选项
  6 # --- default gateway
  7     option routers          192.168.0.1; #routers表示默认网关,dhcp服务器可以向客户机
                                             #提供网关
  8     option subnet-mask      255.255.255.0; #subnet-mask表示子网掩码
  9 
 10     option nis-domain       "domain.org"; #nis-domain表示nis域,这个参数我们用不到,
                                              #可以注释掉
 11     option domain-name      "domain.org"; #domain-name表示域名,该参数的值表示给/etc
                                              #/resolv.conf文件中的search参数赋值,即指
                                              #定我们的搜索域
 12     option domain-name-servers  192.168.1.1; #domain-name-servers参数表示DNS服务器的
                                                 #地址,如果有多个地址,则使用逗号隔开
                                                 #但是对于Linux主机而言最多只能有三个DNS
                                                 #服务器的地址
 13 
 14     option time-offset      -18000; # Eastern Standard Time #time-offset表示时间偏移
                                                                #值,用来定义我们的时区
 15 #   option ntp-servers      192.168.1.1;
 16 #   option netbios-name-servers 192.168.1.1;
 17 # --- Selects point-to-point node (default is hybrid). Don't change this unless
 18 # -- you understand Netbios very well
 19 #   option netbios-node-type 2;
 20 
 21     range dynamic-bootp 192.168.0.128 192.168.0.254; #range参数表示范围,具体指的是
                                                         #地址池,即指定起始地址和结束地址
                                                         #range参数后面的地址值表示的都是
                                                         #可以分配出去的ip地址,Linux主机
                                                         #的dhcp服务器分配地址的时候是从
                                                         #大到小分配的,即从最后一个ip地址
                                                         #开始分配,而Windows则正好相反
 22     default-lease-time 21600; #default-lease-time参数表示默认租约长度,单位是秒钟
 23     max-lease-time 43200; #max-lease-time参数表示最大租约长度,单位是秒钟
 24 
 25     # we want the nameserver to appear at a fixed address
 26     host ns { #host参数用来定义保留地址,host是我们自己定义保留地址给某个主机的,ns
                  #只是一个标识符,没有意义,是我们用来识别客户端的一个字符串而已
 27         next-server marvin.redhat.com; #next-server参数表示下一个服务器,下一个服务器
                                           #主要是用于PXE当中的,用于向客户端提供文件
                                           #服务器,用来指定哪台主机是文件服务器,并且
                                           #能够通过该文件服务器获取引导文件
 28         hardware ethernet 12:34:56:78:AB:CD; #hardware ethernet参数用来指定客户机的
                                                 #MAC地址
 29         fixed-address 207.175.42.254; #fixed-address参数表示给客户机的保留地址是什么
 30     }
 31 }

    接下来我们就可以根据我们的需求来配置该文件了:

    ->配置dhcp服务器地址池的的网络地址和子网掩码:

        DHCP服务

    ->配置客户机的网关地址和客户机的子网掩码:

        DHCP服务

    ->配置本地网络的域名和DNS服务器的地址:

        DHCP服务

    ->time-offset使用默认的值

    ->配置dhcp服务器地址池可用地址段:

        在指定range的时候,我们将range后面的dynaminc-bootp去掉,因为我们现在使用的不是dynamic-bootp协议,我们使用的是dhcp协议:

        DHCP服务

    ->默认租约期限和最长租约期限都是用默认值

    ->保留地址我们可以先注释掉,暂时还使用不到:

        DHCP服务

    该配置文件中的每一行都得使用分号结尾,没有分号会造成语法错误,由此我们的dhcp服务器就算简单的配置完成了,接下来启动dhcpd服务即可:

    DHCP服务

    dhcp服务是基于UDP协议工作的,并且监听在UDP协议的67号端口上,但是dhcp的客户端也有监听的套接字,这是因为服务端会向客户端发送租约响应报文,所以客户端也应该监听一个端口,dhcp客户端监听在UDP协议的68号端口上,现在我们的服务已经启动,接下来我们可以使用netstat命令来查看67号端口是否被监听:

    DHCP服务

    接下来我们可以使用一个本地客户端来测试我们的dhcp服务器是否可以正常工作,将客户端获取ip地址的方式改为dhcp即可:

    DHCP服务

    接下来重启客户端的网络服务:

    DHCP服务

    成功!

·如何给客户机提供一个保留地址

    编辑dhcpd的配置文件/etc/dhcpd.conf,将刚刚注释的host全部打开,然后根据客户机的MAC地址进行配置,00:0C:29这是Vmware虚拟机固定的MAC地址前缀,然后配置保留地址,该地址一定不可以是地址池中的地址,接下来重启服务端的dhcpd服务,重启客户机的网络服务即可:

    DHCP服务

    DHCP服务

    DHCP服务

    成功!

    保留地址的优先级,客户机会优先获取保留地址,哪台dhcp服务器提供的是保留地址,客户机就会优先使用哪个。

·/var/lib/dhcpd/dhcpd.leases

    该文件中保存我们刚刚动态分配给客户机的地址信息:

    DHCP服务

    由上图知,没有保留地址的相关信息,/var/lib/dhcpd/dhcpd/leases~该文件中也保存着相关的信息:

    DHCP服务


    Vmware中的VMnet0表示桥接网络,VMnet1表示Host-only网络,VMnet8表示NAT模式的网络,其余的都表示的是私有网络,物理机也无法进入的私有网络。

·dhclient

    该命令是dhcp的客户端命令,使用-h选项可以查看该命令的用法:

    DHCP服务

    我们现在在客户机上面使用ifconfig命令将原有的ip地址释放掉,然后在客户机上面使用dhclient命令就可以重新获得ip:

    DHCP服务

    但是dhclient命令不可以使用两次,因为执行该命令之后它就会成为一个在后台执行的进程:

    DHCP服务

    我们得使用killall命令将这个进程杀死,之后再重新执行该命令即可:

    DHCP服务

    -d选项可以让该命令工作在前台,而且可以使用ctrl+c进行中断:

    DHCP服务

    dhco服务器还可以根据客户机的操作系统和网卡地址对客户机的来源进行分类。