Mikrotik - кеш-система на основе User Manager
Как это работает:
1. На микротике настраивается собственный радиус-сервер.
2. Скрипт передает из базы mikbill на mikrotik данные для авторизации (ppp - login/password или ipoe - mac или оба одновременно) например раз в час (ниже вариант с работой реал-тайм). При этом передает только те учетки, у которых положительный баланс или стоит кредит и интернет не заблокирован.
3. При недоступности радиус-сервера микбила (ответ radius-timeout) запросы автоматически пойдут на локальный радиус-сервер. Если микротиков несколько, можно сделать радиус-сервер на одном, а остальные будут к нему подключаться.
Установка
Версия 1
1. Качаем и устанавливаем пакет User Manager для своей версии микротика http://www.mikrotik.com/download
2. Доступ к управлению через веб http://IP_MIKROTIK/userman/
Настраиваем routers и создаем профиль admin
или делаем тоже самое через консоль
/tool user-manager router add customer=admin ip-address=127.0.0.1 shared-secret=RADIUSSECRET
/tool user-manager profile add name=admin owner=admin
3. Создаем радиус-клиент на микротике (обязательно ниже микбиловского)
для ppp:
/radius add address=127.0.0.1 secret=RADIUSSECRET service=ppp
для ipoe:
/radius add address=127.0.0.1 secret=RADIUSSECRET service=hotspot
4. Проверяем что микротик доступен по ssh с серера
5. Настраиваем авторизацию по ключу https://wiki.mikbill.ru/billing/configuration/cross_server_uathorization
6. На сервере создаем скрипт
nano radiuscash.sh
#!/bin/bash USERMAN_IP="192.168.10.67" USERMAN_SSH_PORT="22" USERMAN_LOGIN="mikbill" RADIUS_HOTSPOT="1" RADIUS_PPP="1" HOME_DIR=$(cd $(dirname $0)&& pwd) UPLOAD="$HOME_DIR/userman.rsc" PATH_CONFIG=/var/www/mikbill/admin/app/etc/config.xml DB_USER=$(cat $PATH_CONFIG| grep username | awk '{ gsub("<username>"," "); print }' | awk '{ gsub("</username>"," "); print }' | awk '{print $1}') DB_PASSWORD=$(cat $PATH_CONFIG| grep password | awk '{ gsub("<password>"," "); print }' | awk '{ gsub("</password>"," "); print }' | awk '{print $1}') DB_NAME=$(cat $PATH_CONFIG | grep dbname | awk '{ gsub("<dbname>"," "); print }' | awk '{ gsub("</dbname>"," "); print }'| awk '{print $1}') echo "/tool user-manager user" > $UPLOAD echo "remove [find]" >> $UPLOAD if [ "$RADIUS_HOTSPOT" -ne 0 ] then QUERY="SELECT local_mac FROM users WHERE (deposit+credit)>=0 and blocked=0" SQL=`mysql -D $DB_NAME -u $DB_USER -p$DB_PASSWORD -e "$QUERY" 2>/dev/null` SQL=${SQL:10:${#SQL}} for i in $SQL; do if [[ $i != NULL ]] then echo "add customer=admin username=$i" >>$UPLOAD fi done fi if [ "$RADIUS_PPP" -ne 0 ] then QUERY="SELECT user, password FROM users WHERE (deposit+credit)>=0 and blocked=0;" SQL=`mysql -D $DB_NAME -u $DB_USER -p$DB_PASSWORD -e "$QUERY" 2>/dev/null` SQL=${SQL:14:${#SQL}} NUM=0 for i in $SQL; do LOGIN_PASS[$NUM]=$i let "NUM=NUM+1" done for((i=0;i!=NUM;i+=2)) do echo "add customer=admin username=${LOGIN_PASS[$i]} password=${LOGIN_PASS[$i+1]}" >>$UPLOAD done fi echo "create-and-activate-profile profile=admin customer=admin numbers=[find]" >>$UPLOAD #SSH for (( i=0;i!=10;i++ )); do scp -P $USERMAN_SSH_PORT $UPLOAD $USERMAN_LOGIN@$USERMAN_IP:/ STATUS=$? if [ $STATUS -ne 0 ]; then sleep 10 else CMD="/import file=$(basename $UPLOAD)" for (( i=0;i!=10;i++ )); do ssh -p $USERMAN_SSH_PORT $USERMAN_LOGIN@$USERMAN_IP "${CMD}" > /dev/null STATUS=$? if [ $STATUS -ne 0 ]; then sleep 10 fi done break fi done
Указываем свои данные микротика на котором установлен User Manager
USERMAN_IP USERMAN_SSH_PORT USERMAN_LOGIN
Указываем тип авторизации
RADIUS_TYPE="hotspot"
или
RADIUS_TYPE="ppp"
7. Разрешаем исполнение скрипта
chmod +x radiuscash.sh
8. Добавляем исполнение скрипта по крону.
Версия 2
Собственно это доработанная система первой версии, но весьма утяжеленная, поэтому и первая версия имеет право на существование.
Выгрузка радиус-шейперов из тарифов (значения Rx/Tx).
Выгрузка IP учеток с биллинга.
Теперь скрипт учитывает разрешенный минус.
Учет индивидуальных шейперов в учетке.
Изменена логика выгрузки на микротик. Теперь общая выгрузка делается после 24.00, а после в течении дня учетки добавляются при пополнении. То есть, практически, кеш работает в реальном времени.
1. При добавлении учетной записи (проверка новых учеток раз в 5 мин)
2. При пополнении (сразу)
3. При включении из замороженных (сразу)
4. Можно обновить вручную все через админку (настройки-действия-обновить шейперы)
Установка
Качаем файлы в отдельный каталог, например в /home/radcash/
wget https://github.com/mikbill/design/raw/master/radiuscash/radcash_limits/radcash.conf wget https://github.com/mikbill/design/raw/master/radiuscash/radcash_limits/radcash.lib wget https://github.com/mikbill/design/raw/master/radiuscash/radcash_limits/radcash.sh wget https://github.com/mikbill/design/raw/master/radiuscash/radcash_limits/update_uid.sh wget https://github.com/mikbill/design/raw/master/radiuscash/radcash_limits/radcash_check_new_uid.sh
Даем права на исполнение
chmod +x radcash.sh update_uid.sh radcash_check_new_uid.sh
Правим radcash.conf
USERMAN_IP="192.168.10.67" # IP микротика USERMAN_SSH_PORT="22" # Порт микротика USERMAN_LOGIN="mikbill" # Логин учетки микротика (не забываем настроить авторизацию по ключу) RADIUS_HOTSPOT="1" # Вкл/выкл IPOE NAS RADIUS_PPP="1" # Вкл/выкл PPP NAS LOG_REMOVE="1" # Удаляет предыдущий лог User Manager при общей заливке CONNECT_INTERVAL=60 # Интервал между попытками подключения CONNECT_SUM=180 # Общая сумма попыток подключения PATH_CONFIG=/var/www/mikbill/admin/app/etc/config.xml
Настраиваем крон
nano /etc/crontab
# RadCash 20 00 * * * root /home/radcash/radcash.sh
Настраиваем выгрузку при пополнении
nano /var/www/mikbill/admin/sys/scripts/mikbill_payment_event.sh
Добавляем в конец файла
# RadCash /home/radcash/update_uid.sh $2
Настраиваем выгрузку при включении из замороженных
nano /var/www/mikbill/admin/sys/scripts/mikbill_onoff_user_event.sh
Добавляем в конец файла
# RadCash /home/radcash/update_uid.sh $2
Добавляем ручную общую выгрузку через админку через Настройки-Действия-Обновить шейперы
nano /var/www/mikbill/admin/sys/scripts/mikbill_pcq.sh
Добавляем в конец файла
# RadCash /home/radcash/radcash.sh
Настаиваем синхронизацию при добавлении новой учетной записи в админке
nano /var/www/mikbill/admin/sys/scripts/mikbill_5min.sh
# RadCash /home/radcash/radcash_check_new_uid.sh
Настройка Mikrotik
На микротике создаем скрипт мониторящий сервер биллинга и добавляем его в scheduler например раз в минуту
:local IP 10.10.10.1 :local COUNT 3 :local radiusMikbill1 0 :local radiusRadCash 1 :local dhcpServer1 server1 :local dhcpRelay1 relay1 :local STATUS ([/ping $IP count=$COUNT]) :global statusRadCash :if ($STATUS = 0) do={ :if ($statusRadCash = 0) do={ log warning "enable RadCash" / radius disable numbers=$radiusMikbill1 / radius enable numbers=$radiusRadCash / ip dhcp-server enable $dhcpServer1 / ip dhcp-relay disable $dhcpRelay1 } :global statusRadCash 1 } else { :if ($statusRadCash = 0) do={ log warning "disable RadCash" / radius enable numbers=$radiusMikbill1 / radius disable numbers=$radiusRadCash / ip dhcp-server disable $dhcpServer1 / ip dhcp-relay enable $dhcpRelay1 } :global statusRadCash 0 }
:local IP 10.10.10.1 - Меняем на свой IP биллинга
:local COUNT 3 - Количество попыток проверки за раз (если хотя бы раз из количесва попыток пройдет сервер считается доступным)
Регистрируем в скрипте свои DHCP-server/DHCP-relay/Radius в скрипте. Общая логика работы скрипта- при недоступности биллинга выключать dhcp-relay, включать dhcp-server, отключать radius на биллинг/ включать свой. И обратные действия в случае появления доступности биллингового сервера.
Создаем свой radius-server ip - 127.0.0.1
При работе с DHCP в настройках dhcp-server включить "Use Radius" и в настройках локального радиуса поставить галку "dhcp"
Для добавления микротиков для выгрузки в скрипте radcash.sh раскомментировать строку
# SSH_UPLOAD "$USERMAN_IP_1" "$USERMAN_SSH_PORT_1" "$USERMAN_LOGIN_1" "$USERMAN_APPLY_1"
И добавить эти переменные в radcash.conf по типу существующих. Таким образом можно добавлять в выгрузку неограниченное количество устройств mikrotik