клиентам, чьи MAC-адреса прописаны в самописной системе управления сетью и учета трафика (назвать это биллингом язык не поворачивается).
Спустя несколько лет я понял, что диапазон сети 192.168.0.0/21 забит практически под завязку, причем большинство прописанных в БД системы управления MAC-адресов — это адреса устройств Wi-Fi пользователей, зачастую уже давно забытых и не используемых.
В итоге было решено выделить диапазон 192.168.7.0/24 только конкретно под Wi-Fi устройства с динамическим выделением адресов.
Для этого я вычислил на всех свитчах Cisco все точки доступа Wi-Fi по портам и прописал их в классы на dhcp-сервере (используется isc-dhcpd под Linux).
Схема сети:
Как видно на схеме, в сети есть 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))));
}
# 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)
SmileyK
08.03.2018 09:47Вы сделали скриптами, то что можно было сделать с помощью IEEE 802.1X ?
yukh975 Автор
08.03.2018 09:48Какими скриптами? Все в конфиге dhcpd.conf.
Если есть какое-то более простое решение, буду рад если поделитесь.bryukhanovaa
09.03.2018 13:23конечно есть. для wifi делается отдельная подсеть, отдельный vlan на коммутаторах и адреса выдаются просто добавлением нового пула в dhcpd, без opt82
yukh975 Автор
09.03.2018 13:24Можно конечно и отдельный VLAN, но мне важно, чтобы устройства были в единой сети и в едином VLAN.
alexmasz
09.03.2018 13:23Можно попробовать freeradius, там и поддержка БД и ФС(тоже с инклудами файлов конфигурации как в ISC-DHCP), с переездом на Juniper перешел на него. А так я избавился от remote-id, вместо идентификации устройства использую VLAN(Влан на свич). Ну и абонент VLAN+Port или VLAN+Port+MAC(при необходимости).
yukh975 Автор
09.03.2018 13:25Можно и freeradius поднять. Мы его используем для авторизации VPN-клиентов.
Про VLAN см. комментарий выше.alexmasz
09.03.2018 13:36А зачем тогда содержать 2 сервиса(isc-dhcp и freeradius)?
У вас устройства и клиенты в одном влане? Если вы меняете МАС свича, надо править конфиг DHCP, в случае с VLAN+PORT — ничего не надо. Конечно при условии что remote-id будет такой же приходить.yukh975 Автор
09.03.2018 14:16Скажу честно, не изучал freeradius настолько глубоко. isc-dhcp стоит и работает уже много лет, freeradius поднял для авторизации VPN-клиентов, дальше в его настройку не углублялся, но при случае надо бы разобраться. Спасибо за наводку.
Устройства и клиенты у меня в одном влане и разделять их нельзя. Разве что подумать о маршрутизации между вланами, но стоит ли оно того?
semen_mikulin
08.03.2018 09:48Я правильно понимаю, что Вам необходимо чтобы в сети были только авторизованные, разрешенные Вами устройства, а все остальные идут лесом?
yukh975 Автор
08.03.2018 09:49Правильно, за исключением клиентов, подключенных по Wi-Fi — для них выдаются адреса из назначенного пула.
alexgreat7
Dhcp option 82? Не, не слышал.)))
yukh975 Автор
а это разве не её как раз реализация?