服务器架设篇 - RedHat 9

第十六章、简易 DHCP 服务器设置

Dynamic Host Configuration Protocol 主机的设置问题

最近更新时间: 2003/03/15

本文数据主要针对 RedHat 9 的系统进行说明,要注意的是,RedHat 9 与 Red Hat Enterprise Linux (RHEL) 是完全不同的东西!RedHat 9 在 2003 年推出,在 2004 年就不再维护了!这部份网站更新到 2005 年,也没有再维护过! 因此,建议您前往本站查找最新版本的 Linux distribution 文章来阅读,比较不会浪费时间。那为何还需要编辑 RedHat 9 的数据呢? 鸟哥只想要做个自己曾经撰写过的文档内容保存而已啰! ^_^!最新文章请前往鸟站首页查阅啰!
如果您在工作单位使用的是笔记本电脑,而且常常要带着您的笔记本电脑到处跑,那么由前几章的『连上 Internet 』设置当中,会发现,哇!我的网络卡参数要常常修改啊!而且,每到一个新的地方,就得问清楚该地的 Server 提供的网络参数才行!真是麻烦~~这个时候,动态主机设置协定 (DHCP) 可就大大的派上用场啦!DHCP 这个服务器可以自动的分配 IP 与相关的网络参数给 Client 端,来提供 Client 端自动以主机提供的参数来设置他们的网络,如此一来,用户只要将自己的 Notebook 设置好经由 DHCP 协定来取得网络参数后,一插上网络线,呵呵!马上就可以享受 Internet 的服务啦!很方便吧!所以得来瞧一瞧这个好用的协定喔!

原理:

    老规矩,在正式的进入 DHCP (Dynamic Host Configuration Protocol ) 主机设置之前,我们先来认识一下 DHCP 这个协定吧!还有,需要了解的是,我们是否有需要『一定』得设置 DHCP 这个服务器呢?这里都需要厘清一下概念喔!
     

    什么是 DHCP


     
    在开始 DHCP 的说明之前,我们先来复习一下之前在『网络基础』里面提到的几个网络参数吧!要设置好一个网络的环境,使电脑可以顺利的连上 Internet ,那么您的电脑里面一定要有底下几个网络的参数才行,分别是:
     
    • IP
    • netmask
    • network
    • broadcast
    • gateway
    • DNS IP
     
    其中,那个 IP, netmask, network, broadcast 与 gateway 都可以在 /etc/sysconfig/network-scripts/ifcfg-eth[0-n] 这些个文件里面设置,DNS 的地址则是在 /etc/resolv.conf 里头设置。呵呵!只要这几个项目设置正确,那么电脑应该就没问题的可以上网了!所以说,您家里面的 3, 4 部电脑,您都可以手动的来设置好您所需要的网络参数,然后利用 NAT 主机的功能,就可以大摇大摆的 连上 Internet 了!真是不错 ^_^,不是吗?
     
    好了,现在让我们换一个大一些些的场景吧!假设您是学校宿舍的网络管理员,所管理的学生电脑大概有 100 部好了,那么您怎么设置好这 100 部的电脑呢?
     
    1. 直接每一部电脑都让您登门拜访手动的去设置好?
    2. 将所有的学生都集合起来,然后精神训话.....喔不!是直接教导一下怎么设置?还是
    3. 借由一部主机来自动的分配所有的网络参数给宿舍内的任何一部电脑?
     
    这三种解决方案所需要的时间都不相同,如果您选择的是(1),那么我个人认为,您不是工作狂就是疯掉了,因为所要花费的时间与您所得的薪水与付出的心力是完全不成比例的~~如果选择是(2)那么很可能您会被挂上独裁者、没良心的管理员的称号!如果是选择(3)呢?恭喜您!这个方案的管理时间花费最短,也是最不麻烦的作法啦!
     
    呵呵!知道我要说些什么了吗?是的!这个 DHCP ( Dynamic Host Configuration Protocol ) 主机最主要的工作,就是在进行前面提到的第三个方案,也就是自动的将网络参数正确的分配给网域中的每部电脑,让 Client 端的电脑可以在开机的时候就立即自动的设置好网络的参数值,这些参数值可以包括了 IP、netmask、network、gateway 与 DNS 的地址等等。如此一来,呵呵!身为管理员的您,只要注意到这一部提供网络参数的主机有没有挂掉就好了,其他同学们的个人电脑,哈!您想都不必想要怎么去帮忙!因为 DHCP 主机已经完全都帮您搞定啦! ^_^! 阿!当管理员最大的幸福就是可以喝喝茶、聊聊天就能控管好一切的网络问题呢!
     

    DHCP 的运作方式:


     
    运作模式:
    那么 DHCP 是怎么运作的呢?现在假设我们的机器在同一个网域当中,也就是说, DHCP Server 与他的 Clients 都在同一个网段之内,可以通过软件广播的方式来达到相互沟通的状态。那么 Client 借由 DHCP Server 得到 IP 的进程为:
     
    1. 若 Client 端电脑设置使用 DHCP 协定以取得网络参数时,则 Client 端电脑在开机的时候,或者是重新启动网络卡的时候,会自动的发出 DHCP Client 的需求给网域内的每部电脑:这个时候,由于发出的消息希望每部电脑都可以接受,所以该消息除了网络卡的硬件地址(MAC)无法改变外,需要将该消息的来源软件地址设置为 0.0.0.0 ,而目的地址则为 255.255.255.255 (这个我们 Linux 会自动帮您设置,无须考虑这个问题!)。这个时候,网域内的其他没有提供 DHCP 服务的电脑,收到这个封包之后会自动的将该封包丢弃而不回应;而如果是 DHCP 主机呢?

    2.  
    3. DHCP 主机回应消息:如果是 DHCP 主机收到这个 Client 的 DHCP 需求时,那么 DHCP 主机首先会针对该次需求的消息所携带的 MAC 与 DHCP 主机本身的设置值去比对,如果 DHCP 主机的设置有针对该 MAC 做静态 IP (每次都给予一个固定的 IP )的提供时,则提供 Client 端相关的固定 IP 与相关的网络参数;而如果该消息的 MAC 并不在 DHCP 主机的设置之内时,则 DHCP 主机会选取目前网域内没有使用的 IP (这个 IP 与设置值有关) 来发放给 client 端使用!此外,需要特别留意的是,在 DHCP 主机发放给 Client 端的消息当中,会附带一个『租约期限』的消息,以告诉 Client 端,您这个 IP 可以使用的期限有多长!

    4.  
    5. Client 端接受来自 DHCP 主机的网络参数,并设置 Client 自己的网络环境:当 Client 端接受回应的消息之后,首先会以 ARP 封包在网域内发出消息,以确定来自 DHCP 主机发放的 IP 并没有被占用!如果该 IP 已经被占用了,那么 Client 对于这次的 DHCP 信息将不接受,而将再次向网域内发出 DHCP 的需求广播封包;若该 IP 没有被占用,则 client 可以接受 DHCP 主机所给的网络的参数,那么这些参数将会被使用于 client 端的网络设置当中,同时, Client 端也会对 DHCP 主机发出确认封包,告诉 Server 这次的需求已经确认!而 Server 也会将该信息记录下来;

    6.  
    7. Client 端结束该 IP 的使用权:当 Client 开始使用这个 DHCP 发放的 IP 之后,有几个情况下他可能会失去这个 IP 的使用权:
      • Client 端脱机:不论是关闭网络接口( ifdown )、重新开机 ( reboot )、关机 ( shutdown ) 等行为,皆算是脱机状态,这个时候 Server 端就会将该 IP 回收,并放到 Server 自己的备用区中,等待未来的使用;
      • Client 端租约到期:前面提到 DHCP server 端发放的 IP 有使用的期限, Client 使用这个 IP 到达期限规定的时间,就需要将 IP 缴回去!这个时候就会造成断线,而 Client 也可以再向 DHCP 主机要求再次分配 IP 啰!
     
    以上就是 DHCP 这个协定在 Server 端与 Client 端的运作状态,由上面这个运作状态来看,我们可以晓得,喝!只要 Server 端设置没有问题,加上 Server 与 Client 在硬件连接上面确定是 OK 的,那么 Client 就可以直接借由 Server 来取得上网的网络参数,当然啦,只要我们这些管理员能够好好的、正确的管理好我们的 DHCP ,嘿嘿!那么自然上网的设置就变成一件很简单的事情啦!
     
    IP 取得的方法:
    在上面的步骤里面,注意到第二步骤了吗?就是 DHCP 会去比较 MAC 这个硬件地址,并判断该 MAC 是否需要给予一个固定的 IP 呢!呵呵!所以啦,我们在 Client 端由 DHCP 主机取得的 IP 主要有两种方式:
     
    • 静态 ( Static ) IP :只要那个 client 端电脑的网络卡不换掉,那么 MAC 肯定就不会改变,由于 DHCP 可以根据 MAC 来给予固定的 IP ,所以该电脑每次都能以一个固定的 IP 连上 Internet !呵呵!这种情况比较适合当这部电脑需要用来做为提供区域内的一些网络服务的主机之用。那么如何在 Linux 上面知道您的 MAC 呢?很简单啦!有很多的方式,最简单的方式就是使用 ifconfig 及 arp 来进行:
    • [root@test root]# ifconfig eth0
      ifconfig
      eth0      Link encap:Ethernet  HWaddr 00:50:FC:22:9C:57
                inet addr:192.168.1.2  Bcast:192.168.1.255  Mask:255.255.255.0
                UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
                RX packets:333678 errors:0 dropped:0 overruns:0 frame:0
                TX packets:377219 errors:0 dropped:0 overruns:0 carrier:0
                collisions:195 txqueuelen:100
                RX bytes:42243563 (40.2 Mb)  TX bytes:278373316 (265.4 Mb)
                Interrupt:10 Base address:0x6100

      [root@test root]# arp
      Address             HWtype  HWaddress           Flags Mask            Iface
      test.linux.org      ether   00:50:FC:22:9C:57   C                     eth0
      192.168.1.100       ether   00:02:44:19:A6:AD   C                     eth0

       
    • 动态 ( dynamic ) IP:Client 端每次连上 DHCP 所取得的 IP 都不是固定的!都直接经由 DHCP 所随机由尚未被使用的 IP 中提供!
     
    除非您的局域网路内的电脑有可能用来做为主机之用,所以必需要设置成为固定 IP ,否则使用动态 IP 的设置比较简单,而且使用上面具有较佳的弹性。怎么说呢?假如您是一个 ISP 好了,而您只申请到 150 个 IP 来做为您的客户连接之用。那么您是否真的只能邀集到 150 的用户?呵呵!当然不啰!我可以邀集 200 个用户以上呢!为什么?这样想好了,我今天开了一家餐馆,里面只有 20 个座位,那么是否我一餐只能卖给 20 个人呢?当然不是啦!因为客人是人来人往的,有人先吃有人后吃,所以同样是 20 个座位,但是可以有 40 个人来吃我的简餐,因为来的时间不一样嘛!了解了吗?呵呵!对啦!您这个 ISP 虽然只有 150 个 IP 可以发放,但是因为您的用户并非 24 小时都挂在在线的,所以您可以将这 150 个 IP 做良好的分配,让 200 个人来『轮流使用』这 150 个 IP 哩!
     
    好了,那么另外一个问题,还是搞不懂什么是『静态 IP 』与『动态 IP』呢?不都是由 DHCP 发放的吗?让我们再来谈一个小例子好了。目前(2003年)上网的主流是 ADSL 拨接制这种方法,其中,由于拨接制所以每次上线的 IP 都不一样!这可以想成是 DHCP 的 动态 IP 分配方式!那么如果您是使用 GIGA 的拨接制给予的固定 IP 呢?呵呵!那个方式其实还是使用拨接之后才能得到连接啦!只不过 ISP 经由 PPP 协定当中的密码来判断用户,让同一个用户每次都可以收到一个固定的 IP 而已!这样可以理解了吗?呵呵!您可以想成,拨接到 ISP 就是类似 client 端发送一个 DHCP 的需求给 DHCP 主机,而将 GIGA 想成我们 DHCP 里面的固定 IP 分配方式,而 Seednet 之类的 ISP 动态给予 IP 的,就是 DHCP 里面使用的 dynamic IP 分配方式啦! ( 注:其实在软件地址亦即是 IP 上面,只有 Public IP 与 Private IP 两种,中文翻译成『公共 IP』与『私有 IP』这两个,至于其他所谓的『静态 IP』、『实体 IP』、『虚拟 IP』、『浮动式 IP』等等,都是借由一些 IP 取得的方式来分类的,对于此种分类方式可能会造成读者的困扰,所以,请特别留意这些 IP 的意义,不要搞混了!如果还是害怕会搞不清楚,那么只要先记得『公共 IP』是可以直接与 Internet 相互沟通的,至于『私有 IP』则是不能直接与 Internet 沟通的内部 IP 段!)
     
    关于租约的行为:
    怪了!如果我们观察上面 DHCP 运作模式的第二个步骤,您会发现最后面还有一个租约期限!干嘛还要这样的一个期限呢?其实设置期限还是有个优点啦!最大的优点就是可以避免该 IP 被某些用户一直占用着,但该用户却是 Idle ( 发呆 ) 的状态!举个例子来说,我们刚刚不是说到,我有 150 个 IP ,但是偏偏我有 200 个用户嘛!那么假设刚好例如 2002 年的世界杯足球赛好了,每个用户都急着上网知道消息,那么将会达到交通尖峰时段!也就是说,这 200 个人同时要来使用这 150 个 IP ,有可能吗?当然不可能!肯定会有 50 个人无法连接,因为『很抱歉!目前系统正在忙线中,请您稍后再拨!』那怎么办?这个时候租约到期的方式就很有用处啦!那几个已经连接进来很久的人,就会因为租约到期而被迫脱机,这个时候该 IP 就会被释放出来,哈哈!大家赶快抢呀!先抢到先赢喔!所以,那 50 个人 ( 包括被迫脱机的那个朋友 ) 只好继续的、努力的、加油的来进行 DHCP 的要求啰! ^_^""
     
    虽然说是优点,但是其实如果站在用户的角度来看,还是可能会造成公愤的!凭什么大家一起交钱,我先连接进来就需要先被踢出去?~呵呵!这个在早期 Hinet 就是这点被骂的要死!为什么呢?因为他的 ADSL 拨接制,似乎真的就有这个租约到期的问题,限制的时间似乎是 24 小时的样子!所以,使用 Hinet ADSL 拨接制的朋友,每 24 小时就要忍受一次断线!我没有使用过 Hinet 的 ADSL 拨接制,网络上的朋友确实有回应这样的事情,但是我不确定现在( 2003/03/15 )Hinet 是否还是用这套设置值?这样您可以了解租约到期的行为了吗?! ^_^
     
    关于 DHCP 主机个数:
    或许您曾经发现过一件事情,那就是,当我的网域里面有两部以上的 DHCP 主机时,到底哪一部主机会设置我的这部 Client 端电脑?呵呵!很抱歉,俺也不晓得!因为在网络上面,很多时候都是『先抢先赢』的,同样的, DHCP 的回应也是如此!当 Server1 先回应时,您使用的就是 Server1 所提供的网络参数内容,如果是 Server2 先回应,您就是使用 Server2 的参数来设置您的 PC !不过,前提之下当然是这些电脑的『物理连接』都是在一起的啊!
     

    什么时候需要 DHCP ?


     
    什么时候才需要架设 DHCP 呢?是否每个人都最好架设一部 DHCP 主机呢?那可就见仁见智啦!接下来要告知大家的是几个概念性的问题,您倒不一定『必需』遵守底下的一些概念呢!反正,自己的网域自己『爽』就好啦!
     
    • 什么时候最好使用 DHCP ?

    • 在某些情况之下,倒是强烈的建议架设 DHCP 主机的!什么情况呢?例如:
       
      1. 您的公司内部很多 Notebook 电脑使用的场合!因为这种 NoteBook 本身就是移动性的设备,如果每到一个地方都要去问人家『喂!您这边的网络参数是什么?』还得要担心是否会跟人家的 IP 相冲突等等的问题!这个时候,DHCP 可就是您的救星啰!因为 Notebook 在使用上,当设置为 DHCP client 的时候,那么只要他连接上的网域里面有一部可以动作的 DHCP ,那么那部 notebook 就可以连接上 Internet 了!真好,不是吗?!

      2.  
      3. 网域内电脑数量相当的多时:另外一个情况就是您所负责的网域内电脑数量相当庞大时,大到您没有办法一个一个的进行说明来设置他们自己的网络参数,这个时候为了省麻烦,还是架设 DHCP 来的方便呐!况且,维护一部您熟悉的 DHCP 主机,要比造访几十个不懂电脑的人要简单的多哩!^_^
       
    • 什么情况下不建议使用 DHCP 主机?

    • 虽然 DHCP 有很多好处,但是您有没有发现一个步骤怪怪的呀!回头看一下那个步骤一, Client 在开机的时候会主动的发送消息给网域上的所有机器,这个时候,如果网域上就是没有 DHCP 主机呢?很抱歉,那么您的这部 Client 端电脑,『仍然会持续的发送消息!』真正的时间与次数我不晓得会有多久,不过,肯定会超过 30 秒以上,甚至可以达到一分钟以上!哇!那么这段时间您能干嘛?呵呵!除了等、还是等!所以啰,如果电脑数不多,还是使用手动的方式来设置一下就好了!方便嘛!
       
      1. 在您网域内的电脑,有很多机器其实是做为主机的用途,很少 Client 需求,那么似乎就没有必要架设 DHCP ;

      2.  
      3. 更极端的情况是,像一般家里,只有 3 ~ 4 部电脑,这个时候,架设 DHCP 只能拿来练练功力,事实上,并没有多大的效益;

      4.  
      5. 当您管理的网域当中,大多网络卡都属于老旧的型号,并不支持 DHCP 的协定时;

      6.  
      7. 很多用户的信息知识都很高,那么也没有需要架设 DHCP 啦。
     
    如前所述,上面的都是概念性的说法,事实上,一件事情的解决之道是有很多的方案的,没有所谓的『完全正确』的方案,只有『相对可行、并且符合经济效益与功能』的方案!所以啰,架设任何网站之前,请先多评估评估呐!

套件安装:

在 Linux 上面 DHCP 套件的安装也是很简单的,不需要以 Tarball 来安装啦!直接拿出您的原版光盘, mount 他,并且找到 dhcp 字样的套件,使用 RPM 安装好就好了!以 mandrake 9.0 及 Red Hat 9 为例的话,您需要的 DHCP 套件为:
 
# 在 Mandrake 9.0 当中:
[root@test root]# rpm -qa | grep dhcp
dhcp-server-3.0-1rc9.2mdk
dhcp-common-3.0-1rc9.2mdk
dhcp-client-3.0-1rc9.2mdk
 
# 在 Red Hat 9 当中:
[root@test root]# rpm -qa | grep dhcp
dhcp-3.0pl1-23
dhcp-devel-3.0pl1-23
 
看到了吧!我们需要的套件在不同的 Linux 版本上面会有些许的差异喔!如果是 Mandrake 系列的话,DHCP 套件文件总数会有三个啰!如果没有安装的话,请拿出您的原板光盘(不论是那个 Linux distribution ,应该都是这三个套件名称啦!只是后面的版本可能不一样就是了!但是,需要注意的是,在 Red Hat 上面,这三个套件被集成成为一个,亦即是 dhcp-xxxx.rpm 的文件就是了!),先挂载上去,然后就以 rpm 给他安装啦!什么?不知道如何搞定 RPM ?唉啊!又得拿出『鸟哥的 Linux 私房菜 -- 基础学习篇』好好的 K 一 K 『 RPM 与 Tarball 的使用』。另外,如果在系统当中没有找到 dhcp 套件的话,还可以使用前面 网络升级套件 章节提到的 apt-get 或者是 urpmi 都是很好的安装方式呐! ^_^

设置 DHCP Server:


    DHCP 套件结构
     
    在 DHCP 的套件结构当中,也是仅有一个设置档。这个设置档不见得会存在喔!也是需要我们手动来创建的呐!谈一谈先:
     
    • /etc/dhcpd.conf:这个就是 dhcp 的主要设置档咯!这个文件不见得会存在,请手动来创建喔!另外,其实每个 dhcp 套件在发布的时候,都会附上一个范例文件,您可以使用 rpm -ql grep dhcp 来查找到 dhcpd.conf.sample 这个文件呐!然后将该文件拷贝成为 /etc/dhcpd.conf 后,在手动去修改 /etc/dhcpd.conf 即可,这样设置比较容易咯!(注:这个设置档在不同的 Linux distribution 当中会有不一样的放置目录喔!例如在 openlinux 底下,这个设置档缺省需要放置在 /etc/dhcpd/dhcpd.conf 呢!)

    •  
    • /usr/sbin/dhcpd:这个就是 DHCP 的 daemon 运行档啰!

    •  
    • /var/lib/dhcp/dhcpd.leases:这文件颇有趣的!我们前面原理部分不是有提到『租约』吗?呵呵!租约的启始与到期日就是记录在这个文件当中的咯!
     
    整个 DHCP 的设置档与检查的文件就是这几个而已,很简单吧!^_^
     

    主机的规划技巧
     
    如果您的机器仅要提供 DHCP 的服务的话,那么真的一部 P-133 MMX 的 586 主机就很足够了!而且 partition 的规划不是很重要,因为 DHCP 主机并不会使用到硬盘空间,最多仅只是那个租约到期的纪录档而以(/var/lib/dhcp/dhcpd.leases)。
     

    设置流程
     
    好不容易!终于到了要架设 DHCP Server 的时候了,哇!好感动.....咦!鸟哥怎么老是在唱单口相声.... @_@。其实要设置好一个 DHCP 主机还真是蛮简单的,只要设置一个文件即可!但是前面的确认工作请先仔细的查验好!
     
    1. 确认硬件的连接没有问题:

    2. 这可是架设网站的第一个重点!如果您的硬件没有搞定,那么软件再怎么厉害,呵呵!也是没有用的啦!目前我的架构就像底下这样,我的 Linux 主机上面有两张网络卡,一张对内一张对外喔!
       
    3. 确认 dhcp 相关设置文件摆放的路径:

    4. 请您特别留意的是,不同的 Linux distribution 中,每个套件的设置档放置的位置都不相同,例如 OpenLinux 使用的 dhcp 设置档放置在 /etc/dhcpd/dhcpd.conf ,而 Red Hat 与 Mandrake 则放在 /etc/dhcpd.conf 里头!那么我要怎么确认呢?呵呵,因为我知道设置文件与 server 有关,所以当然是查找 dhcp-server 这个套件啰,要查找设置档,可以加上 c 的参数,所以:
      [root@test root]# rpm -qc dhcp-server (在 Red Hat 使用 rpm -qc dhcp )
      /etc/dhcpd.conf.sample
      /etc/rc.d/init.d/dhcpd
      /etc/sysconfig/dhcpd
      /var/lib/dhcp/dhcpd.leases
      喝!知道那个 /etc/dhcpd.conf.sample 是范例档,注意,我们的 DHCP 设置档之文件名为 dhcpd.conf ,所以啰,马上就知道我们的设置文件即为 /etc/dhcpd.conf 啰!咦!这个文件不存在哪!没有关系,我们要自动的创建这个文件喔! 除此之外,如果您是使用 RPM 安装的 DHCP ,那么察看一下 /etc/rc.d/init.d/dhcpd 这个 scripts 的内容,也可以知道设置参数档的位置,甚至也可以修正 dhcpd.conf 的位置呢!
       
    5. 设置 dhcpd.conf 设置档:

    6. 好了,那么来到最重点啦!我们的 DHCP 就只要设置这个文件即可!那么这个文件如何设置呢?基本上,我们刚刚前面提过说, DHCP 的 IP 分配可分为给予动态 IP静态 IP ,其中,又需要了解的是,如果需要设置静态 IP 的话,那么就必须要知道要设置成静态 IP 的那部电脑的硬件地址 (MAC)才行,请使用 arp 及 ifconfig 来查知您的接口的 MAC 吧!此外,我们需要设置的项目大概有几项:
       
      • 整体设置(Global):里面含有租约期限啦、或许还有 DNS 地址与 router 的设置等等内容;
      • 动态 IP 设置:使用 subnet 的项目与 range 的参数来设置要分配出去的 IP !请先确认好您的网段喔!
      • 静态 IP 设置:使用 host 这个项目段,配合 MAC 来设置!
       
      在 dhcpd.conf 这个文件里头有些地方要特别留意:
       
      • 『#』为注解符号;
      • 除了括号那一行之外,其他的每一行后面都要以『 ; 』做为结尾!这很重要!
       
      那么我的网络环境是怎样呢?鸟哥假设是这样的喔:
       
      • 目前我的内部网段设置为 192.168.1.0/24 这一段,且 router 为 192.168.1.2 ,此外, DNS 主机的 IP 为中华电信的 168.95.1.1 及 Seednet 的 139.175.10.20 这两个;
      • 我想要让每个用户缺省租约为 3 天,最长为 6 天;
      • 我只想要分配的 IP 只有 192.168.1.21 到 192.168.1.100 这几个,其他的 IP 则保留下来;
      • 我还有一部主机,他的 MAC 是『 00:40:95:30:43:B4 』,我要给他的主机名称为 vbird-inside ,且 IP 为 192.168.1.5 这个。
       
      则,我的设置档为:
       
      [root@test root]# vi /etc/dhcpd.conf 
      # 这个文件在各家 Linux 中,可能放置的目录不同而且不见得会存在,请自行创建!

      # 再次说明,这个文件中,行首为 # 的,则为注解,且,
      # 设置的每一行之行尾,都需要 ; 符号。
      # 这个文件的设置写法主要有两种,首先是有独特的设置名称的,例如
      # default-lease-time ,
      # < 参数代号 >     < 设置内容 > ;
      # default-lease-time  259200    ;
      # 再来则是由 option 这个代号后面接的参数代码
      # option < 参数代码 > < 设置内容 >  ;
      # option domain-naim  "domain.name" ;

      # 1. Global 首先创建整体的设置值,亦即是,当 subnet 或 host 
      #  当中没有设置的,以 global 为准

      # 1.1 设置租约期限:
      default-lease-time 259200;  # 缺省的租约时间,后面接的时间为秒钟。
      max-lease-time     518400;   # 但是超过租约时间(就是 default-lease-time)
                                   # 还可续约,不过,最长还是只到 518400 秒!

      # 1.2 设置领域名称与 DNS IP 
      option domain-name   "dhcp.vbird.org" ; # 设置每部主机的后头
                          # 领域名称为 dhcp.vbird.org !
      option domain-name-servers 168.95.1.1, 139.175.10.20 ;
      # 上面这个设置在写入 DNS 的 IP ,会自动在 Client 端修改 /etc/resolv.conf
      # 文件,若有两个 DNS 的 IP 以上,那么就需要以 , 符号分隔开来!
      # 最后面还是得加上 ; 符号
      ddns-update-style ad-hoc; 
      # 在 Mandrake 9.0 这一版当中,由于加入许多新功能,所以,这一行
      # 就需要加入才行启动 DHCP ,至于在 Red Hat 当中则是加入如下行:
      # ddns-update-style interim;

      # 2. 动态 IP 分配的设置:
      subnet 192.168.1.0 netmask 255.255.255.0 {
         range 192.168.1.21 192.168.1.100;
         option broadcast-address 192.168.1.255;
         option routers 192.168.1.2;
      }
      # 动态 IP 就如同上面的设置内容,主要以 subnet 与 netmask 来进行前头的说明,
      # 亦即先声明我要的网段是哪一段,这部份就一定得要回去参考一下网络基础
      # 的部分了!千万记得呐!然后,那个 range IP1 IP2; 那一行,都以空白字符
      # 隔开即可,而 range 表示我要分配的 IP 就是在 IP1 与 IP2 这之间的 IP 段
      # 就是了!再者,我总是要给 broadcast 吧!没错!那个 
      # option broadcast-address 即是给予的 broadcast 了;至于 routers 
      # 不用说也知道那是什么了吧?所以,我们就已经含有 IP, network, netmask,
      # broadcast 与 router 啰!这样就可以顺利上网啦!至于 DNS 则是在
      # 上面 global 处已经设置啰!

      # 3. 静态 IP 的设置:
      host vbird-inside {
         hardware ethernet  00:40:95:30:43:B4;
         fixed-address 192.168.1.5;
         option broadcast-address 192.168.1.255;
         option routers 192.168.1.2;
      }
      # 静态 IP 肯定跟 MAC 有关的,所以请先查出来 MAC 吧!然后的设置您都知道啦!

       
      • 在 Global 的设置当中,也就是不在 subnet 与 host 的括号内的设置数据,就是可以被视为『缺省』的数据啦!也就是说,当 subnet 里头没有写到租约期限啦、没有写到 domain-name 啦,那么这个 Global 的设置就会自动被拿去做为该设置内的设置内容啰!
       
    7. 创建租约期限文件:

    8. 既然我们知道 DHCP 是由用户与主机端之间的租约是否到期来进行是否继续连接的动作,那么自然就有所谓的『签约仪式』啰!哈哈!真会掰!这个时候,我们就得要知道一下,那么我到底要在哪里设置这个租约期限文件呢?如果在比较早期的版本中,这个步骤一定要进行的!不过,目前的版本中,似乎缺省已经有这个租约期限文件了!无论如何,还是作一下比较安心啦!
       
      [root@test root]# touch /etc/dhcpd.leases 
      # 创建租约文件同样的,注意您的版本目录!
       
      这个文件倒是蛮有趣的!因为在实际的运作过程中,这个文件本身不会有什么作用,但是在启动了 DHCP 之后,这个文件会被 copy 一份成为底下的文件: 『/var/lib/dhcp/hdcpd.leases』而真正在记录的,其实就是这个 /var 底下的文件啦!后面我们再来看一下这个文件的内容吧!目前还不会用到这个文件的内容啰!(注:如果您使用的 Linux 是最近的版本,那么应该不需要再运行这个步骤了!无论如何,您可以先略过这个步骤,到启动的时刻下,如果未能正确启动,再回来做这一步都还来得及呢!)
       
    9. 编辑 scripts 内容:

    10. 咦!不是可以启动了吗?喔不~我们还得要检查一下,您要提供 DHCP 的接口是哪一个呢!就如同我上面的图标,基本上,我的主机是有两块网络卡的,一块对外一块对内,而我只对这个对内部的网络卡启动 DHCP ,因此,我可以修改一下我的 /etc/rc.d/init.d/dhcp 这个文件:注:我是以 Mandrake 9.0 为例来说明的,如果您是使用 Red Hat 或者是 OpenLinux 等其他版本时,您应该可以找到『 daemon /usr/sbin/dhcpd 』那一行,将他改成底下的样子也就可以啦!
       
      [root@test root]# vi /etc/rc.d/init.d/dhcpd
      # 这是启动的 script 文件

      # 先找到底下的设置内容,如果没有找到也没有关系,就自行添加吧!
      CONFIGFILE="/etc/dhcpd.conf"      # 这个是设置文件的完整路径名称
      LEASEFILE="/var/lib/dhcp/dhcpd.leases" # 这个是在设置租约期限记录文件
      INTERFACES="eth0"          # 这个则是要激活 DHCP 的主机网络适配器
      OPTIONS="-q"              # 其他的 dhcpd 的参数设置值!
      start() {
          .....(略)...
          daemon /usr/sbin/dhcpd -cf $CONFIGFILE -lf $LEASEFILE $OPTIONS $INTERFACES
          .....(略)...
      }
      ....

       
      基本上,上面的 /etc/dhcpd.conf 设置文件的所在目录是可以变动的!就在这里进行更动即可!您可以使用 man dhcpd 就可以知道每个参数代表的意义了!请注意,那个 start() 里面的信息,只要更动找到的 daemon .... 那一行即可!至于上面的参数设置内容,则可以参考 BASH 的变量设置方法来写!目前因为我们只要针对 eth0 来激活 DHCP 而已,所以上面 INTERFACES 的部分我就写入了 eth0 而已,如果您还要启动 eth1 的话,那么就需要:『 INTERFACES="eth0 eth1"』两个接口中间以空白字符来隔开!这样,大致上就已经设置妥当了!准备来去启动啦!
       
    11. 启动 DHCP 服务:

    12. 启动服务的方法不需要再教了吧!?直接给他运行刚刚改过的 scripts 即可:
       
      [root@test root]# /etc/rc.d/init.d/dhcpd start 启动的啦!
      Starting dhcpd:                              [  OK  ]
       
      注意屏幕前面要显示 OK 才可以呢!好了,除此之外,我们还要确认 DHCP 已经启动才行!
       
    13. 确认正确的启动 DHCP :观察启动的 port 号与注册表的消息:

    14. 要注意的是,虽然我们已经驱动了 script 了,不过,您仍然不会知道,那个 script 是否真的让您的 service 启动了哪?所以,在启动任何的服务之后,观察一下两个东西,一个是 port 是否以启动,另一个则是到注册表去查找一下消息!这都是很重要的信息呢!所以,您应该这样做:
       
      1. 最重要的就是察看注册表!也就是 /var/log/messages 这个文件了!
      [root@test root]# vi /var/log/messages  先看看登录挡吧!
      Nov 23 23:35:09 vbird dhcpd: Wrote 0 deleted host decls to leases file.
      Nov 23 23:35:09 vbird dhcpd: Wrote 0 new dynamic host decls to leases file.
      Nov 23 23:35:09 vbird dhcpd: Wrote 0 leases to leases file.
      Nov 23 23:35:09 vbird dhcpd: dhcpd startup succeeded
      一定要看到 Wrote xxxx to leases file 以及 succeeded 的字眼,
      才能确定启动成功!

      2. 再来,观察一下 port 有没有在 listen 
      [root@test root]# netstat -utl
      Active Internet connections (only servers)
      Proto Recv-Q Send-Q Local Address           Foreign Address         State
      udp        0      0 *:bootps                *:*
      [root@test dhcp]# netstat -utln
      Active Internet connections (only servers)
      Proto Recv-Q Send-Q Local Address           Foreign Address         State
      udp        0      0 0.0.0.0:67              0.0.0.0:*

       
      仔细的看到喔! DHCP 显示的是 bootps 这个字样! WHY ?没有什么奇特的原因啦,因为 DHCP 的前身就是 bootps 这个 protocol ,所以当然就沿用啦!如果您想要修改这个字眼使成为 dhcp 的话,可以修改 /etc/services :
       
      [root@test root]# vi /etc/services
      找到这两行:
      bootps         67/tcp                          # BOOTP server
      bootps         67/udp

      将他改成
      dhcp            67/tcp
      dhcp            67/udp

       
      那未来使用 netstat -tln 就可以得到 dhcp 的显示了!嗄!忘记 netstat 后面的参数意义!喂!不要再混了!赶快回到前几篇提过的『Linux 常用网络指令介绍』练一练基本功吧!
       
    15. 修改 /etc/hosts 文件内容对应:

    16. 如果您有仔细的瞧过前几章的 网络基础 的话,那么应该还会记得那个 /etc/hosts 会影响内部电脑的连接速度很大吧?!那么我现在使用 DHCP 之后,糟糕!我怎么知道哪一部 PC 连上我的主机,那么要怎么填写 /etc/hosts 的内容呢?这真是太简单了!那就将所有可能的电脑 IP 都加进去该文件呀! ^_^ !以我为例,在这个例子中,我的分配的 IP 至少有 192.168.1.5, 192.168.1.21 ~ 192.168.1.100 ,所以我的 /etc/hosts 可以写成:
       
      [root@test root]# vi /etc/hosts
      127.0.0.1   localhost.localdomain localhost
      192.168.1.2  vbird-server
      192.168.1.5  static-ip
      192.168.1.21 dynamic-021
      192.168.1.22 dynamic-022
      .....
      192.168.1.100 dynamic-100
       
      这样一来,所有可能连进来的 IP 都已经有纪录了,哈哈!当然没有什么大问题啰! ^_^

设置 DHCP Client

DHCP 的 Client 端,可以是 Windows 也可以是 Linux 呢!由于我的领域内刚好有两部 Client 端的电脑,一部为 Linux ( Red Hat 7.3 ) 另一部为 Windows 2000 ,这里就提一下,分别是怎样设置的呢?
  • Linux 的 DHCP Client 端设置:

  • 设置还真是简单的不行~直接修改一个文件即可!由于我的 Linux 电脑有两块网络卡,其中, eth0 为使用 DHCP 来启动的,所以我就可以修改底下的文件呢:
     
    [root@test root]# vi /etc/sysconfig/network-scripts/ifcfg-eth0
    DEVICE=eth0
    BOOTPROTO=dhcp   <==只要这一行设置对了,其他的不要管!
    BROADCAST=192.168.1.255
    IPADDR=192.168.1.235
    NETMASK=255.255.255.0
    NETWORK=192.168.1.0
    ONBOOT=yes
    GATEWAY=192.168.1.2
     
    需要特别强调的是,Mandrake 与 Red Hat 都使用『BOOTPROTO=dhcp』来设置的!但是, OpenLinux 却是使用『DYNAMIC=dhcp』来设置的!所以要注意您的 Linux distribution 喔!改完之后,就将我们的网络卡关掉再开!请注意,如果您是在远程进行这个动作,您的连接『肯定会挂掉!』,因为网络卡被您关了嘛!呵呵!所以请在本机前面才进行喔!
     
    [root@test root]# ifdown eth0; ifup eth0
    Determining IP information for eth0 ..... done
    [root@test root]# ifconfig eth0
    eth0      Link encap:Ethernet  HWaddr 00:54:DG:08:QE:BE
              inet addr:192.168.1.100  Bcast:192.168.1.255  Mask:255.255.255.0
              UP BROADCAST NOTRAILERS RUNNING MULTICAST  MTU:1500  Metric:1
              RX packets:590 errors:0 dropped:0 overruns:0 frame:0
              TX packets:208 errors:0 dropped:0 overruns:0 carrier:0
              collisions:0 txqueuelen:100
              RX bytes:55145 (53.8 Kb)  TX bytes:29113 (28.4 Kb)
              Interrupt:10 Base address:0xd000
     
    棒吧!已经正确的取得 IP 的数据啰!
  • Windows 2000 底下的 DHCP Client 设置方式:

  • 在 Windows 底下的设置也真是太简单了!
    1. 直接在『网上邻居』按右键,选内容;
    2. 然后选择『区域连接』那一项,之后会出现如下的图标:
    3. 在上图当中,按下『内容』则会出现下面的图标:
    4. 然后选择『Internet Protocol (TCP/IP) 』那一项,之后按下内容,会出现选项:
    5. 然后自然就是一直按下『确定』!直到回到正常的桌面为止!这样就已经正确的启动了!哇!就是这么简单!
    6. 手动修订一下网络设置的方式:
      • 在 Windows 底下,要修订 IP 的方式依据不同的版本而有不同!如果是 Windows 98 系列的版本,就需要使用『winipcfg』,出现的是窗口画面,您可以自己调一下;
      • 在 Windows 2000 底下,我不知道怎么叫出窗口画面,所以直接打开一个『 C:>提示字符』,在『开始』==>『程序集』==>『附属应用程序』里面的『命令提示字符』那个就是啦! 
      • C:\>ipconfig /all   <==秀出所有的属性

        Windows 2000 IP Configuration

        Ethernet adapter 区域连接:

                Connection-specific DNS Suffix  . : dhcp.vbird.org
                Description . . . . . . . . . . . : Realtek RTL8139(A) PCI Fast Ethernet Adapter
                Physical Address. . . . . . . . . : 00-40-95-30-43-B4
                DHCP Enabled. . . . . . . . . . . : Yes
                Autoconfiguration Enabled . . . . : Yes
                IP Address. . . . . . . . . . . . : 192.168.1.99
                Subnet Mask . . . . . . . . . . . : 255.255.255.0
                Default Gateway . . . . . . . . . : 192.168.1.2
                DHCP Server . . . . . . . . . . . : 192.168.1.2
                DNS Servers . . . . . . . . . . . : 168.95.1.1
                                                    139.175.10.20
                Lease Obtained. . . . . . . . . . : 2002年11月24日 AM 12:32:54
                Lease Expires . . . . . . . . . . : 2002年11月27日 AM 12:32:54

        C:\> ipconfig /renew  <==重新捉 IP 啦!

    这样就 OK 啦!!很简单吧!

调试与查看租约文件:

接着下来,我们就要努力的来除虫了!除虫的第一步,就是察看注册表啦!最常发生的错误其实大概就是:
  1. 写错字:不要笑!真的很容易写错字的!这很正常!所以大家要多多的去检查一下:
  2. 没有加上『 ;』符号号:是的,这也是最常发生的错误啦!
  3. 新版 DHCP 添加的功能限制:有时后也会有这样的消息出现呢!
例如底下就是错误消息的一般显示状态:
 
[root@test root]# vi /var/log/messages
Nov 23 23:32:25 vbird dhcpd: /etc/dhcpd.conf line 6: semicolon expected.
Nov 23 23:32:25 vbird dhcpd: option
Nov 23 23:32:25 vbird dhcpd: ^
Nov 23 23:32:25 vbird dhcpd: Configuration file errors encountered -- exiting
Nov 23 23:32:25 vbird dhcpd:
# 这一个例子告诉您,在第六行有错误!什么错误?呵呵!/etc/dhcpd.conf 中仔细检查啰!

Nov 23 23:34:12 vbird dhcpd: ** You must add a ddns-update-style statement to /etc/dhcpd.conf.
Nov 23 23:34:12 vbird dhcpd:    To get the same behaviour as in 3.0b2pl11 and previous
Nov 23 23:34:12 vbird dhcpd:    versions, add a line that says "ddns-update-style ad-hoc;"
Nov 23 23:34:12 vbird dhcpd:    Please read the dhcpd.conf manual page for more information. **
Nov 23 23:34:12 vbird dhcpd:
# 这个例子则在告诉您,您必须要添加一行字喔!不然不给您启动! ^_^

 
这样就能够检验成功了!修改上面是很容易的啦!
再来要讨论的则是那个租约文件的内容问题!去看一下 /var/lib/dhcp/dhcpd.lease 的内容吧!
 
[root@test root]# vi /var/lib/dhcp/dhcpd.lease
lease 192.168.1.100 {
  starts 6 2002/11/23 16:15:22;
  ends 5 2002/11/29 16:15:22;
  tstp 5 2002/11/29 16:15:22;
  binding state active;
  next binding state free;
  hardware ethernet 00:90:cc:08:49:13;
  uid "\001\000\220\314\010I\023";
}
lease 192.168.1.99 {
  starts 6 2002/11/23 16:33:16;
  ends 2 2002/11/26 16:33:16;
  binding state active;
  next binding state free;
  hardware ethernet 00:40:95:30:43:b4;
  uid "\001\000@\2250C\264";
  client-hostname "tools";
}
lease 192.168.1.99 {
  starts 6 2002/11/23 16:33:21;
  ends 2 2002/11/26 16:33:21;
  binding state active;
  next binding state free;
  hardware ethernet 00:40:95:30:43:b4;
  uid "\001\000@\2250C\264";
  client-hostname "tools";
}
 
看到了吧!这个就是租约文件的内容啦!详细的记载何时申请的租约,以及期限在哪儿!嗯!这样就完成记录啰!

重点回顾

  • DHCP ( Dynamic Host Configuration Protocol ) 可以提供网络参数给用户端 (client) 电脑自动设置其网络的功能;
  • 通过 DHCP 的统一管理,在同一网域当中就比较不容易出现 IP 冲突的情况发生;
  • DHCP 可以通过 MAC 的比对,来提供 Static IP (或称为静态 IP),否则,通常提供用户端 dynamic IP (或称为动态 IP);
  • DHCP 除了 Static IP 与 Dynamic IP 之外,还可以提供租约行为之设置;
  • 用户端脱机、不明原因的当机、超过租约期限等机会下,DHCP Server 与用户端的租约行为会终止!
  • DHCP 可以提供的 MAC 比对、Dynamic IP 的 IP 范围以及租约期限等等,都在 dhcpd.conf 这个文件当中设置的;
  • 一般的情况之下,用户需要自行设置 dhcpd.leases 这个文件,不过,真正的租约文件记录是在 /var/lib/dhcp/dhcpd.leases 里面;
  • 在新版的 DHCP 的设置档 dhcpd.conf 当中,有时候需要加入『ddns-update-style ad-hoc;』才会正常的启动;

参考资源:


本章习题练习 ( 要看答案请将鼠标移动到『答:』底下的空白处,按下左键圈选空白处即可察看)

  • DHCP 的主要用途为何?
  • DHCP 主要的两种 IP 分配模式为何?
  • 在有 DHCP 主机存在的网域当中,且 client 端亦使用 DHCP 来规划用户端的网络参数,那么请问,在该网域当中,Client 端是如何取得 IP 的呢??
  • DHCP 是如何发送 Static IP 的?可以使用何种指令取得该信息?
  • 在 DHCP 的租约档,亦即 /var/lib/dhcp/dhcpd.leases 当中,记录了什么信息?
  • DHCP 的注册表放置于何处?

  • 前往参考解答
修改历史:
2002/11/23:第一次完成
2003/03/15:加入相关重点回顾、与练习题
2003/09/10:修改版面去!
其他链接
环境工程模式篇
鸟园讨论区
鸟哥旧站

今日 人数统计
昨日 人数统计
本月 人数统计
上月 人数统计