Acontece que eu precisava fazer três coisas. Aqui estão alguns recortes do arquivo /etc/dhcpd.conf
final:
class "virtual-hosts"
{
match if substring(binary-to-ascii(16,8,":",hardware),2,7) = "0:50:56";
log(info, "Hit for class virtual-hosts");
}
subnet XXX.YYY.22.0 netmask 255.255.254.0
{
}
subnet XXX.YYY.24.0 netmask 255.255.255.0
{
option routers XXX.YYY.24.254;
option domain-name-servers XXX.YYY.22.168, XXX.YYY.22.169;
option ntp-servers XXX.YYY.22.168,XXX.YYY.22.169;
default-lease-time 86400; # 1 day
max-lease-time 604800; # 7 days
use-host-decl-names on;
allow unknown-clients;
option domain-name "example.com sub1.example.com sub2.example.com";
next-server XXX.YYY.22.159;
filename "pxelinux.0";
pool
{
allow members of "virtual-hosts";
get-lease-hostnames true;
one-lease-per-client true;
ping-check true;
range XXX.YYY.24.11 XXX.YYY.24.60;
}
}
Primeiro, observe essa correspondência de cadeia feia na instrução class
. O primeiro elemento valor binário hardware
é o tipo de hardware e o segundo elemento é o endereço. Eu tenho que executar hardware
através de binary-to-ascii
para transformá-lo em uma string pesquisável, e então combine a substring. A correspondência substring
começa em 2 para evitar o 1:
que binary-to-string
escreve para o tipo de hardware. E a correspondência substring
tem apenas 7 caracteres, porque binary-to-string
usa apenas um único dígito para valores binários menores que 16.
Em segundo lugar, tenho que declarar allow unknown-clients;
em algum lugar antes que o dhcpd até tente corresponder a um endereço de hardware não especificado. Caso contrário, tenho que definir explicitamente o endereço MAC completo em uma instrução host{}
. Mas eu não quero o allow unknown-clients;
no próprio pool, porque isso é limitado por ...
Em terceiro lugar, a declaração allow members of "virtual-hosts";
na declaração do pool.
Portanto, a solução se resume a uma análise precisa de binary-to-text
e a permitir clientes desconhecidos na instrução subnet
, apenas para restringi-los na sub-instrução pool
.