Назад | Перейти на главную страницу

Чистая аренда DHCPD при отключении клиента

Есть ли способ заставить ISC DHCPD активировать истечение срока действия или освобождение для статической аренды сразу после отключения клиента?

Я хочу запустить сценарий сразу после подключения клиента (событие DHCPD "при фиксации") и отключения (событие DHCPD "при истечении срока" или "при выпуске").

Первые работают как шарм, вторые никогда не срабатывают. Какие-нибудь советы?

РЕДАКТИРОВАТЬ: Фрагмент конфигурации (с тестовым скриптом):

subnet 192.168.1.0 netmask 255.255.255.0 {
  range 192.168.1.40 192.168.1.49;

  on commit {
    set ip = binary-to-ascii (10, 8, ".", leased-address);
   execute ("/usr/local/bin/dhcp-test", "commit", ip);
  }
  on release {
    set ip = binary-to-ascii (10, 8, ".", leased-address);
    execute ("/usr/local/bin/dhcp-test", "release", ip);
  }
  on expiry {
    set ip = binary-to-ascii (10, 8, ".", leased-address);
    execute ("/usr/local/bin/dhcp-test", "expiry", ip);
  }
}

DHCP обычно сохраняет аренду до истечения времени, чтобы попытаться повторно выдать ту же аренду клиенту, который повторно подключится позже. Высвобождение кандидатов начнется только тогда, когда появятся новые клиенты.

Это позволяет клиентам повторно получать тот же адрес при повторном подключении без слишком долгого интервала между сеансами и дает видимость почти статической адресации.

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

Если я правильно понял, для статической аренды у вас в конфиге есть что-то вроде этого:

host static-1 {
    hardware ethernet 00:01:02:03:04:05;
    fixed-address 192.168.1.40;
}

Это будет работать так, как вы ожидаете, но никогда не освободит этот IP-адрес (не имеет значения, отправляет ли клиент DHCPRELEASE или нет), потому что это СТАТИЧЕСКИЙ IP-адрес с точки зрения dhcpd.

Вы должны создать ДИНАМИЧЕСКИЙ IP-адрес (опять же, с точки зрения dhcpd), чтобы dhcpd его отслеживал. Сделать это можно так:

# First create pseudo class
class "static-ip" { match suffix(hardware, 6); }

# Here you will declare all MAC of your clients and make it a subclass of "static-ip"
# class "<UNIQ-CLASSNAME>" { match if suffix(hardware, 6) = <CLIENT-MAC-ADDRESS>; } subclass "static-ip" <CLIENT-MAC-ADDRESS>;
# Example
class "static-1" { match if suffix(hardware, 6) = 00:01:02:03:04:05; } subclass "static-ip" 00:01:02:03:04:05;

# Next allocate an address for every client (inside subnet declaration):

subnet 192.168.1.0 netmask 255.255.255.0 {
  on commit {
    set ip = binary-to-ascii (10, 8, ".", leased-address);
   execute ("/usr/local/bin/dhcp-test", "commit", ip);
  }
  on release {
    set ip = binary-to-ascii (10, 8, ".", leased-address);
    execute ("/usr/local/bin/dhcp-test", "release", ip);
  }
  on expiry {
    set ip = binary-to-ascii (10, 8, ".", leased-address);
    execute ("/usr/local/bin/dhcp-test", "expiry", ip);
  }

 # pool { range <ip-addr>; allow members of "<UNIQ-CLASSNAME>"; }
   pool { range 192.168.1.40; allow members of "static-1"; }
 # pool { range 192.168.1.41; allow members of "static-2"; }
 #... so on
}

Чтобы сделать вашу конфигурацию более гибкой, вы можете поместить объявления класса подкласса и диапазона пула в разные файлы и включают их в главный dhcpd.conf

#dhcpd.conf
authoritative;
min-lease-time ...;
... etc.

include "/path/to/classes.conf";
include "/path/to/subnet.conf";

Как видите, мы поместили каждого клиента в его собственный класс И подклассифицировали его в класс static-ip. Это на случай, если вы хотите иметь другую подсеть без статического назначения IP, например:

subnet 192.168.2.0 netmask 255.255.255.0 {
 range 192.168.2.10 192.168.2.100;
 deny members of "static-ip";
}

Затем вы должны запретить клиентам со статическим назначением IP получать IP-адреса из этой подсети (с Отрицать ключевое слово).

Таким образом вы получаете ДИНАМИЧЕСКИЙ IP (с точки зрения dhcpd), но на самом деле он никогда не изменится (с точки зрения клиента)

Благодаря @TomTom я глубже копаюсь в RFC2131 и подтверждаю такое поведение статической аренды:

...DHCP supports three mechanisms for IP address allocation.  In
"automatic allocation", DHCP assigns a permanent IP address to a
client.  In "dynamic allocation", DHCP assigns an IP address to a
client for a limited period of time (or until the client explicitly
relinquishes the address).  In "manual allocation", a client's IP
address is assigned by the network administrator, and DHCP is used
simply to convey the assigned address to the client. 

    Dynamic allocation is the only one of the three mechanisms that
allows automatic reuse of an address that is no longer needed by the
client to which it was assigned...

Причина, по которой я не нашел его раньше, потому что "статическая аренда" называется "постоянный"внутри RFC и Ctrl + F не имеет встроенного AI (к сожалению)

Так что я все еще ищу рабочий способ работы с клиентами, которые отключаются от сети.