- Оставить заявку
- ITkrim@yandex.ru
Данная статья основана на материале. Наблюдение на WiFi потребителите с CAPsMAN и DUDE. Это презинтация правда на болгарском языке и в ней есть некоторые ошибки. (в частности на 23 страннице дан правильный варант скрипта, а далее идет не правильный). И некоторые моменты в ней вообще опущены.
Внимание. Не знаю почему, но при копировании скриптов из Микротика сюда, по какой то причины фигурные скобки вызывали ошибку в отображении стриницы, поэтому на них может быть ошибка.
Для решения этой проблемы использованы коды
открывающаяся фигурная скобка код - {
закрывающаяся фигурная скобка код - }
Нужно будет руками заменить. Проверяйте код внимательно сами.
И так. У Вас есть бесшевный Wi-Fi на Мкротиках под управлением контроллера CAPsMAN и для слежения за точкаими есть карта нарисованная в cистеме мониторинга The Dude, на ней нанесены эти точеки.
На центральном контроллере вы можете вывести
1. сколько точек в данный момент подключено к контроллеру
2. сколько клиентов подключено ко всем точкам одновлеменно.
Но вывести на карте сколько клиентов подключено к конкретной точке, не представляется возможным, т.к. все информация хранится в контролере. Значит надо сделать так, чтобы или контролер разослал по точкам информацию о том сколько к ним подключено клиентов или точки сами считали эту информацию с контроллера. В данном решении контроллер рассылает по точкам эту информацию, с помощью скрипта.
В основном инструкциях по настройке CAPsMAN сказано зайдите в Wireless нажмите кнопку CAP, поставьте галочку Enabled, выберете интерфейсы, выберете сертификат (если есть), и выберете Discovery Interface. Для работы скрипта требуется требуется, чтобы Discovery Interface был пустым, а в CAPsMAN Addresses вы прописали IP адрес CAPsMAN контроллера. Это нужно для того, чтобы в блоке CAPsMAN->Remote CAP в столбце Address, вывелись IP адреса (а иначе там выводятся МАС-адреса).
Также нужно, чтобы все точки имели собственный Identity (System -> Identity)
Далее нужно, чтобы в Provisioning установить Action в create dinamic enabled, а Name Format желательно в Identity. Это нужно, потому что когда автоматически создаются интерфейсы на контроллере он им в конце присваивает цифрув формате "-1" "-2". Для работы скрипта нужно, чтобы в конце интерфейса была бы или цифра 1 или цифра 2, другие не допустимы. Если вы в ручную настроили САР интерфейсы, то руками добавьте в конце "-1" "-2" (например "-1" для 2GHz и "-2" для 5GHz). По этому же принципу возможно раширить функционал скрипта, для ситуации, если у Вас двухдиапазонные точки, а также есть гостевая и офисная сеть итого 4.
На этом подготовительная часть закончена.
Скрипт передает информацию в точку информацию с использованием ping пакетов разной длины и далнейший их обработкой на самой точке.
На CAPsMAN контроллере создаем новый скрипт, который будет обрабатывать и рассылать информацию на точки доступа.
# устанавливаю глобальные переменные
:global strCapID
:global strCapIP
:global strCapInterface
:global strSubInterface
:global strClients
:global intPingSize
:global intCount 0
# перебираем все радио интерфейсы
:foreach i in=[/cas-man radio find] do={
# добавляю накопительную переменную (ни на что не влияет просто проверка, на всякий случай)
:set $intCount ($intCount +1)
# получаю имя интерфейса
:set $strCapInterface ([/caps-man radio get $i interface])
# читаем индентификатор точки доступа
:set $strCapID ([/caps-man radio get $i remote-cap-identity])
# получаем ip адрес
:set $strCapIP ([/caps-man remote-cap get [find identity=$strCapID] address])
# убираем лишнее (маска сети) из адреса
:set $strCapIP ([:pick $strCapIP 0 [:find $strCapIP "/"]])
# получаем число зарегистрированных клиентов на интерфейсе
:set $strClients ([:len [/caps-man registration-table find interface=$strCapInterface]] )
# читаем цифру в конце имени интерфейса (номер)
:set $strSubInterface ([:pick $strCapInterface ([:len $strCapInterface]-1)])
# высчитываем длину пакета
:set $intPingSize ($strSubInterface * 100 + $strClients)
#отправляем на точку один ping пакет соответствующей длины
/ping $strCapIP size=$intPingSize count=1
#выводим информацию в лог (необязательный пункт)
:log info ("_cap -" . $strCapInterface . " / sub -". $strSubInterface ." / cap id-" . $strCapID . " / cap ip - " . $strCapIP . " / clients-" . $strClients)
}
Даем ему имя. Прописываем в планировщик, выставляем время повтора скрипта я выставил минуту.
На самих точках В Firewall'е, надо создать правило приема входящих пакетов с IP адреса CAPsMAN контроллера и внесение их в логи. обязательно установить префикс (по нему будет вылавливаться нужная информация).
Замечание. Если CAPsMAN контроллер и The Dude сервер это у вас одно устройство и у Вас мониторинг точек настроен в том числе через ping, то надо вставить выше дополнительное правило, которое будет пропускать ping пакеты длиной 56 байт.
Пример.
/ip firewall filter
add action=accept chain=input packet-size=56 protocol=icmp src-address=192.168.88.1
add action=log chain=input log-prefix=CLIENT_COUNT protocol=icmp src-address=192.168.88.1
Первое правило пропускает пинг пакеты Dude сервера мониторинга, второе правило добавляет в лог. В этом примере dude сервер находится на ip 192.168.88.1
Далее. Скрипт работающий на точках доступа.
Скрипт перебирает все строки где есть CLIENT_COUNT это весьма неэффективно, но с другой стороны нагрузка процессор на точках близка к нулю.
# Глобальные переменные
:global intWiFi1 ""
:global intWiFi2 ""
:global intWiFi ""
:global strLog ""
:global startBuf ""
# Отфильтровываем все сообщения c префиксом CLIENT_COUNT
:set $startBuf (:toarray [/log find message~"CLIENT_COUNT input:" topics~"firewall" ])
# Перебираем все офильтрованные сообщения
:foreach i in=$startBuf do={
# читаем в переменную содержимое лога
:set $strLog [/log get $i message]
# отделем 4 символа после надписи len
:set $intWiFi [:pick $strLog ([:find $strLog "len"] +4) [:len $strLog]]
# отделяем пакеты длиной от 100 до 200
:if ($intWiFi > 99 and $intWiFi < 200) do={
# считаем число клиентов
:set $intWiFi1 ($intWiFi-100)
}
# отделяем пакеты длиной от 200 до 300
:if ($intWiFi > 199 and $intWiFi < 300) do={
# считаем число клиентов
:set $intWiFi2 ($intWiFi-200)
}
}
Сохраняем скрипт добавляем в планировщик.
Это вобщем то исходный вариант из презинтации, но у него есть несколько недостатков. скоро допишу другие варианты