Так сложилось, что сеть у меня построена таким образом, что 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 {}

Комментарии (12)


  1. alexgreat7
    08.03.2018 09:47

    Dhcp option 82? Не, не слышал.)))


    1. yukh975 Автор
      08.03.2018 09:47

      а это разве не её как раз реализация?


  1. SmileyK
    08.03.2018 09:47

    Вы сделали скриптами, то что можно было сделать с помощью IEEE 802.1X ?


    1. yukh975 Автор
      08.03.2018 09:48

      Какими скриптами? Все в конфиге dhcpd.conf.

      Если есть какое-то более простое решение, буду рад если поделитесь.


      1. bryukhanovaa
        09.03.2018 13:23

        конечно есть. для wifi делается отдельная подсеть, отдельный vlan на коммутаторах и адреса выдаются просто добавлением нового пула в dhcpd, без opt82


        1. yukh975 Автор
          09.03.2018 13:24

          Можно конечно и отдельный VLAN, но мне важно, чтобы устройства были в единой сети и в едином VLAN.


      1. alexmasz
        09.03.2018 13:23

        Можно попробовать freeradius, там и поддержка БД и ФС(тоже с инклудами файлов конфигурации как в ISC-DHCP), с переездом на Juniper перешел на него. А так я избавился от remote-id, вместо идентификации устройства использую VLAN(Влан на свич). Ну и абонент VLAN+Port или VLAN+Port+MAC(при необходимости).


        1. yukh975 Автор
          09.03.2018 13:25

          Можно и freeradius поднять. Мы его используем для авторизации VPN-клиентов.
          Про VLAN см. комментарий выше.


          1. alexmasz
            09.03.2018 13:36

            А зачем тогда содержать 2 сервиса(isc-dhcp и freeradius)?
            У вас устройства и клиенты в одном влане? Если вы меняете МАС свича, надо править конфиг DHCP, в случае с VLAN+PORT — ничего не надо. Конечно при условии что remote-id будет такой же приходить.


            1. yukh975 Автор
              09.03.2018 14:16

              Скажу честно, не изучал freeradius настолько глубоко. isc-dhcp стоит и работает уже много лет, freeradius поднял для авторизации VPN-клиентов, дальше в его настройку не углублялся, но при случае надо бы разобраться. Спасибо за наводку.

              Устройства и клиенты у меня в одном влане и разделять их нельзя. Разве что подумать о маршрутизации между вланами, но стоит ли оно того?


  1. semen_mikulin
    08.03.2018 09:48

    Я правильно понимаю, что Вам необходимо чтобы в сети были только авторизованные, разрешенные Вами устройства, а все остальные идут лесом?


    1. yukh975 Автор
      08.03.2018 09:49

      Правильно, за исключением клиентов, подключенных по Wi-Fi — для них выдаются адреса из назначенного пула.