Na minha pequena rede, tenho um dispositivo simples que aparentemente está usando apenas bootp
(ao contrário das extensões dhcp para bootp) para obter seu endereço. Meu arquivo dhcpd.conf é mais ou menos assim
class "user" {
match if substring(hardware, 1, 3) = 00:01:02;
log(info, "matched to a 3com";
}
class "controller" {
# tried matching based on two different styles I've seen on the net
#match if substring(hardware, 1, 3) = 00:a0:45;
match if (binary-to-ascii(16, 8, ":", substring(hardware, 0, 4)) = "1:00:a0:45");
log(info, "found a controller");
}
subnet 192.168.0.0 netmask 255.255.0.0 {
pool {
allow members of "user";
range 192.168.0.20 192.168.0.99;
log(info, "A user just attached");
}
pool {
allow members of "controller";
# never more than 1 on the network at a time
range 192.168.1.240;
log(info, "Allocated to a pwr user");
}
}
O servidor dhcp simplesmente não corresponderá ao pool que deveria. Do registro
BOOTREQUEST from 00:a0:45:95:ce:14 via eth1: BOOTP from dynamic client and no dynamic leases
O dispositivo é NEGADO para ambas as classes. Usando tcpdump e wireshark para comparar despejos de pacotes de um laptop e do dispositivo controlador (criei temporariamente uma classe para um laptop HP, adicionei essa classe ao pool usado para "controlador" e estendi o intervalo em 2 endereços), parece o único A diferença é que o dispositivo controlador é literalmente um pacote bootp (ou seja, não possui a opção obrigatória 53 que identifica o tipo dhcp) e carrega apenas a opção 255. O laptop foi emparelhado dhcpd
sem usar a binary-to-ascii
conversão. Além disso, e curiosamente, o cabeçalho IP do cliente controlador usa o endereço IP alocado primeiro, 192.168.1.240, mas na seção bootp do pacote, o ciaddr
campo é 0. Se ele acredita que tem uma concessão válida, não deveria refletir isso em ciaddr
?
Por que o dhcpd não corresponde ao endereço MAC deste dispositivo?
Eu encontrei a resposta para este problema e queria publicá-la. Descobriu-se que não tinha nada a ver com a forma como os padrões estavam sendo combinados. Na verdade,
esta é a sintaxe correta para corresponder no hardware.
No entanto, este foi um caso em que os fatos me levam à conclusão errada. Depois de revisar vários RFCs sobre bootp e dhcp, ficou claro que o dispositivo em questão não tinha a opção obrigatória de tipo de DHCP, da RFC 1541 seção 3, tornando-o um cliente somente bootp. Assim, a correção veio de algo que eu não esperava que fosse necessário. A
range
instrução inclui o modificadordynamic-bootp
que informa que o intervalo de IP é para clientes dhcp ou bootp. No entanto, eu também precisavaallow dynamic bootp clients;
na piscina da seguinte forma:Eu teria pensado que esse modificador seria suficiente, mas não foi. Eu precisava de ambos para realizar a tarefa.
Espero que isso seja útil para alguém.
Você precisa converter os dados em "hardware" antes de compará-los, e contabilizar seu primeiro elemento que indica o tipo. Tente algo como:
Mas se for apenas um dispositivo, por que não usar apenas um endereço fixo:
Adicione "dynamic-bootp" ao pool: