声明 DHCP 自定义选项并配置客户端发送它
Declare DHCP custom option and configure client to send it
我想class从 ISC DHCPD 配置文件的子网声明中定义的池中为 DHCP 客户端提供 IP 地址,并使用该信息更新 DNS 服务器。
使用选项 "dhcp-client-identifier" 让客户端发送相同的 class 标识符是行不通的,因为具有相同标识符的后续 IP 地址请求(来自不同的客户端)会告诉 DHCP 服务器前一个客户端连接,而不是后者,因此(尝试)用新 IP 更新 DNS 服务器,丢失前一个客户端的条目。
到目前为止,我在 Internet 上找到的资源仅谈论与现有选项(通常是供应商扩展)打交道,但没有告诉我该怎么做。
我想做的是:
- 定义自定义选项
- 配置客户端发送具有适当值class的
- 根据该选项的值在服务器上定义一个客户端class
- 服务IP地址根据class
我的做法是这样的:
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
谢谢,
米歇尔
它按照预期的方式工作,如下所示:
- dhcp-options(5)(例如here)在自定义选项"definition"上含糊不清
- 确保使用 [224 - 254] 范围内的选项代码(参见手册页 "Defining New Options" 部分)
- 实际的选项定义代码必须对客户端和服务器都可用; dhcp-options(5) 对此完全保持沉默。这就是让我疑惑和绊倒的原因。您可以使用 include 语句从挂载的文件系统中的任何位置加载定义,或者通过 "divine enlightenment",也称为代码复制(见下文)。
- 自定义选项可以有多种结构之一,范围从布尔值和字符串 ("text") 到复杂记录(类似于 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";
}
match 语句的 RHS 是一个正则表达式 - 用复杂的表达式调试你的心愿 ;-)
然后您可以在 dhcpd.conf 中的任何其他进一步限定语句中使用 class "myclass",例如如原始问题所示。
我想class从 ISC DHCPD 配置文件的子网声明中定义的池中为 DHCP 客户端提供 IP 地址,并使用该信息更新 DNS 服务器。
使用选项 "dhcp-client-identifier" 让客户端发送相同的 class 标识符是行不通的,因为具有相同标识符的后续 IP 地址请求(来自不同的客户端)会告诉 DHCP 服务器前一个客户端连接,而不是后者,因此(尝试)用新 IP 更新 DNS 服务器,丢失前一个客户端的条目。
到目前为止,我在 Internet 上找到的资源仅谈论与现有选项(通常是供应商扩展)打交道,但没有告诉我该怎么做。
我想做的是:
- 定义自定义选项
- 配置客户端发送具有适当值class的
- 根据该选项的值在服务器上定义一个客户端class
- 服务IP地址根据class
我的做法是这样的:
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
谢谢, 米歇尔
它按照预期的方式工作,如下所示:
- dhcp-options(5)(例如here)在自定义选项"definition"上含糊不清
- 确保使用 [224 - 254] 范围内的选项代码(参见手册页 "Defining New Options" 部分)
- 实际的选项定义代码必须对客户端和服务器都可用; dhcp-options(5) 对此完全保持沉默。这就是让我疑惑和绊倒的原因。您可以使用 include 语句从挂载的文件系统中的任何位置加载定义,或者通过 "divine enlightenment",也称为代码复制(见下文)。
- 自定义选项可以有多种结构之一,范围从布尔值和字符串 ("text") 到复杂记录(类似于 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";
}
match 语句的 RHS 是一个正则表达式 - 用复杂的表达式调试你的心愿 ;-)
然后您可以在 dhcpd.conf 中的任何其他进一步限定语句中使用 class "myclass",例如如原始问题所示。