Поиск по этому блогу

среда, 16 февраля 2011 г.

ISG реализация тарифов



В интернете гуляет много статей по поводу того, как хранить тарифы для пользователей, везде, где я читал, все сводилось к тому, что в БД забивали каждый тариф, нужно было всегда держать связь БИЛЛИНГ-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






при копировании ссылку на источник оставлять обязательно)


1 комментарий:

  1. На самом деле алгоритм вычисления берстов, описанный на сайте CISCO показывает не совсем адекватные результаты при применении скорости на спидтестах, возможно в этом винноваты сами спидтесты, пришлось подбирать берст вручную для каждго тарифа, в коде тупо добавились IF else.

    Из наблюдений:
    При тарифах до мегабита все ок.
    От 2 до 10 абоненты ругаличь что им недовешивают скорости(хотя запущеный торрент польностью утилизировал канал, но не всем это можно объяснить)
    От 10 мегабит спидтесты не врали.

    ОтветитьУдалить