====== Mikrotik - кеш-система на основе User Manager ====== [[billing:howto|Вернуться на уровень выше]] Как это работает: 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(""," "); print }' | awk '{ gsub(""," "); print }' | awk '{print $1}') DB_PASSWORD=$(cat $PATH_CONFIG| grep password | awk '{ gsub(""," "); print }' | awk '{ gsub(""," "); print }' | awk '{print $1}') DB_NAME=$(cat $PATH_CONFIG | grep dbname | awk '{ gsub(""," "); print }' | awk '{ gsub(""," "); 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