欢迎各位兄弟 发布技术文章
这里的技术是共享的
想像两种情况:(1)如果你在工作单位使用的是笔记型电脑,而且常常要带着你的笔记型电脑到处跑,那么由第四章、连上Internet的说明中会发现,哇!我的网路卡参数要常常修改啊!而且,每到一个新的地方,就得问清楚该地的网路参数才行!真是麻烦。(2)你的公司常常有访客或贵客来临,因为他们也带来笔电,所以也得常常跑来找你问网路参数才能设定他的电脑。哇!这两种情况都会让你想哭哭吧?这个时候,动态主机设定协定(DHCP)可就大大的派上用场啦!DHCP这个服务可以自动的分配IP与相关的网路参数给用户端,来提供用户端自动以服务器提供的参数来设定他们的网路。如此一来,使用者只要将自己的笔电设定好经由DHCP协定来取得网路参数后,一插上网路线,呵呵!马上就可以享受Internet的服务啦!很方便吧!所以得来瞧一瞧这个好用的协定喔! |
在正式的进入DHCP (Dynamic Host Configuration Protocol) 服务器设定之前,我们先来认识一下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)呢?恭喜你!这个方案的管理时间花费最短,也是最不麻烦的作法啦!
呵呵!知道鸟哥要说些什么了吗?是的!这个DHCP (Dynamic Host Configuration Protocol) 服务器最主要的工作,就是在进行上面的第三个方案,也就是自动的将网路参数正确的分配给网域中的每部电脑,让用户端的电脑可以在开机的时候就立即自动的设定好网路的参数值,这些参数值可以包括了IP、netmask、network、gateway与DNS的位址等等。如此一来,身为管理员的你,只要注意到这一部提供网路参数的主机有没有挂掉就好了,其他同学们的个人电脑,哈!你想都不必想要怎么去帮忙!因为DHCP主机已经完全都帮你搞定啦!^_^!阿!当管理员最大的幸福就是可以喝喝茶、聊聊天就能控管好一切的网路问题呢!
你必需要知道的是,DHCP通常是用于区域网路内的一个通讯协定,他主要藉由用户端传送广播封包给整个物理网段内的所有主机,若区域网路内有DHCP服务器时,才会回应用户端的IP参数要求。所以啰,DHCP服务器与用户端是应该要在同一个物理网段内的。至于整个DHCP封包在服务器与用户端的来来回回情况有点像底下这样:( 注1 )
户端取得IP 参数的程序可以简化如下:
用户端:利用广播封包发送搜索DHCP服务器的封包:
若用户端网路设定使用DHCP协定取得IP (在Windows内为『自动取得IP』),则当用户端开机或者是重新启动网路卡时,用户端主机会发送出搜寻DHCP服务器的UDP封包给所有物理网段内的电脑。此封包的目标IP会是255.255.255.255,所以一般主机接收到这个封包后会直接予以丢弃,但若区域网路内有DHCP服务器时,则会开始进行后续行为。
服务器端:提供用户端网路相关的租约以供选择:
DHCP服务器在接收到这个用户端的要求后,会针对这个用户端的硬体位址(MAC)与本身的设定资料来进行下列工作:
总之,服务器端会针对用户端的要求提供一组网路参数租约给用户端选择,由于此时用户端尚未有IP ,因此服务器端回应的封包资讯中, 主要是针对用户端的MAC 来给予回应。此时服务器端会保留这个租约然后开始等待用户端的回应。
到服务器的登录档中寻找该用户之前是否曾经用过某个IP ,若有且该IP 目前无人使用,则提供此IP 给用户端;
若设定档针对该MAC 提供额外的固定IP (static IP) 时,则提供该固定IP 给用户端;
若不符合上述两个条件,则随机取用目前没有被使用的IP 参数给用户端,并记录下来。
用户端:决定选择的DHCP服务器提供的网路参数租约并回报服务器:
由于区域网路内可能并非仅有一部DHCP服务器,但用户端仅能接受一组网路参数的租约。因此用户端必需要选择是否要认可该服务器提供的相关网路参数的租约。当决定好使用此服务器的网路参数租约后,用户端便开始使用这组网路参数来设定自己的网路环境。此外,用户端也会发送一个广播封包给所有物理网段内的主机,告知已经接受该服务器的租约。此时若有第二台以上的DHCP服务器,则这些没有被接受的服务器会收回该IP租约。至于被接受的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 !呵呵!这种情况比较适合当这部用户端电脑需要用来做为提供区域内的一些网路服务的主机之用(所以IP要固定)。那么如何在Linux上面知道网路卡的MAC呢?很简单啦!有很多的方式,最简单的方式就是使用ifconfig及arp来进行:
# 1.观察自己的MAC可用ifconfig: [root@www ~]# ifconfig | grep HW eth0 Link encap:Ethernet HWaddr 08:00:27:71:85:BD eth1 Link encap:Ethernet HWaddr 08:00:27: 2A:30:14 #因为鸟哥有两张网卡,所以有两个硬体位址喔! # 2.观察别人的MAC可用ping配合arp [root@www ~]# ping -c 3 192.168.1.254 [root@www ~]# arp -n Address HWtype HWaddress Flags Mask Iface 192.168.1.254 ether 00:0c:6e:85:d5:69 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 个用户吗?我们以 2010 年的世界杯足球赛来说明好了。假设每个使用者都急着上网知道世足赛的消息, 那么某些热门对战时段网路将可能达到使用尖峰!也就是说,这200 个人同时要来使用这150 个 IP ,有可能吗?当然不可能!肯定会有50 个人无法连线,因为『很抱歉!目前系统正在忙线中,请你稍后再拨!』
那怎么办?这个时候租约到期的方式就很有用处啦!那几个已经连线进来很久的人, 就会因为租约到期而被迫离线,这个时候该IP 就会被释放出来,哈哈!大家赶快抢呀!先抢到先赢喔!所以,那50 个人(包括被迫离线的那个朋友) 只好继续的、努力的、加油的来进行DHCP 的要求啰!^_^""
虽然说是优点,但是其实如果站在使用者的角度来看,还是可能会造成公愤的!凭什么大家一起交钱, 我先连线进来就需要先被踢出去?~呵呵!所以啰,如果要当ISP ,还是得要先规划好服务的方针才行呦!这样你可以了解租约到期的行为了吗?!^_^
既然有租约时间,那么是否代表我用DHCP取得的IP就得要『手动』的在某个时间点去重新取得新的IP呢?不需要的啦!因为目前的DHCP用户端程式大多会主动的依据租约时间去重新申请IP (renew)的!也就是说在租约到期前你的DHCP用户端程式就已经又重新申请更新租约时间了。所以除非DHCP主机挂点,否则你所取得的IP应该是可以一直使用下去的!
Tips: 一般来说,假设租约期限是T小时,那么用户端在0.5T会主动向DHCP服务器发出重新要求网路参数的封包。如果这次封包要求没有成功,那么在0.875T后还会再次的发送封包一次。正因如此,所以服务器端会启动port 67监听用户要求,而用户会启动port 68主动向服务器要求哩!鸟哥觉得这是很特殊的一件事呢! |
多部DHCP 服务器在同一物理网段的情况
或许你曾经发现过一件事情,那就是当我的网域里面有两部以上的DHCP 服务器时, 到底哪一部服务器会提供我的这部用户端电脑所发出的DHCP 要求?呵呵!很抱歉,俺也不晓得!因为在网路上面,很多时候都是『先抢先赢』的, DHCP 的回应也是如此!当Server1 先回应时,你使用的就是 Server1 所提供的网路参数内容,如果是Server2 先回应,你就是使用Server2 的参数来设定你的用户端 PC !不过,前提之下当然是这些电脑的『物理连线』都是在一起的啊!
因为这个特色的关系,所以当你在练习DHCP服务器的设定之前,不要在已经正常运作的区网下测试,否则会很惨。举个鸟哥的例子来说好了,某一次其他系的研究生在测试网路安全时,在原有的区网上面放了一部IP分享器,结果你猜怎么着?整栋大楼的网路都不通了!因为那时整栋大楼的网路是串接在一起的,而我们学校是使用DHCP让用户端上网。由于IP分享器的设定并不能连上Internet ,哇!大家都无法上网了啦!那你晓得了吗?不要随便测试啦这个DHCP服务器!
既然DHCP 的好处是『免用户端设定』,而且对于行动装置的上网方面非常的方便!那么是否代表你就得要架设一部 DHCP 呢?那可不一定!接下来要告知大家的是几个概念性的问题, 你倒不一定『必需』遵守底下的一些概念呢!反正,自己的网域自己『爽』就好啦!
使用DHCP 的几个时机
在某些情况之下,倒是强烈的建议架设DHCP 主机的!什么情况呢?例如:
具有相当多行动装置的场合:
例如你的公司内部很多笔记型电脑使用的场合!因为这种笔电本身就是移动性的装置,如果每到一个地方都要去问人家『喂!你这边的网路参数是什么?』还得要担心是否会跟人家的IP相冲突等等的问题!这个时候,DHCP可就是你的救星啰!
区域内电脑数量相当的多时:
另外一个情况就是你所负责的网域内电脑数量相当庞大时,大到你没有办法一个一个的进行说明来设定他们自己的网路参数,这个时候为了省麻烦,还是架设DHCP来的方便呐!况且,维护一部你熟悉的DHCP主机,要比造访几十个不懂电脑的人要简单的多哩!^_^
不建议使用DHCP 主机的时机
虽然DHCP有很多好处,但是你有没有发现一个步骤怪怪的呀!回头看一下那个步骤一,用户端在开机的时候会主动的发送讯息给网域上的所有机器,这个时候,如果网域上就是没有DHCP主机呢?很抱歉,那么你的这部用户端电脑,『仍然会持续的发送讯息!』真正的时间与次数不晓得会有多久,不过,肯定会超过30秒以上, 甚至可以达到一分钟以上!哇!那么这段时间你能干嘛?呵呵!除了等、还是等!所以啰,如果电脑数不多,还是使用手动的方式来设定一下就好了!方便嘛!
在你网域内的电脑,有很多机器其实是做为主机的用途,很少用户需求,那么似乎就没有必要架设DHCP ;
更极端的情况是,像一般家里,只有3 ~ 4 部电脑,这个时候,架设DHCP 只能拿来练练功力,事实上,并没有多大的效益;
当你管理的网域当中,大多网路卡都属于老旧的型号,并不支援DHCP 的协定时;
很多使用者的资讯知识都很高,那么也没有需要架设DHCP 啦。
如前所述,上面的都是概念性的说法,事实上,一件事情的解决之道是有很多的方案的, 没有所谓的『完全正确』的方案,只有『相对可行、并且符合经济效益与功能』的方案!所以啰,架设任何网站之前,请先多评估评估呐!
事实上,目前市面上的IP 分享器已经便宜到爆了!而IP 分享器本身就含有DHCP 的功能。所以如果你只是想要单纯的使用DHCP 在你的区域网路当中而已,那么建议你直接购买一部IP 分享器来使用即可, 因为至少它很省电。如果你还有其他考量的话,才来架设DHCP 吧!底下我们以一个简单的范例来架设DHCP 先。
DHCP 的软体需求很简单,就是只要服务器端软体即可,在CentOS 6.x 上面,这个软体的名称就是 dhcp 啰!如果是预设安装,那么这个软体是不会安装的,请自行使用yum 去装好这个软体吧!安装完毕之后, 你可以使用『 rpm -ql dhcp 』来看看这个软体提供了哪些档案,基本上,比较重要的档案资料如下:
/etc/dhcp/dhcpd.conf
这个就是dhcp服务器的主要设定档咯!在某些Linux版本上头这个档案可能不存在,所以如果你确定有安装dhcp软体却找不到这个档案时,请手动自行建立它即可。
Tips: 其实dhcp软体在释出的时候都会附上一个范例档案,你可以使用『 rpm -ql dhcp 』来查询到dhcpd.conf.sample这个范例档案,然后将该档案复制成为/etc/dhcp/dhcpd .conf后,再手动去修改即可,这样设定比较容易啦! |
/usr/sbin/dhcpd
启动整个dhcp daemon的执行档啊!其实最详细的执行方式应该要使用『 man dhcpd 』来查阅一番的呢!^_^
/var/lib/dhcp/dhcpd.leases
这档案颇有趣的!我们前面原理部分不是有提到『租约』吗?DHCP服务器端与用户端租约建立的启始与到期日就是记录在这个档案当中的咯!
就跟你说很简单吧!整个软体资料也不过才如此而已呢!
在CentOS 5.x 以前,这个档案都被放置到/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吧!好了,那么需要设定的项目有哪些呢?其实dhcpd.conf里头的设定主要分为两大项目,一个是服务器运作的整体设定(Global)一个是IP设定模式(动态或固定),每个项目的设定值大概有底下这几项:
整体设定(Global)
假设你的dhcpd 只管理一个区段的区网,那么除了IP 之外的许多网路参数就可以放在整体设定的区域中,这包括有租约期限、DNS 主机的IP 位址、路由器的IP 位址还有动态DNS (DDNS) 更新的类型等等。当固定IP 及动态IP 内没有规范到某些设定时,则以整体设定值为准。这些参数的设定名称为:
default-lease-time时间:
使用者的电脑也能够要求一段特定长度的租约时间,但若使用者没有特别要求租约时间的话,那么就以此为预设的租约时间。后面的时间参数预设单位为秒;
max-lease-time时间:
与上面的预设租约时间类似,不过,这个设定值是在规范使用者所能要求的最大租约时间。也就是说,使用者要求的租约时间若超过此设定值,则以此值为准;
option domain-name "领域名称":
如果你在/etc/resolv.conf里面设定了一个『 search google.com 』的话,这表示当你要搜寻主机名称时, DNS系统会主动帮你加上这个领域名称的意思。
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喔。
ignore client-updates:
与上一个设定值较相关,用户端可以透过dhcpd服务器来更新DNS相关的资讯。不过,这里我们也先不谈这个,因此就将它设定为ignore (忽略)了。
option routers路由器的位址:
设定路由器的IP所在,记得那个『 routers 』要加s才对!
IP 设定模式(动态或固定)
由于dhcpd 主要是针对区域网路来给予IP 参数的,因此在设定IP 之前,我们得要指定一个区网才行。指定区网的方式使用如下的参数:
subnet NETWORK_IP netmask NETMASK_IP { ... }我们知道区网要给予network / netmask IP 这两个参数才行,例如之前谈过的: 192.168.100.0 / 255.255.255.0 这样的设定值。上头设定值当中, subnet 与netmask 是关键字,而大写部分就填上你的区网参数啰。那在括号内还有什么参数需要设定的?那就是到底IP 是固定的还是动态的设定啊:
range IP1 IP2:
在这个区网当中,给予一个连续的IP群用来发放成动态IP的设定,那个IP1 IP2指的是开放的IP范围。举例来说,你想要开放192.168.100.101到192.168.100.200这100个IP用来作为动态分配,那就是: range 192.168.100.101 192.168.100.200;
host主机名{ ... };
这个host就是指定固定IP对应到固定MAC的设定值,那个主机名称可以自己想想再给予即可。不过在大括号内就得要指定MAC与固定的IP啰!那这两个设定值怎么设定呢?看看底下啰:
hardware ethernet硬体位址:
利用网路卡上面的固定硬体位址来设定,亦即该设定仅针对这个硬体位址有效的意思;
fixed-address IP位址:
给予一个固定的IP位址的意思。
假设我的环境当中,Linux主机除了NAT服务器之外还得要负责其他服务器,例如邮件服务器的支援。而在后端区域网路中则想要提供DHCP的服务。整个硬体配置的情况就如同第三章的图3.2-1所示的内部独立区网(centos.vbird网域)。需要注意的是,在图中Linux Router有两块介面,其中eth1对内而eth0对外,至于其他的网路参数设计为:
Linux 主机对内的eth1 的IP 设定为192.168.100.254 这个;
内部网段设定为192.168.100.0/24 这一段,且内部电脑的router 为192.168.100.254 ,此外DNS 主机的IP 为中华电信的168.95.1.1 及Seednet 的139.175.10.20 这两个;
我想要让每个使用者预设租约为3 天,最长为6 天;
只想要分配的IP 只有192.168.100.101 到192.168.100.200 这几个,其他的IP 则保留下来;
我还有一部主机,他的MAC 是『 08:00:27:11:EB:C2 』,我要给他的主机名称为win7 ,且IP 为192.168.100.30 这个(请对照图3.2-1 喔! )。
那我的设定档就会像底下这个样子了:
[root@www ~]# vim /etc/dhcp/dhcpd.conf # 1.整体的环境设定 ddns-update-style none; <==不要更新DDNS的设定 ignore client-updates; <==忽略用户端的DNS更新功能 default-lease-time 259200; <==预设租约为3天 max-lease-time 518400; <==最大租约为6天 option routers 192.168.100.254; <==这就是预设路由 option domain- name "centos.vbird"; <==给予一个领域名称 option domain-name-servers 168.95.1.1, 139.175.10.20; # 上面是DNS 的IP 设定,这个设定值会修改用户端的/etc/resolv.conf 档案内容 # 2. 关于动态分配的IP subnet 192.168.100.0 netmask 255.255.255.0 { range 192.168.100.101 192.168.100.200; <==分配的IP范围 # 3. 关于固定的IP 啊! host win7 { hardware ethernet 08:00:27:11:EB:C2; <==用户端网卡MAC fixed-address 192.168.100.30; <==给予固定的IP } } #相关的设定参数意义,请查询前一小节的介绍,或者man dhcpd.conf |
够简单吧!这样就设定好了!你可以复制上头的资料然后修改一下,让里头的IP 参数符合你的环境, 就能够设定好你的DHCP 服务器了。接下来理论上你就能够启动dhcp 了。不过,在某些早期的Linux distribution 上面, 当你的Linux 主机具有多个介面时,你的一个设定可能会让多个介面同时来监听,那就可能会发生错误了。
举例来说,我们现在的设定是192.168.100.0/24 这个在eth1 上头的网域,假设你还有一个介面eth2 在192.168.2.0/24 好了, 那万一你的DHCP 同时监听两块介面的话,想一想,如果192.168.2.0/24 网域的用户端发送出dhcp 封包的要求时, 他会取得什么IP ?当然是192.168.100.X !所以啰,我们就得要针对dhcpd 这个执行档设定他监听的介面, 而不是针对所有的介面都监听啊!你说是吧!^_^!那如何处理呢?在CentOS (Red Hat 系统) 可以这样做:
[root@www ~]# vim /etc/sysconfig/dhcpd DHCPDARGS= "eth0" |
不过这个动作在CentOS 5.x 以后的版本上面已经不需要了,因为新版本的dhcp 会主动的分析服务器的网段与实际的dhcpd.conf 设定, 如果两者无法吻合,就会有错误提示,人性化多了。^_^!接下来我们可以开始启动dhcp 试看看啰!
开始来启动dhcp 吧!在启动前你得要注意几件事情喔:
你的Linux 服务器网路环境已经设定好,例如eth1 已经是192.168.100.254;
你的防火墙规则已经处理好,例如:(1)放行内部区网的连线、(2)iptables.rule 的NAT 服务已经设定妥当;
另外你要注意的是:dhcpd 使用的埠口是port 67 ,并且启动的结果会记录在/var/log/messages 档案内,你最好能去观察一下/var/log/messages 所显示的dhcpd 相关资讯才好。
# 1.启动后观察一下埠口的变化: [root@www ~]# /etc/init.d/dhcpd start [root@www ~]# chkconfig dhcpd on [root@www ~]# netstat -tlunp | grep dhcp 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:* 1581/dhcpd # 2.固定去看看登录档的输出资讯 [root@www ~]# tail -n 30 /var/log/messages Jul 27 01:51:24 www dhcpd: Internet Systems Consortium DHCP Server 4.1.1-P1 Jul 27 01:51:24 www dhcpd: Copyright 2004-2010 Internet Systems Consortium. Jul 27 01:51:24 www dhcpd: All rights reserved. Jul 27 01:51:24 www dhcpd: For info, please visit https://www.isc.org/software/dhcp/ Jul 27 01:51:24 www dhcpd: WARNING: Host declarations are global. They are not limited to the scope you declared them in. Jul 27 01:51:24 www dhcpd: Not searching LDAP since ldap-server, ldap-port and ldap-base-dn were not specified in the config file Jul 27 01:51:24 www dhcpd: Wrote 0 deleted host decls to leases file. Jul 27 01:51:24 www dhcpd: Wrote 0 new dynamic host decls to leases file. Jul 27 01:51:24 www dhcpd: Wrote 0 leases to leases file. Jul 27 01:51:24 www dhcpd: Listening on LPF/eth1/08:00:27:2a:30:14/192.168.100.0/24 Jul 27 01:51:24 www dhcpd: Sending on LPF/eth1/08:00:27:2a:30:14/192.168.100.0/24 ....(以下省略).... |
看到这些资料就是成功的象征啦!尤其是上述有特殊字体的部分。恭喜你啊!真是『福气啦!』不过, 万一你看到的登录档是类似底下的模样呢?
Jul 27 01:56:30 www dhcpd: /etc/dhcp/dhcpd.conf line 7 : unknown option dhcp.domain-name-server Jul 27 01:56:30 www dhcpd: option domain-name-server#011168. Jul 27 01:56:30 www dhcpd: ^ Jul 27 01:56:30 www dhcpd: /etc/dhcp/dhcpd.conf line 9 : Expecting netmask Jul 27 01:56:30 www dhcpd: subnet 192.168.100.0 network Jul 27 01:56:30 www dhcpd: ^ Jul 27 01:56:30 www dhcpd: Configuration file errors encountered -- exiting |
上述的资料表示在第7, 9 行恐怕有点设定错误,设定错误的地方在行号底下还有指数符号(^) 特别标注出来!由上面的情况来看,第7 行的地方应该是domain-name-servers 忘了加s 了,而第9 行则是参数下错, 应该是netmask 而非network !这样了解乎?
如果你有仔细的瞧过第二章的网路基础的话,那么应该还会记得那个 /etc/hosts (第四章4.4.1) 会影响内部电脑在连线阶段的等待时间吧?那么我现在使用DHCP之后,糟糕!我怎么知道哪一部PC连上我的主机,那要怎么填写/etc/hosts的内容呢?这真是太简单了!就将所有可能的电脑IP都加进去该档案呀!^_^ !以鸟哥为例,在这个例子中,鸟哥的分配的IP至少有192.168.100.30, 192.168.100.101 ~ 192.168.100.200 ,所以/etc/hosts可以写成:
[root@www ~]# vim /etc/hosts 127.0.0.1 localhost.localdomain localhost 192.168.100.254 vbird-server 192.168.100.30 win7 192.168.100.101 dynamic-101 192.168.100.102 dynamic-102 ....(中间省略).... 192.168.100.200 dynamic-200 |
这样一来,所有可能连进来的IP都已经有纪录了,哈哈!当然没有什么大问题啰!^_^!不过, 更好的解决方案则是架设内部的DNS服务器,这样一来,内部的其他Linux服务器也不必更改/etc/hosts就能够取得每部主机的IP与主机名称对应,那样就更加妥当啦!
DHCP 的用户端可以是Windows 也可以是Linux 呢!鸟哥的网域内使用三部电脑,就如图3.2-1 所示的那样。Linux 与Windows XP 的设定方式已经分别在第四章与第三章谈过了,底下就稍微介绍过而已。至于图示的部分, 我们主要是以Windows 7 来做介绍啰。
Linux的网路参数设定还记得吧?不记得的话就得要打屁股了!在第四章(4.2.2)我们谈过自动取得IP的方式,设定真的很简单:
[root@clientlinux ~]# vim /etc/sysconfig/network-scripts/ifcfg-eth0 DEVICE=eth0 NM_CONTROLLED=no ONBOOT=yes BOOTPROTO=dhcp <==就是他!指定这一个就对了! [root@clientlinux ~]# /etc/init.d/network restart |
同时记得要拿掉预设路由的设定喔!改完之后,就将我们的整个网路重新启动即可 (不要使用ifdown 与ifup ,因为还有预设路由要设定!)。请注意,如果你是在远端进行这个动作, 你的连线『肯定会挂掉!』,因为网路卡被你关了嘛!呵呵!所以请在本机前面才进行喔!如果执行的结果有找到正确的 DHCP 主机,那么几个档案可能会被更动喔:
# 1. DNS的IP会被更动呢!查阅一下resolv.conf先: [root@clientlinux ~]# cat /etc/resolv.conf search centos.vbird <==还记得设定过domain-name否? domain centos.vbird <==还记得设定过domain-name否? nameserver 168.95.1.1 <==这就是我们在dhcpd.conf内的设定值 nameserver 139.175.10.20 # 2.观察一下路由啦! [root@clientlinux ~]# route -n Kernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Iface 192.168.100.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0 0.0.0.0 192.168.100.254 0.0.0.0 UG 0 0 0 eth0 #嗯!没错!路由也被正确的捉到了!OK的啦! # 3.察看一下用户端的指令吧! [root@clientlinux ~]# netstat -tlunp | grep dhc 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:* 1694/dhclient #你没看错!确实是有个小程式在监测DHCP的连线状态呐! # 4.看一看用户端租约所记载的资讯吧! [root@clientlinux ~]# cat /var/lib/dhclient/dhclient* lease { interface "eth0"; fixed-address 192.168.100.101; <==取得的IP呦! option subnet-mask 255.255.255.0; option routers 192.168.100.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.100.254; option domain-name "centos.vbird"; renew 4 2011/07/28 05:01:24; <==下一次预计更新(renew)的时间点 rebind 5 2011/07/29 09:06:36; expire 5 2011/07/29 18:06:36; } # 这个档案会记录该介面卡所曾经要求过的DHCP 资讯喔!重要! # 有没有看出来,他几乎就与你设定的/etc/dhcp/dhcpd.conf 类似?^_^ |
有没有发现其实你的用户端取得的资料都被记载在/var/lib/dhclient/dhclient*-eth0.leases 里头啊?如果你有多张网卡,那么每张网卡自己的DHCP 要求就会被写入到不同档名的档案当中去!观察该档案就知道你的资料是如何啰!这可也是挺重要的呦!
Tips: 你或许会问说, dhcp不是都会随机取得IP吗?那为什么这部用户端clientlinux.centos.vbird每次都能够取得相同的固定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 才行。
|
在Windows底下设定DHCP协定以取得IP实在是很简单喔!例如,你可以到第三章的 3.2.2小节去瞧瞧如何设定的撷取图示。我们这里以Windows 7作为介绍好了。你可以依据『开始』-->『控制台』-->『检视网路状态及工作』 -->『变更介面卡设定』,在出现的图示中,选择属于你的相关网卡,然后连击两下之后,就开始底下的设定程序:
如上所述,点击网路卡设定后,会出现如下图示:
在图12.3-1 的地方按下箭头所指的『内容』处,就会出现如下画面啰:
在上面的画面当中,先点选TCP/IP4 第四版IP 协定,然后按下『内容』就可以开始来修改网路参数啰!
接下来如下图所示,你只要勾选『自动取得IP 位址』那个项目,然后按下『确定』并离开设定画面, 如此一来Windows 就会开始自动取得IP 的工作了。
那你如何确认你的IP 已经被顺利的取得呢?如果是在早期的Windows 95 ,你可以使用一个名为『 winipcfg 』 来观察你的IP 设定。不过在windows 2000 以后,你可能需要使用命令提示字元来观察才行。你可以使用: 『开始』-->『所有程式』-->『附属应用程式』-->『命令提示字元』来取出终端机,然后这样处理看看:
C:\Users\win7> ipconfig /all ....(前面省略).... 乙太网路卡区域连线: 连线特定DNS 尾码. . . . . . . . : centos.vbird 描述. . . . . . . . . . . . . . .: Intel(R) PRO/1000 MT Desktop Adapter 实体位址. . . . . . . . . . . . .: 08-00-27-11-EB-C2 DHCP 已启用. . . . . . . . . . . : 是 自动设定启用. . . . . . . . . . .: 是 连结-本机IPv6 位址. . . . . . . : fe80::ec92:b907:bc2a:a5fa%11(偏好选项) IPv4位址. . . . . . . . . . . . : 192.168.100.30(偏好选项) <==这是取得的IP 子网路遮罩. . . . . . . . . . . .: 255.255.255.0 租用取得. . . . . . . . . . . . .: 2011年7月27日上午11:59:18 <==这是租约 租用到期. . . . . . . . . . . . .: 2011年7月30日上午11:59:18 预设闸道. . . . . . . . . . . . .: 192.168.100.254 DHCP服务器. . . . . . . . . . . : 192.168.100.254 <==这一部DHCP服务器 DNS服务器. . . . . . . . . . . .: 168.95.1.1 <==取得的DNS 139.175.10.20 NetBIOS over Tcpip . . . . . . . .: 启用 C:\Users\win7> ipconfig /renew #这样可以立即要求更新IP资讯喔! |
这样就OK 的啦!简单吧!
如果你要管理的是几十部甚至是几百部的电脑时,你总是希望能够根据座位来进行IP 的给予吧?因此,固定IP 配合MAC 就显的很重要啦!那么如何取得每部主机的IP 呢?还有,你怎么查询到相关的租约呢?以及,如果你还想要进行远端开机, 帮使用者在固定的时间就开机呢?那就来看看底下的其他用途吧!
用户端会主动的纪录租约资讯,那服务器端更不能忘记记录啰!服务器端是记录在这个地方:
[root@www ~]# cat /var/lib/dhcpd/dhcpd.leases lease 192.168.100.101 { starts 2 2011/07/26 18:06:36; <==租约开始日期 ends 5 2011/07/29 18:06:36; <==租约结束日期 tstp 5 2011/07/29 18:06:36; cltt 2 2011/07/26 18:06:36; binding state active; next binding state free; hardware ethernet 08:00:27:34:4e:44; <==客户端网卡 } |
从这个档案里面我们就知道有多少用户端已经向我们申请了DHCP 的IP 使用了呢!很容易了解吧!
想一想,如果你有一百台电脑要管理,每部电脑都希望是固定IP 的情况下,那你要如何处置?很简单,透过DHCP 的fixed-address 就行啦!但是,这一百台电脑的MAC 如何取得?你要怎么改啦?难道每部电脑都去抄写,然后再回来设定dhcpd.conf 吗?这也太可怕了吧?既然每部电脑最终都得要开机, 那么你在开机之后,利用手动的方法来设定好每部主机的IP 后,在根据底下的脚本来处理好你的dhcpd.conf 啰!
[root@www ~]# vim setup_dhcpd.conf #!/bin/bash read -p "Do you finished the IP's settings in every client (y/n)? " yn read -p "How many PC's in this class (ex> 60)? " num if [ "$yn" = "y" ]; then for site in $(seq 1 ${num}) do siteip="192.168.100.${site}" allip="$allip $siteip" ping -c 1 -w 1 $siteip > /dev/null 2>&1 if [ "$?" == "0" ]; then okip="$okip $siteip" else errorip="$errorip $siteip" echo "$siteip is DOWN" fi done [ -f dhcpd.conf ] && rm dhcpd.conf for site in $allip do pcname=pc$(echo $site | cut -d '.' -f 4) mac=$(arp -n | grep "$site " | awk '{print $3}') echo " host $pcname {" echo " hardware ethernet ${mac};" echo " fixed-address ${site};" echo " }" echo " host $pcname {" >> dhcpd.conf echo " hardware ethernet ${mac};" >> dhcpd.conf echo " fixed-address ${site};" >> dhcpd.conf echo " }" >> dhcpd.conf done fi echo "You can use dhcpd.conf (this directory) to modified your /etc/dhcp/dhcpd.conf" echo "Finished." |
这个脚本的想法很简单,如果你管理的电脑都是Linux 的话,那么先开机后使用『 ifconfig eth0 YOURIP 』 来设定对应的IP ,在鸟哥这个例子中,我使用的是192.168.100.X/ 24 这个区段,此时IP 就设定好了!然后在透过上面的脚本跑一次,每部电脑的MAC 与IP 对应就顺利的写入dhcpd.conf 啰!然后你在将它贴上/etc/dhcp/dhcpd.conf 即可!如果你管理的电脑是Windows 的话, 那使用文字介面下达『 netsh interface ip set address xxx 』之类的指令来修订啰!
既然已经知道用户端的MAC位址了,如果用户端的主机符合一些电源标准,并且该用户端主机所使用之网路卡暨主机板支援网路唤醒的功能时,我们就可以透过网路来让用户端电脑开机了。如果你有一部主机想要让他可以透过网路来启动时,你必须要在这部用户端电脑上进行:
首先你得要在BIOS 里面设定『网路唤醒』的功能,否则是没有用的喔!
再来你必须要让这部主机接上网路线,并且电源也是接通的。
将这部主机的MAC 抄下来,然后关机等待网路唤醒。
接下来请到永远开着的主机DHCP 服务器上面(其实只要任何一部Linux 主机均可!) ,安装net-tools 这个软体后, 就会取得ether-wake 这个指令,这就是网路唤醒的主要功能!那该如何使用这个指令呢?假设用户端主机的MAC 为 11:22:33:44:55:66 并且与我的服务器eth1 相连接好了,那么你想要让这部主机被唤醒,就这样做吧:
[root@www ~]# ether-wake -i eth1 11:22:33:44:55:66 #更多功能可以这样查阅喔: [root@www ~]# ether-wake -u |
然后你就会发现,哈哈!那部用户端主机被启动了!以后如果你要连到区域网路内的话, 只要能够连上你的防火墙主机,然后透过这个ether-wake 软体,就能够让你区域网路内的主机启动了, 控管上面就更加方便的啦!你说是吧!^_^
Tips: 鸟哥办公室有一部桌机是经常用来测试的机器,但是因为比较耗电,因此当鸟哥离开办公室时,就会将电脑关闭。不过鸟哥办公室有一部NAT server在负责防火墙的第一道关卡,当鸟哥在家里有需要查询到学校桌机的资料时,桌机关了怎办?没关系,透过NAT server登入后,使用ether-wake唤醒桌机,那就能够开机进去工作啰!这样也比较不怕耗电问题~ |
我们知道区域网路内如果很多Linux 服务器时,你得要将private IP 加入到每部主机的/etc/hosts 里面, 这样在连线阶段的等待时间才不会有逾时或者是等待太久的问题。问题是,如果电脑数量太大,又有很多测试机时, 这时你得要常常去更新维护那些重灌过的机器的/etc/hosts ,烦不烦呐?
此时在区网内架设一部DNS服务器负责主机名称解析就很重要!因此既然已经有DNS服务器帮忙进行主机名称的解析,那你根本不需要更动/etc/hosts !未来的新机器或者是新灌的电脑也不需要改写任何网路参数,这样维护会轻松很多。因此,一个好的区网内,理论上,我们应该在DHCP服务器主机上面在安装一个DNS服务器,提供内部电脑的名称解析为宜。相关的设定就请参考第十九章DNS的介绍啰。
DHCP 回应速度与有网管switch 的设定问题
鸟哥在昆山资讯传播系( http://www.dic.ksu.edu.tw )负责五间电脑教室的维护,每间电脑教室内部的giga switch是低阶的有网管功能的机器!有网管功能机器的设定资讯比较多, switch也能够进行封包异常的侦测与抵挡。问题是,如果抵挡的行为『太超过』时,也可能造成许多问题。
鸟哥管理的电脑教室在重新启动网路取得DHCP 时,都会等待几乎达30 秒,虽然最终是成功的,但是等这么久呢!取得IP 之后,网路速度却又是正常的,一切没问题~就是教导网路参数设定时,学生都会哇哇叫!以为失败了, 有的等了将近一分钟才告知取得IP 且为正常...
后来问了有经验的计中的罗组长,才发现可能是switch 的问题。大多在设定位于『L2 Features』-->『Spanning Tree』-->『STP Port Settings』的子项目之类的字眼,将STP 之类的埠口都设定为关闭(Disabled) 看看, 鸟哥做完这个设定后,DHCP 的取得就顺畅了!连带的网路开机功能也就没有问题~这部份也提供给大家参考呦!
Tips: 网友巩立伟兄来信谈到,STP主要的目的是在抵挡广播风暴,若侦测到广播风暴时,该switch的埠口会被停用。只是启动这个功能后,会较缓慢的进入运作状态,所以会产生较慢的情况发生。较好的switch会支援RSTP (Rapid spanning tree protocol),速度会较快一些。感谢朋友提供的资讯喔!^_^ |
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 可以提供的MAC 比对、Dynamic IP 的IP 范围以及租约期限等等,都在dhcpd.conf 这个档案当中设定的;
一般的情况之下,使用者需要自行设定dhcpd.leases 这个档案,不过,真正的租约档案记录是在 /var/lib/dhclient/dhclient-eth0.leases 里面;
如果只是要单纯的DHCP 服务,建议可以购买类似IP 分享器的设备即可提供稳定且低耗电的网路服务。
DHCP 服务与DNS 服务的相关性很高;
若DHCP 用户端取得IP 的速度太慢,或许可以找一下有网管switch 的STP 设定值。
DHCP 主要的两种IP 分配模式为何?
在有DHCP 主机存在的网域当中,且client 端亦使用DHCP 来规划用户端的网路参数,那么请问,在该网域当中,Client 端透过DHCP 取得IP 的流程为何?
首先, Client 端会发出一个DHCP 要求封包;
server 端接收到要求后,会主动的回应资讯给Client ;
Client 若接受该DHCP 主机所提供的参数,则主机会记录下租约资讯,至于client 端则开始以主机提供的参数设定其网路
DHCP 是如何发送Static IP 的?可以使用何种指令取得该资讯?
在DHCP 服务器的租约档,亦即/var/lib/dhcpd/dhcpd.leases 当中,记录了什么资讯?
DHCP 的登录档放置于何处?
注1:在维基百科的DHCP相关说明:
http://zh.wikipedia.org/zh-tw/DHCP
http://en.wikipedia.org/wiki/Dynamic_Host_Configuration_Protocol
其他可供查阅之资料:
DHCP mini HOWTO:英文版:http://tldp.org/HOWTO/DHCP/index.html
DHCP mini HOWTO:中文版:http://www.linux.org.tw/CLDP/ MiniHOWTO/network/DHCP/
Internet Software consortium:http://www.isc.org/software/dhcp
Study Area:http://www.study-area.org/linux/servers/linux_dhcp.htm
Study Area网路开机(我本善良兄撰写):http://www.study-area.org/tips/wol.htm
2002/11/23:第一次完成
2003/03/15:加入相关重点回顾、与练习题
2003/09/10:修改版面去!
2006/12/05:将旧的文章移动到此处
2006/12/06:好累!怎么老是在说累~总之,完成啰~新增加ether-wake的网路唤醒功能。
2011/02/24:将基于CentOS 4.x的旧的文章移动到此处
2011/03/03:加入了DNS的相关性,有网管的STP会影响DHCP的取得等资料。
2011/07/27:将基于CentOS 5.x的版本移动到此处
2011/07/27:主要是将Windows的图示以Windows 7来示意啰!