Linux下配置完整安全的DHCP服务器详解.docx
《Linux下配置完整安全的DHCP服务器详解.docx》由会员分享,可在线阅读,更多相关《Linux下配置完整安全的DHCP服务器详解.docx(36页珍藏版)》请在冰豆网上搜索。
Linux下配置完整安全的DHCP服务器详解
-dhcpd配置文件
描述
文件包括ISCDHCP的dhcpd的配置信息。
文件是一个普通格式的ASCII码文档,它由内置的递归解析器解释。
文件可能会包含许多额外的tab和空格、空行,它们的目的是让文件更容易阅读。
其中的关键字对大小写不敏感。
注释语句可以放在任何位置(除了引号中)注释语句用#开头,这一行结束时注释语句自然结束。
文件包括一组语句,语句在一对大括号中,包含参数和声明。
参数语句说明如何做一件事(例如,租期是多长时间),或者是否做一件事情。
(例如,dhcpd是否为未知客户提供地址),或者给客户提供哪种参数(例如,使用网关。
声明用来描述网络的拓扑结构、网络上的客户,提供可以为客户端分配的地址,或者对某个客户端组应用组(group)参数。
在任何组参数中,所有的这些组参数必须比使用这些组参数的语句先出现。
网络声明包含多子网的网络(有些地方译为:
超网,但超网太难理解了,这里叫“多子网网络”)和子网的拓扑声明。
对于有地址被动态分配给客户端的子网,子网声明中必须有一个range声明语句。
对于静态分配的地址,或者是已知客户的安装,每个客户端都必须使用一个host声明语句。
如果一个参数应用到一组声明中,这些声明并不只与某个子网相关,可以定义一个“组参数”。
对每一个要服务的子网,每个dhcp服务器连接的子网,都必须有一个子网声明,用来告诉dhcpd如何处理那个子网上的地址。
即使一个子网不需要分配任何地址,也需要一个子网声明。
一些物理网络上不只有一个IP子网存在,例如,如果一个网络需要一个8位的子网,但是当业务发展使总的节点数超过了254台,就需要增加一个8位的子网。
这时,就增加了一个新的物理网络,这种情况下,2个网络的子网声明必须包含在一个“多子网网络声明(超级作用域)”中。
有些网络的客户端不只有一个子网,可能会为同一子网中一些客户端分配的一些参数与其它的客户端不同。
这样的用户可以使用host语句来定义,一些参数也可以定义在“组参数”语句中,它被这些客户端共同调用。
对于需要根据不同情况获得不同地址的客户端,可能会使用“类声明(classdeclarations)”和“条件声明(conditionaldeclarations)”语句,这样可以根据客户端发送的信息来决定分配给客户端的参数。
当一个客户端启动时,服务器先查看是否有匹配客户端的host语句,如果没有,再看是否有匹配的“类声明(classdeclarations)”语句,接着查看是否有“池pool”匹配,“子网subnet”匹配和“多子网网络(超级作用域)shared-net-work”匹配。
(根据这些匹配,)将符合这个客户端的参数提供给它。
每种参数都不会被分析第2次,如果它们出现了2次或2次以上,那么会使用那个最精确出现的地方。
dhcpd首先查找客户端是否有包含固定IP地址的host语句,这个地址要在客户端启动的那个子网中,或者“多子网网络”中,如果没有对应的host语句匹配,那就查找非固定地址的声明。
例如:
一个典型的文件将会象下面这样:
globalparameters...
subnetnetmask{
subnet-specificparameters...
range}
subnetnetmask{
subnet-specificparameters...
range}
subnetnetmask{
subnet-specificparameters...
range}
group{
group-specificparameters...
host{
host-specificparameters...
}
host{
host-specificparameters...
}
host{
host-specificparameters...
}
}
图1
注意文件的开始,它是全局参数放置的地方,可能会是:
组织的域名,DNS服务器的地址(如果这个服务器对整个网络都是一样的)和其它一些。
比如:
optiondomain-name"";
optiondomain-name-servers
图2
如图2中所示,可以使用DNS服务器的名称而不使用它的IP地址,如果指定不只一个DNS服务器地址,那么只要有可能,所有地址都会提供给客户端。
每个子网都要指明的最可能必须的参数是router,如图1所示。
因此对于第一个子网,它就应该是这个样子的
optionrouters注意这里的地址是数字形式的,如果每个网关都有域名,这就不是必须的,使用域名也是合法的。
然而,很多情况下,多个网关只有一个域名,这样就不能使用域名了。
在图1中,有一个group语句,它为一组host语句zappo,beppo和harpo提供了通用的参数。
如你所见,这些主机都在这个域里,这样它在“组参数”中指明就会覆盖全局设置的参数:
optiondomain-name"";
而且,指明它们的域,可能用在测试机器中,如果我们要测试DHCP的租约机制,可以在这里设置比默认值更短的租约:
max-lease-time120;
default-lease-time120;
你可能注意到有些参数以option关键字开头,有些不。
以option关键字开头的语句对应实际的DHCP选项,不以option关键字开头的选项控制服务端(例如,租期)或客户端的选项不在DHCP协议中(例如,服务器名或文件名)
在图1中,每个host都有指定的参数,它会包含象hostname选项,要上传的文件名(filename参数),还有要上传的服务器的地址(next-server参数)。
通常,任何参数都可以在任何可以出现的地方出现,并且按照参数出现位置确定应用范围。
假设你的环境中有许多没有CD的X终端,这些终端有不同的型号,你想为每种型号确定一个启动文件,一种方法是给每个服务器和组都使用host语句:
group{
filename"Xncd19r";
next-serverncd-booter;
hostncd1{hardwareethernet0:
c0:
c3:
49:
2b:
57;}
hostncd4{hardwareethernet0:
c0:
c3:
80:
fc:
32;}
hostncd8{hardwareethernet0:
c0:
c3:
22:
46:
81;}
}
group{
filename"Xncd19c";
next-serverncd-booter;
hostncd2{hardwareethernet0:
c0:
c3:
88:
2d:
81;}
hostncd3{hardwareethernet0:
c0:
c3:
00:
14:
11;}
}
group{
filename"XncdHMX";
next-serverncd-booter;
hostncd1{hardwareethernet0:
c0:
c3:
11:
90:
23;}
hostncd4{hardwareethernet0:
c0:
c3:
91:
a7:
8;}
hostncd8{hardwareethernet0:
c0:
c3:
cc:
a:
8f;}
}
地址池
“池”语句(pool)用来定义一个地址池,即便是在同一个网段或者子网,也可以定义几个池,系统将通过“池”来区分它们。
例如,你可能想提供一大段地址分配给DHCP客户端时同时提供很短的租约的一小段地址,用来给未知客户。
如果有防火墙,你可能会安排一段地址池能上网,另一个地址池不能上网,这可以鼓励用户注册到DHCP系统中来,也就需要建立两个地址池:
subnet10.0.0.0netmask{
optionrouters10.0.0.254;
#Unknownclientsgetthispool.
pool{
optiondomain-name-serversmax-lease-time300;
range10.0.0.200allowunknown-clients;
}
#Knownclientsgetthispool.
pool{
optiondomain-name-serversmax-lease-time28800;
range10.0.0.5denyunknown-clients;
}
}
上面这个例子中,已知客户和未知客户在相同的子网中,也可能将已知和未知客户分配在不同的子网中,或者在“多子网层次(超级作用域)”,这样地址池的范围可能跨越不同的子网。
正如前面的例子,地址池可以允许或拒绝一个控制用户存取的组,这个组名前面要有allow或deny关键字。
如果一个池有一个允许列表,只有匹配的客户端才可以获得地址池的地址,如果这个池有一个拒绝列表,只有不匹配的客户端才可以获得池中的地址,如果同时存在允许和拒绝列表,那么只有在允许列表并且不在拒绝列表中的客户端才可以获得池中的地址。
动态地址分配
地址分配实际只在客户端在初始状态并且发送一个DHCPDISCOVER信息时完成。
如果客户端认为它有一个有效的租约并且发送了一个DHCPREQUEST信息来初始化或者更新租约,服务器就只有3个选择:
(1)它可以忽略DHCPREQUEST信息,并且返回一个DHCPNAK信息来告诉客户端,要求客户端停止使用这个地址,
(2)或者发送一个DHCPACK信息,告诉客户端继续再使用这个地址一段时间,如果服务器找到客户端要求的地址,并且这个地址对于这个客户也是可用的,服务器会发送一个DHCPACK信息,如果这个地址已经不能用了,客户端就不能使用它,此时服务器将会发送一个DHCPNAK信息,(3)如果服务器不知道这个地址,它会先保持沉默,除非这个地址对于客户端依附的地址段是不正确的,这种情况下服务器会发送一个DHCPNAK,即便它完全不知道这个地址。
如果有一个host语句定义了客户端,同时host语句中包含了固定地址(fixed-address),这个IP地址对于客户端实际连接的网段也是合法的,此时DHCP服务器不动态分配地址,而是发送host语句指明的地址。
如果此时用户发送了DHCPREQUEST信息来获得其它地址,服务器会回应一个DHCPNAK信息,来拒绝为用户分配其它地址。
当一个DHCP服务器为客户端分配一个新的地址时(记住,这只发生在客户端发送DHCPDISCOVER信息时),它首先查找lease文件,看客户机是否存在一个有效的地址租约,或者此客户机原来是否有一个地址(这个地址已经过期),如果有,服务器就会检查那个地址,看客户端是否被允许使用这个地址,如果客户端已经不被允许使用这个地址(通常是客户机从另外一个子网登录了,或者此地址被其它客户端占用),并且服务器lease文件中显示原来的租约还存在,服务器就释放这个租约,事实上,此时是客户端发送的DHCPDISCOVER信息,它已经证明客户端实际并没有使用这个租约。
如果没有找到存在的租约,或者客户端被强迫接收一个已经存在的租约,那么服务器就会查找客户端所在网段的地址池,找一个允许客户端使用而又没有使用的地址,它会按顺序遍历每个地址池(所有地址池外的“范围”range定义语句都组成一个没有允许列表的单独的池)。
如果地址池的允许列表允许客户端得到一个池中的地址,这个地址池会被检查是否有可用的地址,如果有,客户端将会得到这个地址;否则,会检查下一个地址池。
如果一直都没有找到可用的地址,服务器就不发送回应。
如果找到一个地址,这个地址以前从未被任何客户端使用过,这个地址将立即分配给这个客户,如果这个地址曾经分配给另一个客户端,服务器会尝试查找一个从未分配的地址给客户端。
DHCP服务器使用哈希表(hashtable)来产生一组可用的IP地址,这意味着地址不以任何特定的顺序存放,这样也就不能预测DHCP服务器下一个要分配的地址。
前一个版本的ISCDHCP服务器使用降序来分配地址,现在不是了,并且在这个版本里也没有办法配置服务器分发地址的顺序(ISCDHCP3)。
防止IP地址冲突
DHCP服务器在分配IP地址前检查它们是否被使用来防止冲突。
它通过向准备分配的IP地址发送ICMPEcho请求信息来完成,如果1秒内没有接收到ICMPEchoreply信息,就假定这个地址是可用的。
这只对在range语句中指明的租约,并且租约被DHCP服务器认为可用时有效。
例如,DHCP服务器或者它的热备机没有列出这个租约在使用中。
如果收到ICMPEcho回应,DHCP服务器会假定出现了配置错误――IP地址被网络上的主机使用了,然后它标记这个地址为“废弃地址”,不再把它分配给客户端。
如果DHCP客户端试图得到一个地址,但是却没有可用的地址,服务器会(随机)标记一个“废弃地址”为“可用”,然后向这个地址发送同样的ICMPEcho请求,如果没有得到ICMPEchoreply回应,这个地址就会分配给这个客户。
如果要收回的第一个IP地址是可用的,DHCP服务器不会去循环使用“废弃地址”。
而且,当下一个客户的DHCPDISCOVER信息到达时,它会用相同的方法开始一个新的分配,并且尝试分配一个新的IP地址。
在Linux中配置DHCP服务器
安装DHCP服务器
DHCP配置文件
可以使用RHEL自身携带的RPM包安装,安装结束后DHCP端口监督程序dhcpd配置文件是/etc目录中的名为的文件。
下面手工建立/etc/文件,该文件通常包括3个部分,即parameters参数、declarations声明和option选项。
1.DHCP配置文件中的parameters
parameters表明如何执行任务,以及是否要执行任务或将哪些网络配置选项发送给客户端,主要参数如表8-1所示。
DHCP配置文件中的主要参数
参数
解释
ddns-update-style
配置DHCP-DNS互动更新模式
default-lease-time
指定默认租赁时间的长度,单位是秒
max-lease-time
指定最大租赁时间长度,单位是秒
hardware
指定网卡接口类型和MAC地址
server-name
通知DHCP客户端服务器名称
get-lease-hostnamesflag
检查客户端使用的IP地址
fixed-addressip
分配给客户端一个固定的地址
authritative
拒绝不正确的IP地址的要求
2.DHCP配置文件中的declarations
declarations用来描述网络布局及提供客户的IP地址等,主要声明
声明
解释
shared-network
用来告知是否一些子网络共享相同网络
subnet
描述一个IP地址是否属于该子网
range起始IP终止IP
提供动态分配IP的范围
host主机名称
参考特别的主机
group
为一组参数提供声明
续表
声明
解释
allowunknown-clients﹔denyunknown-client
是否动态分配IP给未知的使用者
allowbootp;denybootp
是否响应激活查询
allowbooting﹔denybooting
是否响应使用者查询
filename
开始启动文件的名称,应用于无盘工作站
next-server
设置服务器从引导文件中装入主机名,应用于无盘工作站
DHCP配置文件中的option
option用来配置DHCP可选参数,全部用option关键字作为开始,主要选项如表8-3所示。
表8-3DHCP配置文件中option关键字的主要选项选项
解释
subnet-mask
为客户端设定子网掩码
domain-name
为客户端指明DNS名字
domain-name-servers
为客户端指明DNS服务器的IP地址
host-name
为客户端指定主机名称
routers
为客户端设定默认网关
broadcast-address
为客户端设定广播地址
ntp-server
为客户端设定网络时间服务器的IP地址
time-offset
为客户端设定格林威治时间的偏移时间,单位是秒
配置实例
在下面的实例中使用一个的虚拟域名,用户需要修改其中的内容以满足网络的需求。
/etc/文件的内容如下:
#Theoptionsoutsideasubnetdirectiveareglobalunless
#over-riddenbythesamesettinginsidethesubnetdirective.
optiondomain-name-servers,6000;max-lease-time7200;
#IfthisDHCPserveristheofficialDHCPserverforthelocal
#network,theauthoritativedirectiveshouldbe;
#Usethistosenddhcplogmessagestoadifferentlogfile(youalso
#havetohacktocompletetheredirection).log-facilitylocal7;
#Handleclientdynamicdnsupdates
ddns-update-stylenone;#ExampleNetwork1(oneth0)
subnetnetmask{
optiondomain-name"";
range optionrouters }
上面的实例配置文件分为两个部分,即子网配置信息和全局配置信息。
可以有多个子网,这里为了简化,只指定了一个子网。
(1)Subnet。
在上面的例子中,一个子网声明以“subset”关键字开始,所以子网信息包括在{}中。
{}中的配置信息只对该子网有效,会覆盖全局配置。
(2)Global。
所有子网以外的配置都是全局配置,如果同一个全局配置没有被子网配置覆盖,则其将对所有子网生效。
(3)ConfigurationOptions。
下面是上例中配置指令的解释说明。
optiondomain-name-servers, 这一行指定客户端应该使用的DNS服务器,该选项可以用于全局参数或者子网参数。
default-lease-time6000;max-lease-time7200;
这两行是相关的,default-lease-time指定客户端需要刷新配置信息的时间间隔(秒),max-lease-time为客户端用于无法从服务器获得任何信息的时间,超过该时间则会丢弃之前从该DHCP服务器获得的所有信息,而转向使用OS的默认设置。
authoritative;
指定当一个客户端试图获得一个不是该DHCP服务器分配的IP信息,DHCP将发送一个拒绝消息,而不会等待请求超时。
当请求被拒绝,客户端会重新向当前DHCP发送IP请求获得新地址。
log-facilitydaemon;
指定DHCP服务器发送的日志信息的日志级别。
ddns-update-stylenone;
该配置可以指定一个方法,客户端用该方法来更新IP对应的域名信息,本例中禁用了该特性。
subnetnetmask{
optiondomain-name"";
range optionrouters }
上面内容为子网配置,第1行指定该子网地址和掩码。
DHCP服务器必须拥有该子网的一个IP,domain-name设置该客户端的域名。
DHCP服务器可以负责整个子网的信息,也可以只负责子网的一段。
optionrouters配置默认网关IP。
启动DHCP服务器
1.建立客户端租约文件
运行DHCP服务器还需要一个名为“”的文件,其中保存所有已经分发的IP地址。
在RedHatLinux发行版本中,该文件位于/var/lib/dhcp/目录中。
如果通过RPM安装ISCDHCP,那么该目录应该已经存在。
的文件格式为:
Leasesaddress{statement}
一个典型的文件内容如下:
lease{#DHCP服务器分配的IP地址#
starts12005/05/0203:
02:
26;#lease开始租约时间#
ends12005/05/0209:
02:
26;#lease结束租约时间#
bindingstateactive;
nextbindingstatefree;
hardwareethernet00:
00:
e8:
a0:
25:
86;#客户机网卡MAC地址#
uid"\001\000\000\350\240%\206";#用来验证客户机的UID标志#
client-hostname"cjh1";#客户机名称#
}
注意:
lease开始租约时间和lease结束租约时间是格林威治标准时间(GMT),不是本地时间。
第1次运行DHCP服务器时,是一个空文件,也不用手工建立。
如果不是通过RPM安装ISCDHCP,或者dhcpd已经安装,那么应该试着确定dhcpd将其lease文件写到何处并确保该文件存在。
也可以手工建立一个空文件:
#touch/var/lib/dhcp/
2.启动和检查DHCP服务器
使用命令启动DHCP服务器:
#servicedhcpdstart
使用ps命令检查dhcpd进程:
#ps-ef|grepdhcpd
root24021014:
25?
00:
00:
00/usr/sbin/dhcpd
root27642725014:
29pts/200:
00:
00grepdhcpd
使用netstat检查dhcpd运行的端口:
#netstat-nutap|grepdhcpd
udp000.0.0.0:
672402/dhcpd
3.设置DHCP转发代理
DHCP的转发代理(dhcrelay)允许把无DHCP服务器子网内的DHCP和BOOTP请求转发给其他子网内的一台或多台DH