服务器架设篇 - CentOS 4.x

第十六章、DHCP 服务器

Dynamic Host Configuration Protocol 主机的设置问题(类似 IP 分享器的后端功能)

最近更新时间: 2006/12/06

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

本章的行前准备工作

由于 DHCP 必需要设置整个局域网路的网段规定,还有得要了解路由设置,以及一堆与网络有关的信息等等, 所以你一定要熟悉网络基础。此外,由于 DHCP server 套件缺省应该是不会安装啦,所以你也必需要了解如何使用 rpm 或者是 yum 等工具才行。
  • 务必了解网络基础相关的数据;
  • 也得了解一下 DNS 相关的议题;
  • 还有防火墙最好也能了解一番。

DHCP 运作的原理

老规矩,在正式的进入 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) 主机最主要的工作,就是在进行前面提到的第三个方案,也就是自动的将网络参数正确的分配给网域中的每部电脑, 让用户端的电脑可以在开机的时候就立即自动的设置好网络的参数值,这些参数值可以包括了 IP、netmask、network、gateway 与 DNS 的地址等等。如此一来,呵呵!身为管理员的您,只要注意到这一部提供网络参数的主机有没有挂掉就好了, 其他同学们的个人电脑,哈!您想都不必想要怎么去帮忙!因为 DHCP 主机已经完全都帮您搞定啦! ^_^! 阿!当管理员最大的幸福就是可以喝喝茶、聊聊天就能控管好一切的网络问题呢!

DHCP 的运作方式

你必需要知道的是,DHCP 通常是用局域网路内的一个通信协定,他主要借由用户端发送广播封包给整个物理网段内的所有主机, 若局域网路内有 DHCP 主机时,才会回应用户端的 IP 参数要求。所以啰,DHCP 服务器与用户端是应该要在同一个物理网段内的。 而用户端取得 IP 参数的进程可以简化如下:
  1. 用户端利用广播封包发送 DHCP 需求:
    若用户端设置使用 DHCP 取得 IP (在 Windows 内为『自动取得 IP』),则当用户端开机或者是重新启动网络卡时, 用户端主机会发送出 DHCP 要求给所有物理网段内的电脑。此封包的目标 IP 会是 255.255.255.255, 所以一般主机接收到这个封包后会直接予以丢弃,但若局域网路内有 DHCP 服务器时会如何回应?

  2. DHCP 主机回应消息:
    DHCP 主机在接收到这个用户端的需求后,针对这个用户端的硬件地址 (MAC) 与本身的设置数据来进行下列工作:

    • 到服务器的注册表中寻找该用户之前是否曾经用过某个 IP ,若有且该 IP 目前无人使用,则提供此 IP 给用户端;
    • 若设置档针对该 MAC 提供额外的固定 IP (static IP) 时,则给予该 IP 的设置;
    • 若不符合上述两个条件,则随机取用目前没有被使用的 IP 给用户,并记录下来。

    此外,DHCP 服务器还会提供一个租约时间给用户端,并等待用户端的回应。

  3. 用户端接受 DHCP 服务器提供的参数并设置本身的网络环境:
    若一切安好,则用户端会接受该次取得的 IP 并开始处理本身的网络环境,包括改写 /etc/resolv.conf 等等; 并且会向 DHCP 服务器发送一个确认封包,确认该参数已被接受。

  4. DHCP 服务器记录该次租约行为:
    用户端回传消息以创建租约行为后,该次租约会被记录到主机的注册表上头, 并且开始租约计时喔!那么该次租约何时会到期而被解约 (真可怕的字眼!) ?你可以这样想:

    • 用户端脱机:不论是关闭网络接口 (ifdown)、重新开机 (reboot)、关机 (shutdown) 等行为,皆算是脱机状态,这个时候 Server 端就会将该 IP 回收,并放到 Server 自己的备用区中,等待未来的使用;

    • 用户端租约到期:前面提到 DHCP server 端发放的 IP 有使用的期限,用户端使用这个 IP 到达期限规定的时间,而且没有重新提出 DHCP 的申请时,就需要将 IP 缴回去!这个时候就会造成断线,而用户也可以再向 DHCP 主机要求再次分配 IP 啰
以上就是 DHCP 这个协定在 Server 端与 Client 端的运作状态,由上面这个运作状态来看,我们可以晓得,只要 Server 端设置没有问题,加上 Server 与 Client 在硬件连接上面确定是 OK 的,那么 Client 就可以直接借由 Server 来取得上网的网络参数,当然啦,只要我们这些管理员能够好好的、正确的管理好我们的 DHCP ,嘿嘿!那么上网的设置自然就变成一件很简单的事情啦!


  • DHCP 服务器给予用户端的 IP 类型:
  • 在上面的步骤里面,注意到第二步骤了吗?就是服务器会去比较用户端的 MAC 硬件地址,并判断该 MAC 是否需要给予一个固定的 IP 呢!所以啦,我们可以设置 DHCP 服务器给予用户端的 IP 类型主要有两种:
    • 固定 (Static) IP:
      只要那个用户端电脑的网络卡不换掉,那么 MAC 肯定就不会改变,由于 DHCP 可以根据 MAC 来给予固定的 IP ,所以该电脑每次都能以一个固定的 IP 连上 Internet !呵呵! 这种情况比较适合当这部电脑需要用来做为提供区域内的一些网络服务的主机之用。那么如何在 Linux 上面知道您的 MAC 呢?很简单啦!有很多的方式,最简单的方式就是使用 ifconfig 及 arp 来进行:
      1. 观察自己的 MAC 可用 ifconfig:
      [root@linux ~]# ifconfig eth0
      eth0      Link encap:Ethernet  HWaddr 00:08:03:A3:E0:34
                inet addr:192.168.1.254  Bcast:192.168.1.255  Mask:255.255.255.0
                ....底下省略....
      
      2. 观察别人的 MAC 可用 ping 配合 arp
      [root@linux ~]# ping -c 1 192.168.1.101
      [root@linux ~]# arp -n
      Address        HWtype  HWaddress          Flags Mask   Iface
      192.168.1.101  ether   00:08:75:A0:B2:78  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 哩!
    Tips 鸟哥 其实 IP 只有 Public IP 与 Private IP 两种,中文翻译成『公共 IP』与『私有 IP』这两个, 至于其他所谓的『静态 IP』、『实体 IP』、『虚拟 IP』、『浮动式 IP』等等,都是借由一些 IP 取得的方式来分类的, 关于 IP 的种类我们在网络基础中谈过了,记得再好好的厘清一下观念喔!
    事实上现在主流的 ADSL 宽带拨接上网也有使用到『静态 IP 』与『固定 IP 』之类的概念喔! 举例来说好了,hinet/seed net 等主要 ISP 都有提供所谓的:『一个固定 IP 搭配 7~8 个浮动 IP 』的 ADSL 拨接功能,也就是说同样通过一条电话线拨接到 ISP ,但是其中一个拨接是可以取得固定的 IP 呢! 而其他的则是非固定的 IP ,DHCP 的 static/dynamic 跟这个玩意儿有点类似啦! ^_^


  • 关于租约所造成的问题:
  • 怪了!如果我们观察上面 DHCP 运作模式的第二个步骤,您会发现最后面 DHCP 服务器还有给予还有一个租约期限! 干嘛还要这样的一个期限呢?其实设置期限还是有个优点啦!最大的优点就是可以避免 IP 被某些用户一直占用着,但该用户却是 Idle (发呆) 的状态!

    举个例子来说,我们刚刚不是说到,我有 150 个 IP ,但是偏偏我有 200 个用户吗?我们以 2006 年的世界杯足球赛来说明好了。假设每个用户都急着上网知道世足赛的消息, 那么某些热门对战时段网络将可能达到使用尖峰!也就是说,这 200 个人同时要来使用这 150 个 IP ,有可能吗?当然不可能!肯定会有 50 个人无法连接,因为『很抱歉!目前系统正在忙线中,请您稍后再拨!』

    那怎么办?这个时候租约到期的方式就很有用处啦!那几个已经连接进来很久的人, 就会因为租约到期而被迫脱机,这个时候该 IP 就会被释放出来,哈哈!大家赶快抢呀!先抢到先赢喔! 所以,那 50 个人 (包括被迫脱机的那个朋友) 只好继续的、努力的、加油的来进行 DHCP 的要求啰! ^_^""

    虽然说是优点,但是其实如果站在用户的角度来看,还是可能会造成公愤的!凭什么大家一起交钱, 我先连接进来就需要先被踢出去?~呵呵!所以啰,如果要当 ISP ,还是得要先规划好服务的方针才行呦! 这样您可以了解租约到期的行为了吗?! ^_^

    既然有租约时间,那么是否代表我用 DHCP 取得的 IP 就得要『手动』的在某个时间点去重新取得新的 IP 呢?不需要的啦!因为目前的 DHCP 用户端程序大多会主动的依据租约时间去重新申请 IP (renew) 的!也就是说在租约到期前你的 DHCP 用户端程序就已经又重新申请更新租约时间了。所以除非 DHCP 主机挂点, 否则您所取得的 IP 应该是可以一直使用下去的!


  • 多部 DHCP 主机在同一物理网段的情况
  • 或许您曾经发现过一件事情,那就是当我的网域里面有两部以上的 DHCP 主机时, 到底哪一部主机会设置我的这部电脑所发出的 DHCP 要求?呵呵!很抱歉,俺也不晓得! 因为在网络上面,很多时候都是『先抢先赢』的, DHCP 的回应也是如此!当 Server1 先回应时,您使用的就是 Server1 所提供的网络参数内容,如果是 Server2 先回应,您就是使用 Server2 的参数来设置您的 PC !不过,前提之下当然是这些电脑的『物理连接』都是在一起的啊!

    何时需要架设 DHCP 服务器

    既然 DHCP 的好处是『免用户端设置』,而且对于行动设备的上网方面非常的方便!那么是否代表你就得要架设一部 DHCP 呢?那可不一定!接下来要告知大家的是几个概念性的问题, 您倒不一定『必需』遵守底下的一些概念呢!反正,自己的网域自己『爽』就好啦!

  • 使用 DHCP 的几个时机
  • 在某些情况之下,倒是强烈的建议架设 DHCP 主机的!什么情况呢?例如:
    • 具有相当多行动设备的场合:
      例如您的公司内部很多笔记本电脑 (笔电) 使用的场合!因为这种笔电本身就是移动性的设备, 如果每到一个地方都要去问人家『喂!您这边的网络参数是什么?』还得要担心是否会跟人家的 IP 相冲突等等的问题!这个时候,DHCP 可就是您的救星啰!

    • 区域内电脑数量相当的多时:
      另外一个情况就是您所负责的网域内电脑数量相当庞大时, 大到您没有办法一个一个的进行说明来设置他们自己的网络参数,这个时候为了省麻烦,还是架设 DHCP 来的方便呐!况且,维护一部您熟悉的 DHCP 主机,要比造访几十个不懂电脑的人要简单的多哩!^_^
  • 不建议使用 DHCP 主机的时机
  • 虽然 DHCP 有很多好处,但是您有没有发现一个步骤怪怪的呀!回头看一下那个步骤一, 用户端在开机的时候会主动的发送消息给网域上的所有机器,这个时候,如果网域上就是没有 DHCP 主机呢?很抱歉,那么您的这部用户端电脑,『仍然会持续的发送消息!』 真正的时间与次数我不晓得会有多久,不过,肯定会超过 30 秒以上, 甚至可以达到一分钟以上!哇!那么这段时间您能干嘛?呵呵!除了等、还是等! 所以啰,如果电脑数不多,还是使用手动的方式来设置一下就好了!方便嘛!
    • 在您网域内的电脑,有很多机器其实是做为主机的用途,很少 Client 需求,那么似乎就没有必要架设 DHCP ;
    • 更极端的情况是,像一般家里,只有 3 ~ 4 部电脑,这个时候,架设 DHCP 只能拿来练练功力,事实上,并没有多大的效益;
    • 当您管理的网域当中,大多网络卡都属于老旧的型号,并不支持 DHCP 的协定时;
    • 很多用户的信息知识都很高,那么也没有需要架设 DHCP 啦。
    如前所述,上面的都是概念性的说法,事实上,一件事情的解决之道是有很多的方案的, 没有所谓的『完全正确』的方案,只有『相对可行、并且符合经济效益与功能』的方案! 所以啰,架设任何网站之前,请先多评估评估呐!

    DHCP 服务器端的设置

    事实上,目前市面上的 IP 分享器已经便宜到爆了!而 IP 分享器本身就含有 DHCP 的功能, 所以如果你只是想要单纯的使用 DHCP 在你的局域网路当中而已,那么建议你直接购买一部 IP 分享器来使用即可, 因为至少他很省电。如果你还有其他考量的话,才来架设 DHCP 吧!底下我们以一个简单的范例来架设 DHCP 先。

    所需套件与套件结构

    DHCP 的套件需求很简单,就是只要服务器端软件即可。所需套件为:
    • dhcp
      提供整个 DHCP 服务器的主要设置档与启动的 script 及运行档等等重要数据。
    真的只要一个套件就好了,而且没有什么很重大的相依性问题呢!请拿出你的原版光盘用 rpm 来安装, 或者直接用 yum 在线安装也可以!文件很小啦!至于整个套件的结构是这样的:
    • /etc/dhcpd.conf
      这个就是 dhcp 服务器的主要设置档咯!在某些 Linux 版本上头这个文件可能不存在,所以如果你确定有安装 dhcp 套件却找不到这个文件时,请手动自行创建他即可。这个文件的设置很简单啦,我们底下主要就是在谈这个文件的设置而已哩。 不过设置档的实际位置还是得要参考 /etc/init.d/dhcpd 的规范才是。
      Tips 鸟哥 其实 dhcp 套件在发布的时候都会附上一个范例文件,你可以使用『 rpm -ql dhcp 』来查找到 dhcpd.conf.sample 这个范例文件,然后将该文件拷贝成为 /etc/dhcpd.conf 后,再手动去修改 /etc/dhcpd.conf 即可,这样设置比较容易咯!
    • /usr/sbin/dhcpd
      启动整个 dhcp daemon 的运行档啊!其实最详细的运行方式应该要使用『 man dhcpd 』来查阅一番的呢!^_^

    • /var/lib/dhcp/dhcpd.leases
      这文件颇有趣的!我们前面原理部分不是有提到『租约』吗?DHCP 服务器端与用户端租约创建的启始与到期日就是记录在这个文件当中的咯!
    就跟你说很简单吧!整个套件数据也不过才如此而已呢!

    主要设置档 /etc/dhcpd.conf 的语法

    其实 DHCP 的设置很简单啊,只要将 dhcpd.conf 设置好就可以启动了。不过编辑这个文件时你必须要留意的是:
    • 『 # 』为注解符号;
    • 除了括号那一行之外,其他的每一行后面都要以『 ; 』做为结尾!这是最容易出错的地方。
    • 通常设置的项目都有独特的名称,以:『 <参数代号> <设置内容> 』来处理,例如:
      default-lease-time 259200;
    • 某些设置项目必须以 option 来设置,基本方式为『 option <参数代码> <设置内容> 』例如:
      option domain-name "your.domain.name";
    基本上,我们刚刚前面提过说, DHCP 的 IP 分配可分为给予动态 IP 与静态 IP ,其中又需要了解的是,如果需要设置静态 IP 的话,那么就必须要知道要设置成静态 IP 的那部电脑的硬件地址 (MAC) 才行,请使用 arp 及 ifconfig 来查知您的接口的 MAC 吧!此外,我们需要设置的项目大概有几项:
    • 整体设置 (Global)
      包括有租约期限、DNS 的 IP 地址、路由器的 IP 地址还有动态 DNS (DDNS) 更新的类型等等。 当静态 IP 及动态 IP 内没有规范到某些设置时,则以整体设置值为准。常使用参数有:
      • default-lease-time 时间
        缺省的租约时间,后面的时间参数缺省单位为秒;
      • max-lease-time 时间
        最大租约时间,当用户端超过租约时间却尚未更新 IP 时,最长可以使用该 IP 的时间;
      • option domain-name "领域名称"
        如果你在 /etc/resolv.conf 里面设置了一个『 search google.com 』的话,这表示当你要搜索主机名称时, DNS 系统会主动帮你加上这个领域名称的意思。所以这个设置参数也会修改 /etc/resolv.conf 喔!
      • option domain-name-servers IP1, IP2
        这个设置参数可以修改用户端的 /etc/resolv.conf 文件!就是 nameserver 所接的那个 DNS IP 啰!特别注意设置参数最末尾为『servers』 (有 s 喔);
      • ddns-update-style 类型
        因为 DHCP 用户端所取得的 IP 通常是一直变动的, 所以某部主机的主机名称与 IP 的对应就很难处理。此时 DHCP 可以通过 ddns (请参考 合法主机名称DNS 章节的说明) 来更新主机名与 IP 的对应。不过我们这里不谈这么复杂的东西,所以你可以将他设置为 none 喔。
      • option routers 路由器的地址
        设置路由器的 IP 所在,记得那个『 routers 』要加 s 才对!
      • option broadcasst-address 广播地址
        设置广播地址而已。如果没有设置的话,系统应该会自动依据 class A, B, C 的原则来计算出广播地址吧!

    • 动态 IP 分配设置:
      用来设置随机给予 IP 的方式,只要给予网域 (network 以及 netmask) 配合 range 这个参数就能够给予限制的 IP 范围了。 设置方式并不怎么难啊。

    • 静态 IP 的设置方式:
      通过硬件地址 (MAC) 来处理 IP 的取得。使用的是 host 这个设置参数, 配合底下两个常见的参数值来处理:
      • hardware ethernet 硬件地址
        利用网络卡上面的固定硬件地址来设置,亦即该设置仅针对这个硬件地址有效的意思;
      • fixed-address IP地址
        给予一个固定的 IP 地址的意思。
    说再多也没有什么用啦!让我们实际来玩一个案例吧!你就知道该如何处理了。

    一个局域网路的 DHCP 服务器设置案例

    假设我的环境当中,Linux 服务器除了 NAT 主机之外还得要负责其他服务器,例如邮件服务器的支持。 而在后端局域网路中则想要提供 DHCP 的服务。整个硬件配置的情况如同下图所示:

    局域网路的实体连接情况
    图一、局域网路的实体连接情况

    如上图所示,假设我的 Linux 有两块接口,其中 eth0 对内而 eth1 对外,至于其他的网络参数设计为:
    • 内部网段设置为 192.168.1.0/24 这一段,且 router 为 192.168.1.254 ,此外, 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@linux ~]# vi /etc/dhcpd.conf
    # 1. 整体的环境设置
    #    当底下的 subnet 与 host 没有设置时,以这里的设置值为准喔!
    ddns-update-style               none;          <==不要更新 DDNS 的设置
    default-lease-time              259200;        <==缺省租约为 3 天
    max-lease-time                  518400;        <==最大租约为 6 天
    option routers                  192.168.1.254; <==这就是缺省路由
    option broadcast-address        192.168.1.255; <==这是广播地址啊
    option domain-name-servers      168.95.1.1, 139.175.10.20;
    # 上面是 DNS 的 IP 设置,这个设置值会修改用户端的 /etc/resolv.conf 文件内容!
    # 此外,你可以设置多部 DNS 主机,不过必须要以逗号『 , 』分隔开才行。
    
    # 2. 关于动态分配的 IP
    #     Network_IP↓        Netmask_IP↓
    subnet 192.168.1.0 netmask 255.255.255.0 {
        range 192.168.1.21 192.168.1.100;      <==分配的 IP 范围
        option subnet-mask   255.255.255.0; <==可重复设置 netmask 地址
        option nis-domain    "vbird.tsai";  <==额外给的 NIS 相关参数
        option domain-name   "vbird.tsai";  <==在 /etc/resolv.conf 给一个搜索领域
    
        # 3. 关于静态的 IP 啊!
        #    主机名称↓
        host vbird-inside {
            hardware ethernet    00:40:95:30:43:B4; <==用户端网卡 MAC
            fixed-address        192.168.1.5;       <==给予固定的 IP
        }
    }
    # 相关的设置参数意义,请查找前一小节的介绍,或者 man dhcpd.conf
    
    够简单吧!这样就设置好了!你可以拷贝上头的数据然后修改一下,让里头的 IP 参数符合你的环境, 就能够设置好你的 DHCP 服务器了。接下来理论上你就能够启动 dhcp 了。不过,在某些早期的 Linux distribution 上面, 当你的 Linux 主机具有多个接口时,你的一个设置可能会让多个接口同时来监听,那就可能会发生错误了。

    举例来说,我们现在的设置是 192.168.1.0/24 这个在 eth0 上头的网域,假设你还有一个接口 eth1 在 192.168.2.0/24 好了, 那万一你的 DHCP 同时监听两块接口的话,想一想,如果 192.168.2.0/24 网域的用户端发送出 dhcp 封包的要求时, 他会取得什么 IP ?所以啰,我们就得要针对 dhcpd 这个运行档设置他监听的接口, 而不是针对所有的接口都监听啊!您说是吧!^_^!那如何处理呢?在 CentOS (Red Hat 系统) 可以这样做:
    [root@linux ~]# vi /etc/sysconfig/dhcpd
    DHCPDARGS="eth0"
    
    这样做就好了,这是因为启动 dhcpd 的 script 会主动的调用这个参数文件。如果是在其他版本的 Linux 当中, 你可以直接修改 /etc/init.d/dhcpd 这个 script 文件内容,找到『 daemon /usr/sbin/dhcpd ... 』那一行, 并添加网络卡代号即可,例如:
    [root@linux ~]# vi /etc/init.d/dhcpd
    # 约在第 58 行左右会找到:
            daemon /usr/sbin/dhcpd ${DHCPDARGS} 2>/dev/null 
    
    在上述的特殊字体部分,你可以持续加入想要增加的监听接口啦!更多的功能可以参考『 man dhcpd 』的解释。 不过这个动作在较新的版本上面已经不需要了,因为新版本的 dhcp 会主动的分析服务器的网段与实际的 dhcpd.conf 设置, 如果两者无法吻合,就会有错误提示,人性化多了。 ^_^! 接下来我们可以开始启动 dhcp 试看看啰!

    DHCP 服务器的启动与观察

    开始来启动 dhcp 吧!另外你要注意的是:dhcpd 使用的端口口是 port 67 ,并且启动的结果会记录在 /var/log/messages 文件内,你最好能去观察一下 /var/log/messages 所显示的 dhcpd 相关信息才好。
    1. 就启动吧!
    [root@linux ~]# /etc/init.d/dhcpd start
    
    2. 看看端口口启动的情况
    [root@linux ~]# netstat -tlunp
    Active Internet connections (only servers)
    Proto Recv-Q Send-Q Local Address Foreign Address PID/Program name
    udp        0      0 0.0.0.0:67    0.0.0.0:*       7294/dhcpd
    
    3. 看看注册表的输出信息
    [root@linux ~]# tail -n 30 /var/log/messages
    Dec 5 10:58 linux dhcpd: Internet Systems Consortium DHCP Server V3.0.1
    Dec 5 10:58 linux dhcpd: Copyright 2004 Internet Systems Consortium.
    Dec 5 10:58 linux dhcpd: All rights reserved.
    Dec 5 10:58 linux dhcpd: For info, please visit http://www.isc.org/sw/dhcp/
    Dec 5 10:58 linux dhcpd: Wrote 0 deleted host decls to leases file.
    Dec 5 10:58 linux dhcpd: Wrote 0 new dynamic host decls to leases file.
    Dec 5 10:58 linux dhcpd: Wrote 0 leases to leases file.
    Dec 5 10:58 linux dhcpd: Listening on LPF/eth0/00:40:fa:25:2a:db/192.168.1/24
    Dec 5 10:58 linux dhcpd: dhcpd startup succeeded
    
    看到这些就是成功的象征啦!恭喜你啊!真是『福气啦!』不过,万一你看到的注册表是类似底下的模样呢?
    Dec 5 11:11 linux dhcpd: /etc/dhcpd.conf line 10: semicolon expected.
    Dec 5 11:11 linux dhcpd: subnet
    Dec 5 11:11 linux dhcpd: ^
    Dec 5 11:11 linux dhcpd: Configuration file errors encountered -- exiting
    
    这表示应该是第 10 行左右有点问题,问题点应该是没有分号 (semicolon) 而已。而分号应该是在指数符号 (^) 指的地方, 也就是 subnet 附近而已,很容易分辨吧!那如果是出现如下的模样呢?
    ** You must add a ddns-update-style statement to /etc/dhcpd.conf.
       To get the same behaviour as in 3.0b2pl11 and previous
       versions, add a line that says "ddns-update-style ad-hoc;"
       Please read the dhcpd.conf manual page for more information. **
    
    这表示你忘记在 /etc/dhcpd.conf 里面加入 ddns-update-style 的参数声明啦! 瞧一瞧这个输出信息,就能够晓得你的设置错误所在,根据错误来处理你的 dhcp 设置档吧!

    内部主机的 IP 对应

    如果您有仔细的瞧过前几章的网络基础的话,那么应该还会记得那个 /etc/hosts 会影响内部电脑的连接速度很大吧!那么我现在使用 DHCP 之后,糟糕!我怎么知道哪一部 PC 连上我的主机,那要怎么填写 /etc/hosts 的内容呢?这真是太简单了!就将所有可能的电脑 IP 都加进去该文件呀! ^_^ !以鸟哥为例,在这个例子中,鸟哥的分配的 IP 至少有 192.168.1.5, 192.168.1.21 ~ 192.168.1.100 ,所以 /etc/hosts 可以写成:
    [root@linux ~]# vi /etc/hosts
    127.0.0.1   localhost.localdomain localhost
    192.168.1.254  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 用户端的设置

    DHCP 的 Client 端,可以是 Windows 也可以是 Linux 呢!由于鸟哥的领域内刚好有两部 Client 端的电脑,一部为 Linux (CentOS 4.4) 另一部为 Windows xp ,这里就提一下,分别是怎样设置的呢?

    Linux 用户端

    Linux 的网络参数设置还记得吧?不记得的话就得要打屁股了!在连上 Internet 章节内我们谈过自动取得 IP 的方式,设置真的很简单:
    [root@client ~]# vi /etc/sysconfig/network-scripts/ifcfg-eth0
    DEVICE=eth0
    BOOTPROTO=dhcp  <==就是他!指定这一个就对了!
    ONBOOT=yes
    
    [root@client ~]# /etc/init.d/network restart
    
    改完之后,就将我们的整个网络重新启动即可 (不要使用 ifdown 与 ifup ,因为还有缺省路由要设置!) 。请注意,如果您是在远程进行这个动作,您的连接『肯定会挂掉!』,因为网络卡被您关了嘛! 呵呵!所以请在本机前面才进行喔!如果运行的结果有找到正确的 DHCP 主机,那么几个文件可能会被更动喔:
    1. DNS 的 IP 会被更动呢!查阅一下 resolv.conf 先:
    [root@linux ~]# cat /etc/resolv.conf
    ; generated by /sbin/dhclient-script
    search vbird.tsai          <==是否记得设置过 domain-name 呢?
    nameserver 168.95.1.1      <==这就是我们原本的设置值。
    nameserver 139.175.10.20
    
    2. 观察一下路由啦!
    [root@linux ~]# route -n
    Kernel IP routing table
    Destination     Gateway        Genmask        Flags  Iface
    192.168.1.0     0.0.0.0        255.255.255.0  U      eth0
    169.254.0.0     0.0.0.0        255.255.0.0    U      eth0
    0.0.0.0         192.168.1.254  0.0.0.0        UG     eth0
    # 嗯!没错!路由也被正确的捉到了!OK的啦!
    
    3. 察看一下用户端的指令吧!
    [root@linux ~]# netstat -tlunp
    Proto Recv-Q Send-Q Local Address  Foreign Address State  PID/Program name
    udp        0      0 0.0.0.0:68     0.0.0.0:*              3996/dhclient
    # 你没看错!确实是有个小程序在监测 DHCP 的连接状态呐!
    
    4. 看一看用户端租约所记载的信息吧!
    [root@linux ~]# cat /var/lib/dhcp/dhclient-eth0.leases
    lease {
      interface "eth0";
      fixed-address 192.168.1.100;  <==这就是为啥我每次取得的 IP 是固定的。
      option subnet-mask 255.255.255.0;
      option routers 192.168.1.254;
      option dhcp-lease-time 259200;
      option dhcp-message-type 5;
      option domain-name-servers 168.95.1.1,139.175.10.20;
      option dhcp-server-identifier 192.168.1.254;
      option nis-domain "vbird.tsai";
      option broadcast-address 192.168.1.255;
      option domain-name "vbird.tsai";
      renew 3 2006/12/6 18:15:41;   <==下一次预计更新 (renew) 的时间点
      rebind 5 2006/12/8 05:26:26;
      expire 5 2006/12/8 14:26:26;
    }
    # 这个文件会记录该适配器所曾经要求过的 DHCP 信息喔!重要!
    # 有没有看出来,他几乎就与你设置的 /etc/dhcpd.conf 类似? ^_^
    
    5. 额外看一下 NIS 的领域名称有没有设置妥当啊?
    [root@linux ~]# nisdomainname
    vbird.tsai   <==因为我们有设置 nis-domain 的项目啊!
    
    有没有发现其实你的用户端取得的数据都被记载在 /var/lib/dhcp/dhclient-eth0.leases 里头啊? 如果你有多张网卡,那么每张网卡自己的 DHCP 要求就会被写入到不同文件名的文件当中去! 观察该文件就知道你的数据是如何啰!这可也是挺重要的呦!

    Windows 用户端

    在 Windows 底下设置 DHCP 协定以取得 IP 实在是很简单喔!我们以目前最常用的 Windows XP 来说明的话, 你可以依据『开始』-->『设置』-->『控制台』-->『网络和互联网连接』-->『网络连接』-->『区域连接』 来开始一步一步的进行下面的动作喔:
    1. 在点击了上面的局域网路后,你的桌面上应该会出现如下的图标:

      局域网路的 DHCP 取得方式之设置
      图二、局域网路的 DHCP 取得方式之设置

    2. 在上图二的地方按下箭头所指的『内容』处,就会出现如下画面啰:

      局域网路的 DHCP 取得方式之设置
      图三、局域网路的 DHCP 取得方式之设置

      在上面的画面当中,建议你可以在箭头所指的 1 处勾选那两个项目,如此一来在桌面最底下的右侧就会出现一个网络符号, 以后你就可以点击该图标来进入这个画面了!比较方便啦。然后在箭头 2 的地方勾选 Internet Protocol (TCP/IP) 的项目, 并点击『内容』后,就可能进入到设置的画面。

    3. 接下来如下图所示,你只要勾选『自动取得 IP 地址』那个项目,然后按下『确定』并离开设置画面, 如此一来 Windows 就会开始自动取得 IP 的工作了。

      局域网路的 DHCP 取得方式之设置
      图四、局域网路的 DHCP 取得方式之设置

    4. 那你如何确认你的 IP 已经被顺利的取得呢?如果是在早期的 Windows 95 ,你可以使用一个名为『 winipcfg 』 来观察你的 IP 设置。不过在 windows 2000 以后,你可能需要使用命令提示字符来观察才行。你可以使用: 『开始』-->『程序集』-->『附属应用程序』-->『命令提示字符』来取出终端机,然后这样处理看看:
      C:\Documents and Settings\dmtsai> ipconfig /all
      ....前面省略....
      Ethernet adapter 区域连接:
      
              Connection-specific DNS Suffix  . : vbird.tsai
              Physical Address. . . . . . . . . : 00-D0-18-AF-6E-81
              Dhcp Enabled. . . . . . . . . . . : Yes
              Autoconfiguration Enabled . . . . : Yes
              IP Address. . . . . . . . . . . . : 192.168.1.99
              Subnet Mask . . . . . . . . . . . : 255.255.255.0
              Default Gateway . . . . . . . . . : 192.168.1.254
              DHCP Server . . . . . . . . . . . : 192.168.1.254  <==这一部 DHCP 主机
              DNS Servers . . . . . . . . . . . : 168.95.1.1
                                                  139.175.10.20
              Lease Obtained. . . . . . . . . . : 2006年12月5日 下午 10:22:37
              Lease Expires . . . . . . . . . . : 2006年12月8日 下午 10:22:37
      
      C:\Documents and Settings\dmtsai> ipconfig /renew
      # 这样可以立即要求更新 IP 信息喔!
      
      这样就 OK 的啦!简单吧!

    服务器端数据查阅

    检查租约文件

    用户端会主动的纪录租约信息,那主机端更不能忘记记录啰!主机端是记录在这个地方:
    [root@linux ~]# cat /var/lib/dhcp/dhcpd.leases
    lease 192.168.1.99 {  <==就是那部 Windows 的纪录
      starts 2 2006/12/05 14:23:37;
      ends 5 2006/12/08 14:23:37;
      binding state active;
      next binding state free;
      hardware ethernet 00-d0-18-af-6e-81;
      uid "\001\000\340\030\257n\003";
      client-hostname "vbird_work";
    }
    lease 192.168.1.100 { <==就是那部 Linux 的纪录
      starts 2 2006/12/05 15:37:33;
      ends 5 2006/12/08 15:37:33;
      binding state active;
      next binding state free;
      hardware ethernet 00:30:20:1d:c3:6e;
    }
    
    从这个文件里面我们就知道有多少用户端已经向我们申请了 DHCP 的 IP 使用了呢! 很容易了解吧!

    使用 ether-wake 实行远程自动开机 (remote boot)

    既然已经知道用户端的 MAC 地址了,如果用户端的主机符合一些电源标准, 并且该用户端主机所使用之网络卡暨主板支持网络唤醒的功能时,我们就可以通过网络来让用户端电脑开机了。 如果你有一部主机想要让他可以通过网络来启动时,你必须要在这部用户端电脑上进行:
    1. 首先你得要在 BIOS 里面设置『网络唤醒』的功能,否则是没有用的喔!
    2. 再来你必须要让这部主机接上网络线,并且电源也是接通的。
    3. 将这部主机的 MAC 抄下来,然后关机等待网络唤醒。
    接下来请到永远开着的主机 DHCP 主机上面 (其实只要任何一部 Linux 主机均可!) , 下载 ether-wake.c 这个文件:
    然后开始编译他:
    [root@linux ~]# gcc -O -Wall -o ether-wake ether-wake.c
    
    此时你的家目录下应该会有一个名为 ehter-wake 的文件,假设用户端主机的 MAC 为 11:22:33:44:55:66 好了, 那么你想要让这部主机被唤醒,就这样做吧:
    [root@linux ~]# ./ether-wake 11:22:33:44:55:66
    
    # 更多功能可以这样查阅喔:
    [root@linux ~]# ./ether-wake -u
    
    然后你就会发现,哈哈!那部用户端主机被启动了!以后如果你要连到局域网路内的话, 只要能够连上你的防火墙主机,然后通过这个 ether-wake 软件,就能够让你局域网路内的主机启动了, 控管上面就更加方便的啦!您说是吧! ^_^

    重点回顾

    • DHCP (Dynamic Host Configuration Protocol) 可以提供网络参数给用户端电脑,使其自动设置网络的功能;
    • 通过 DHCP 的统一管理,在同一网域当中就比较不容易出现 IP 冲突的情况发生;
    • DHCP 可以通过 MAC 的比对来提供 Static IP (或称为静态 IP),否则通常提供用户端 dynamic IP (或称为动态 IP);
    • DHCP 除了 Static IP 与 Dynamic IP 之外,还可以提供租约行为之设置;
    • 在租约期限到期之前,用户端 dhcp 软件即会主动的要求更新 (约 0.5, 0.85 倍租约时间左右);
    • 用户端脱机、不明原因的当机、超过租约期限等机会下,DHCP Server 与用户端的租约行为会终止!
    • DHCP 可以提供的 MAC 比对、Dynamic IP 的 IP 范围以及租约期限等等,都在 dhcpd.conf 这个文件当中设置的;
    • 一般的情况之下,用户需要自行设置 dhcpd.leases 这个文件,不过,真正的租约文件记录是在 /var/lib/dhcp/dhcpd.leases 里面;
    • 新版的 DHCP 设置档 dhcpd.conf 中,需含有『 ddns-update-style 』的参数设置;
    • 如果只是要单纯的 DHCP 服务,建议可以购买类似 IP 分享器的设备即可提供稳定且低耗电的网络服务。

    课后练习

    • DHCP 的主要用途为何?
    • DHCP 主机的主要用途就是在于自动分配网络参数给 Client 端的电脑,以降低网域当中可能发生的 IP 冲突问题,以及减少网管人员到处检查错误的伤脑筋!
    • DHCP 主要的两种 IP 分配模式为何?
    • 主要的两种分配模式分别为 Dynamic IP 与 Static IP , Static IP 通过 MAC 的比对,至于 Dynamic IP 则是直接取用网域中尚未被使用到的 IP 来进行 Client 端的分配。
    • 在有 DHCP 主机存在的网域当中,且 client 端亦使用 DHCP 来规划用户端的网络参数,那么请问,在该网域当中,Client 端是如何取得 IP 的呢?
      1. 首先, Client 端会发出一个 DHCP 要求封包;
      2. server 端接收到要求后,会主动的回应信息给 Client ;
      3. Client 若接受该 DHCP 主机所提供的参数,则主机会记录下租约信息,至于 client 端则开始以主机提供的参数设置其网络
    • DHCP 是如何发送 Static IP 的?可以使用何种指令取得该信息?
    • DHCP 主要利用网络卡的硬件地址,亦即俗称的『网络卡卡号』,也就是 MAC 来进行 Client 端的比对的,至于主动取得 Client 端的方式,可以通过 ping 以及 arp 来获得。
    • 在 DHCP 的租约档,亦即 /var/lib/dhcp/dhcpd.leases 当中,记录了什么信息?
    • 这个文件主要记录了 Client 端连上 Server 端的纪录数据,他会被 DHCP 主机用来判定与 Client 端的租约行为喔!
    • DHCP 的注册表放置于何处?
    • 就是最重要的 /var/log/messages 这个文件啦(缺省状况下!)
    修改历史:
    2002/11/23:第一次完成
    2003/03/15:加入相关重点回顾、与练习题
    2003/09/10:修改版面去!
    2006/12/05:将旧的文章移动到此处
    2006/12/06:好累!怎么老是在说累~总之,完成啰~添加加 ether-wake 的网络唤醒功能。
    其他链接
    环境工程模式篇
    鸟园讨论区
    鸟哥旧站

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