В интернете гуляет много статей по поводу того, как хранить тарифы для пользователей, везде, где я читал, все сводилось к тому, что в БД забивали каждый тариф, нужно было всегда держать связь БИЛЛИНГ-RADIUS. В этой статье я опишу нечто новое(во всяком случае я нигде не увидел подобного трюка)
Исторически сложилось, что тарифов стало куча да и при съедании лимита трафика скорость падала.
т.е. один тариф, 2 переменных, получаем 4 различных состояний:
1)upload,download
2)upload adter limit,download
3)upload,download after limit
4)upload adter limit,download after limit
т.е. для одного тарифа нужно городить 4 сервиса, глупо.
Что было сделано:
у всех юзеров привешивались сервисы вида:
10.128.65.41 Cisco-Account-Info += AWORLD-4096-2048
10.128.65.41 Cisco-Account-Info += AIX-61440-61440
AWORLD-BandwithIN-BandwithOUT
Для World делаем шаблон вида:
cat ./users
WORLD Password := "cisco"
Cisco-AVPair += "ip:traffic-class=in access-group 101 priority 10",
Cisco-AVPair += "ip:traffic-class=out access-group 101 priority 10",
Auth-Type := CHAP
Для того, чтобы из имени убрать скорость, добавим в hints:
DEFAULT User-Name =~ "^([a-zA-Z]{1,15})-([0-9]{1,10})-([0-9]{1,10})",# NAS-IP-Address == "127.0.0.1"
User-Name := "%{1}",-тут останется WORLD
Cisco-Service-Info := "%{2};%{3}"-ТУТ останется скорость.
Ну и в завершении для того, чтобы отдать строку со скоростями мы подключаем перловый модуль и там нагородим следующее:
sub authorize {
# For debugging purposes only
# &log_request_attributes;
# Here's where your authorization code comes
# You can call another function from here:
# &test_call;
my ($ds,$us )= split (/;/,$RAD_REQUEST{'Cisco-Service-Info'});
$ds *= 1024;
$us *= 1024;
my $bcup = int ($us*1.5/8);
my $bcdl = int ($ds*1.5/8);
$RAD_REPLY{'Cisco-Service-Info'} = "QU;$us;$bcup;D;$ds;$bcdl";
return RLM_MODULE_OK;
}
У меня получилось три шаблона:
1)МИР днем
2) Мир ночью
3)IX НН(Обмен между нижегородскими провайдерами)
cat ./users
IX Cleartext-Password := "cisco"
Cisco-AVPair += "ip:traffic-class=in access-group name IX-TO priority 7",
Cisco-AVPair += "ip:traffic-class=out access-group name IX-FROM priority 7",
Auth-Type := CHAP
WORLD Password := "cisco"
Cisco-AVPair += "ip:traffic-class=in access-group 101 priority 10",
Cisco-AVPair += "ip:traffic-class=out access-group 101 priority 10",
Auth-Type := CHAP
NWORLD Password := "cisco"
Cisco-AVPair += "ip:traffic-class=in access-group name WORD-NIGHT priority 9",
Cisco-AVPair += "ip:traffic-class=out access-group name WORD-NIGHT priority 9",
Auth-Type := CHAP
при копировании ссылку на источник оставлять обязательно)
На самом деле алгоритм вычисления берстов, описанный на сайте CISCO показывает не совсем адекватные результаты при применении скорости на спидтестах, возможно в этом винноваты сами спидтесты, пришлось подбирать берст вручную для каждго тарифа, в коде тупо добавились IF else.
ОтветитьУдалитьИз наблюдений:
При тарифах до мегабита все ок.
От 2 до 10 абоненты ругаличь что им недовешивают скорости(хотя запущеный торрент польностью утилизировал канал, но не всем это можно объяснить)
От 10 мегабит спидтесты не врали.