Mikrotik - кеш-система на основе User Manager

Вернуться на уровень выше

Как это работает:

1. На микротике настраивается собственный радиус-сервер.

2. Скрипт передает из базы mikbill на mikrotik данные для авторизации (ppp - login/password или ipoe - mac или оба одновременно) например раз в час (ниже вариант с работой реал-тайм). При этом передает только те учетки, у которых положительный баланс или стоит кредит и интернет не заблокирован.

3. При недоступности радиус-сервера микбила (ответ radius-timeout) запросы автоматически пойдут на локальный радиус-сервер. Если микротиков несколько, можно сделать радиус-сервер на одном, а остальные будут к нему подключаться.

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. Добавляем исполнение скрипта по крону.

Собственно это доработанная система первой версии, но весьма утяжеленная, поэтому и первая версия имеет право на существование.

Выгрузка радиус-шейперов из тарифов (значения 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

  • billing/howto/mikrotik_cache_userman.txt
  • Последние изменения: 3 лет назад
  • — Олег Вильковский