BINLD 容器

当 DHCP 服务器接收到一个请求时,包被分析并且标识键用于决定抽取哪个容器、选项和地址。

BINLD 配置 中的最后一个示例显示了子网容器。 它的识别密钥是客户机在网络中的位置。 如果客户机来自于该网络,那它就属于该容器。

每一类型的容器使用不同的选项来识别客户机:

  • subnet 容器使用 giaddr 字段或接收接口的接口地址来确定客户机来自哪个子网。
  • class 容器使用选项 77(用户位置类标识符)中的值。
  • vendor 使用选项 60(供应商类标识符)中的值。
  • client 容器对 PXED 客户机使用选项 61(“客户机标识”),对 BOOTP 客户机使用 BOOTP 包中的 chaddr 字段。

除了子网,每个容器都允许对与其匹配的值的指定,包括正则表达式。

也有一个隐式容器,全局容器。 置于全局容器中的选项和修饰符适用于所有容器,除非被覆盖或否定。 大多数容器能够放置在其他包含可见性范围的容器内。 容器可能有或可能没有与它们联系的地址范围。 按子网的性质,子网有与其关联的范围。

容器和子容器的基本规则如下:

  • 在全局级别上所有的容器都有效。
  • 子网绝不可以置于其他容器内。
  • 受限制的容器内不能有同一类型的常规容器。 (例如,一个带有仅允许一个 Accounting 类选项的容器不能包含带有允许所有以子母“a”开头的类的选项的容器。 这是非法的。)
  • 受限的客户机容器不能有子容器。

鉴于以上规则,您可以生成容器的层次结构,它为特定的客户机或客户机集而将您的选项分为不同的组。

如果客户机匹配多个容器,如何分配选项和地址呢? DHCP 服务器接收消息,它发送请求到数据库(在这种情况下是 db_file),并生成一个容器列表。 列表按深度和优先级的顺序排列。 在容器中优先级定义为隐式层次结构。 严格容器要比常规容器的优先级高。 客户机、类、供应商、最后还有子网在按深度排列的容器类型内再以优先级进行分类。 这就生成了一个按最详细到最不详细排序的列表。 例如:
    Subnet 1
    --Class 1
    --Client 1
    Subnet 2
    --Class 1
    ----Vendor 1
    ----Client 1
    --Client 1

此示例显示了两个子网 Subnet 1Subnet 2。 有一个类名 Class 1,一个供应商名 Vendor 1和一个客户机名 Client 1Class 1Client 1 在多个位置定义。 由于它们位于不同的容器中,它们 的名称可以相同但其中的值可能不同。 如果 Client 1Subnet 1 发送 消息到 DHCP 服务器,并在其选项列表中指定了 Class 1,那么 DHCP 服务器将生成以下容器路径:

Subnet 1, Class 1, Client 1

最具体的容器在最后列出。 为得到地址,以逆向的层次结构来检查列表以查找第一个可用的地址。 接着,用正向层次结构检查列表以得到选项。 除非选项 deny 在容器中出现,否则选项会覆盖前面的值。 此外,由于 Class 1Client 1 位于 Subnet 1中,因此会根据容器优先级对它们进行排序。 如果在 Subnet 2 中相同的客户机发送相同的消息,生成的容器列表为:

Subnet 2, Class 1, Client 1 (在 Subnet 2 级别) , Client 1 (在 Class 1 级别)

Subnet 2 首先列出,然后是 Class 1,接着是位于 Subnet 2 级的 Client 1(因为在层次结构上该客户机语句仅低一个级别)。 层次结构暗示与第一个客户机语句匹配的客户机比与 Subnet 2中的 Class 1 的客户机匹配 Client 1 的客户机更具体。

在层次结构内通过深度选择的优先级不能由容器自身的优先级取代。 例如,如果相同的客户机发送相同的消息并指定供应商标识,那么容器列表是:

Subnet 2, Class 1, Vendor 1, Client 1 (在 Subnet 2 级别) , Client 1 (在 Class 1 级别)

容器优先级改善了搜索性能因为它遵行一个常规的概念,那就是客户机容器是定义一个或多个客户机的最详尽的方法。 类容器包含的地址没有客户机容器详尽,供应商次之,子网最差。