dhcpd.conf MAN配置文档--3 客户端的类
时间:2007-06-14 来源:liufirst
客户端分类(class)
客户端可以被分成一些类,并且按照所属的类被区别对待,这个区分可以由conditional 语句完成,或者由class语句中的match语句完成。可以指定某个指定的类或子类在同一时间内获得租约的全部客户端的限制数目,也可以基于客户端发送包的内容来自动指定子类。
基于条件的客户端分类,可以在class语句中指定一个matching表达式:
class "ras-clients" {
match if substring (option dhcp-client-identifier, 1, 3) = "RAS";
}
注意,不管使用match语句或者使用add语句(或者两者都使用)来给客户端分类,都必须首先声明用到的客户端的类。如果没有match语句也没有in-scope语句,类声明语句就会是这个样子:(这里有个矛盾,前面应该是in-scope,而不是add)
class "ras-clients" {
}
子类(SUBCLASSES)
除了类,也可能会用到子类subclass。子类是与通常的类有相同名字,但是又有特定的可以用哈希算法快速匹配的附加条件(submatch)。这本质上是速度问题――一个有五个match语句的类和一个类有五个子类的主要区别是使用子类速度更快,子类的工作方式如下:
class "allocation-class-1" {
match pick-first-value (option dhcp-client-identifier, hardware);
}
class "allocation-class-2" {
match pick-first-value (option dhcp-client-identifier, hardware);
}
subclass "allocation-class-1" 1:8:0:2b:4c:39:ad;
subclass "allocation-class-2" 1:8:0:2b:a9:cc:e3;
subclass "allocation-class-1" 1:0:0:c4:aa:29:44;
subnet 10.0.0.0 netmask 255.255.255.0 {
pool {
allow members of "allocation-class-1";
range 10.0.0.11 10.0.0.50;
}
pool {
allow members of "allocation-class-2";
range 10.0.0.51 10.0.0.100;
}
}
在子类声明语句中跟在类名后的数据是一个固定值,用来匹配类中的match语句。当类匹配完成后,服务器会计算match语句,然后在哈希表中查找结果。如果找到一个匹配,客户端就被认为是一个这个类和这个子类的成员。
子类Subclasses可以有也可以没有scope语句,在上面的例子中,使用子类的单一目的就是允许一些客户端使用其中一个地址池,而其它一些客户端使用别的地址池,所以这些子类没有使用scope语句。如果使用子类的部分目标是为部分客户端定义不同的参数,那就可能定义子类时使用scope语句了。在上面的例子里,如果你的一个客户需要一些配置参数,而它客户则不需要这些参数,可以为这个客户使用下面的子类声明:
subclass "allocation-class-2" 1:08:00:2b:a1:11:31 {
option root-path "samsara:/var/diskless/alphapc";
filename "/tftpboot/netbsd.alphapc-diskless";
}
在这个例子里,我们使用子类来控制为每个客户进行地址分配。然而也可能使用子类不指明客户端,例如,使用值vendor-class-identifier 选项来确定给vendor-encapsulated-options选项发送什么值。在dhcp-options(5)手册中的VENDOR ENCAPSULATED OPTIONS 里有一个例子。
动态地址分配时类的限制(PER-CLASS LIMITS ON DYNAMIC ADDRESS ALLOCATION)
可以给某个类指定一个可以分配的客户端的数目的最大值限制,它的影响是一个新的客户端可能很难得到一个地址。一旦类的这个限制数达到,新客户端得到地址的唯一可能就是原来的某个客户端放弃了租约,不管是租约过期还是发送DHCPRELEASE包,有租约数限制的类都像下面一样:
class "limited-1" {
lease limit 4;
}
这将使这个类同一时间最多只能有4个成员。
自动产生子类的类SPAWNING CLASSES
可以定义一个spawning class, spawning class是一个根据客户端发送内容自动产生子类的类。Spawning class建立的原因是为了使建立租约限制的类不工作。假定使用在cable-modem环境中, ISP想为一个点的客户提供不只一个IP地址,但不希望这个客户建立自己的子网,或者给这个客户连接的网段里无限制的IP地址数,很多cable modem的头端系统可以配置一个DHCP的中继代理信息,它可以把客户端的DHCP请求发送到DHCP服务器,这些典型系统都会使用虚电路号(circuit ID)或者远程ID号(remote ID)来确定用户位置。为了利用这些,可以如下的类定义语句:
class "customer" {
spawn with option agent.circuit-id;
lease limit 4;
}
现在,一旦用户节点的请求到达后,circuit ID选项将会在hash表中检查。如果发现其中一个子类匹配了这个电路号(circuit ID),这个客户将会被归入这个子类并按这个子类成员对待。如果没有发现匹配,一个新的类将会建立并记录在dhcpd.leases 文件中,这个客户会被归入这个新类中。客户端被归类后,它将按照类的成员对待,在这种情况下,按类成员对待每个点最多4个成员。
使用子类生成机制并不仅限于中继代理选项,使用这个例子只是因为它容易理解。
组合匹配等(COMBINING MATCH, MATCH IF AND SPAWN WITH)
有些情况下,使用一个表达式指定一个客户端到一个类,然后用第二个表达式把它放到一个子类中是很有用的。这可以由组合match if 和spawn with语句完成,或者由match if 和match完成,例如:
class "jr-cable-modems" {
match if option dhcp-vendor-identifier = "jrcm";
spawn with option agent.circuit-id;
lease limit 4;
}
class "dv-dsl-modems" {
match if opton dhcp-vendor-identifier = "dvdsl";
spawn with option agent.circuit-id;
lease limit 16;
}
这允许你的两个类中有相同的spawn with 表达式,而不会把一个客户端弄到两个类中,从而互相混乱