鸟哥的 Linux 私房菜 -- 简易 DHCP 服务器设定

since2012/04/23

     
 
简易 DHCP 服务器设定
本文已不再维护,更新文章请参考此处
最近更新日期:2003/03/15
如果您在工作单位使用的是笔记本电脑,而且常常要带着您的笔记本电脑到处跑,那么由前几章的『连上 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 的登录档放置于何处?

  • 前往参考解答
简易 DHCP 服务器设定

2002/11/23:第一次完成
2003/03/15:加入相关重点回顾、与练习题
2003/09/10:修改版面去!
 
     
http://linux.vbird.org is designed by VBird during 2001-2011. ksu.edu 

本网页主要以Firefox配合解析度 1024x768 作为设计依据     鸟哥自由软件整合应用研究室