Объявите пользовательский параметр DHCP и настройте клиент для его отправки

Я хотел бы классифицировать клиентов DHCP для обслуживания IP-адреса из пула, определенного в объявлении подсети в файле конфигурации ISC DHCPD, и обновить DNS-сервер этой информацией.

Использование опции "dhcp-client-identifier" для клиентов для отправки одного и того же идентификатора класса не будет работать, потому что последующий запрос IP-адреса (от другого клиента) с тем же идентификатором сообщит серверу DHCP, что предыдущий клиент подключился, вместо этого из последних, таким образом (пытаясь) обновить DNS-сервер новым IP, потеряв запись для предыдущего клиента.

Ресурсы, которые я нашел в интернете, говорят только о том, чтобы связываться с существующими опциями (обычно расширениями поставщиков), но ничего, что бы не указывало мне, что делать.

То, что я думаю сделать, это:

  • Определить пользовательский параметр
  • Настройте клиент для отправки класса с соответствующим значением
  • Определите класс клиента на сервере на основе значения этой опции
  • Служить 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 ответ

Решение

Получилось так, как задумано:

  • dhcp-options (5) (например, здесь) является неопределенным в "определении" пользовательских опций
  • Убедитесь, что вы используете код опции в диапазоне [224 - 254] (см. Справочную страницу, раздел "Определение новых опций")
  • Фактический код определения опции должен быть доступен как клиенту, так и серверу; dhcp-options(5) полностью об этом молчит. Это то, что заставило меня задуматься и спотыкаться. Вы можете использовать операторы include, которые будут загружать определение из любой точки в смонтированной файловой системе или с помощью "божественного просветления", также известного как дублирование кода (см. Ниже).
  • Пользовательский параметр может иметь одну из множества структур, начиная от логических и строковых ("текст") до сложных записей (аналогично структурам в 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 оператора match - это регулярное выражение - отладка по вашему желанию со сложными выражениями;-)

Затем вы можете использовать класс "myclass" в любых других уточняющих утверждениях в dhcpd.conf, например, как показано в исходном вопросе.

Другие вопросы по тегам