声明DHCP自定义选项并配置客户端以发送它

时间:2017-12-18 15:24:03

标签: options dhcp dhclient

我想将DHCP客户端分类为ISC DHCPD配置文件中子网声明中定义的池中的IP地址,并使用该信息更新DNS服务器。

使用选项“dhcp-client-identifier”为客户端发送相同的类标识符将不起作用,因为具有相同标识符的后续IP地址请求(来自不同的客户端)将告诉DHCP服务器先前的客户端连接,而不是后者,因此(尝试)使用新IP更新DNS服务器,丢失以前客户端的条目。

我在互联网上找到的资源到目前为止只讨论搞乱现有选项(通常是供应商扩展),但没有任何可以告诉我该怎么做。

我在想的是:

  • 定义自定义选项
  • 配置客户端以发送具有适当值的类
  • 根据该选项的值
  • 在服务器上定义客户端类
  • 根据班级提供IP地址

我的方法是:

DHCP服务器,位于/etc/dhcp/dhcpd.conf中:

option foo code 224 = text; # code 224 - 250 is defined as local class range
...
class "myclass" {                   
   match if option foo ~= "value";
}
...
subnet xxx.xxx.xxx.xxx netmask 255.255.255.0 {
    pool {
        ...
        allow members of "myclass";
        deny known-clients;
    }
}

DHCP服务器似乎对至少语法感到满意:

root@ns:/home/michel# dhcpd -t -cf /etc/dhcp/dhcpd.conf.test
Internet Systems Consortium DHCP Server 4.3.1
Copyright 2004-2014 Internet Systems Consortium.
All rights reserved.
For info, please visit https://www.isc.org/software/dhcp/
Config file: /etc/dhcp/dhcpd.conf.test
Database file: /var/lib/dhcp/dhcpd.leases
PID file: /var/run/dhcpd.pid
root@ns:/home/michel# 

(不要因为root而杀了我 - 为了方便,我做了一个“sudo bash”)

DHCP客户端,在/etc/dhcp/dhclient.conf中:

# This is what I'd like the client to be able to send to make this all work
send foo "42";

我希望我走在正确的轨道上,但我想我在这里错过了一些东西......

  • DHCP服务器:isc-dhcp-server / oldstable,现在4.3.1-6 + deb8u2 armhf
  • DHCP客户端:isc-dhcp-client / xenial-updates,现为4.3.3-5ubuntu12.7 AMD64

谢谢, 米歇尔

1 个答案:

答案 0 :(得分:2)

让它以预期的方式工作如下:

  • dhcp-options(5)(例如here)对自定义选项的“定义”含糊不清
  • 确保使用[224 - 254]范围内的选项代码(参见手册页,“定义新选项”一节)
  • 实际的选项定义代码必须可供客户端和服务器使用; dhcp-options(5)对此完全保持沉默。这让我感到困惑和磕磕绊绊。您可以使用include语句从装入的文件系统中的任何位置加载定义,或者使用“divine enlightenment”,也称为代码重复(见下文)。
  • 自定义选项可以有多种结构中的一种,从布尔和字符串(“文本”)到复杂记录(类似于C或PERL中的结构),请参阅dhcp.options(5)以获取更多信息。

工作示例

需要存在以下服务器和客户端代码段;它们显然适用于ISC DHCP服务器和客户端库。

在客户端;文件/etc/dhcp/dhclient.conf

option foo code 224 = text; # here be divine enlightenment!
send foo "value";

在服务器上;文件/etc/dhcp/dhcpd.conf

option foo code 224 = text;
class "myclass" {
    match if option foo ~= "value";
}

匹配语句的RHS是一个正则表达式 - 用复杂的表达式调试你心中的欲望; - )

然后,您可以在dhcpd.conf中的任何其他限定语句中使用“myclass”类,例如:如原始问题所示。