====== 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