Настройка динамического dhcp-pool с привязкой к определенным портам Cisco Catalyst

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

Спустя несколько лет я понял, что диапазон сети 192.168.0.0/21 забит практически под завязку, причем большинство прописанных в БД системы управления MAC-адресов — это адреса устройств Wi-Fi пользователей, зачастую уже давно забытых и не используемых.

В итоге было решено выделить диапазон 192.168.7.0/24 только конкретно под Wi-Fi устройства с динамическим выделением адресов.

Для этого я вычислил на всех свитчах Cisco все точки доступа Wi-Fi по портам и прописал их в классы на dhcp-сервере (используется isc-dhcpd под Linux).

Схема сети:

image

Как видно на схеме, в сети есть 6 устройств Cisco Catalyst.

Для того, чтобы увидеть mac-адрес каждого конкретного свитча, прописываем в конфиг dhcpd:

if exists agent.remote-id and exists agent.circuit-id 
{
    if binary-to-ascii(16, 8, "", substring(option agent.remote-id, 2, 1)) = "0" {
        set switch-mac = concat("0", binary-to-ascii(16, 8, "", substring(option agent.remote-id, 2, 1)), ":", binary-to-ascii(16, 8, ":", substring(option agent.remote-id, 3, 6)));
    } else {
        set switch-mac = binary-to-ascii(16, 8, ":", substring(option agent.remote-id, 2, 6));
    }
    log(info, "-------------------------------------------------------------------------");
    log ( info, concat("Switch MAC: ", switch-mac));
    log ( info, concat("Switch Port: ", binary-to-ascii(10, 8, "", substring(option agent.circuit-id, 5, 1))));
}


В результате mac-адреса свитчей определились так:
# Cisco0: 63:69:73:63:6f:30
# Cisco1: 63:69:73:63:6f:31
# Cisco2: 63:69:73:63:6f:32
# Cisco3: 63:69:73:63:6f:33
# Cisco4: 63:69:73:63:6f:34
# Cisco5: 63:69:73:63:6f:35


После этого в /var/log/messages наблюдаем логи всех подключений (с какого устройства и какого порта пришел DHCPINFORM):

dhcpd: -------------------------------------------------------------------------
dhcpd: Switch MAC: 63:69:73:63:6f:32
dhcpd: Switch Port: 6
dhcpd: DHCPINFORM from 192.168.2.55 via eth1
dhcpd: DHCPACK to 192.168.2.55 (xx:xx:xx:xx:xx:xx) via eth1
dhcpd: -------------------------------------------------------------------------


В блоке subnet {} на каждое устройство (по сути нужный порт на нужном свитче) создаем класс:

class "801:1" {
      match if binary-to-ascii(16, 8, ":", substring(option agent.remote-id, 2, 6)) = "63:69:73:63:6f:31" and binary-to-ascii(10, 8, "", substring(option agent.circuit-id, 5, 1)) = "18";
}
# Порт 18 на Cisco1 у меня попадает в класс 801:1

class "804:1" {
      match if binary-to-ascii(16, 8, ":", substring(option agent.remote-id, 2, 6)) = "63:69:73:63:6f:30" and binary-to-ascii(10, 8, "", substring(option agent.circuit-id, 5, 1)) = "30";
}
# Порт 30 на cisco0 - класс 804:1


Названия классов у меня ассоциированы с номерами кабинетов: порядковый номер

Создаем pool:

pool {
        allow members of "801:1";
        allow members of "804:1";
        ddns-updates off;
        range 192.168.7.1 192.168.7.254;
        default-lease-time 3600;
        max-lease-time 7200;
        option routers 192.168.0.1;
        option domain-name-servers 192.168.0.1;
}


В результате, устройство, включенное в порт 18 на cisco1 или в порт 30 на cisco0 получит IP-адрес и все настройки от DHCP сервера вне зависимости, прописан его mac-адрес в БД системы управления сетью или нет.

Далее в конфиге прописаны непосредственно хосты с mac и ip-адресами, присвоенные прописанным клиентам.

P.S.: Если mac-адрес прописан в БД и устройство включено в один из таких портов, то IP-адрес ему выдается тот, который прописан жестко директивой host {}

© Habrahabr.ru