Описание
Задача: предоставить клиенту возможность пользоваться услугой 2 часа в будние дни и разрешить скачивание 1 ГБ трафика за отведенное время, блокировка доступа должна произойти после исчерпания предоставленной квоты по времени или по трафику, отмена блокировки должна произойти в 7:00 по часовому поясу клиента, клиент находится в Екатеринбурге. В момент блокировки нужно разрешить доступ до https://eltex-co.ru/, все остальные HTTP/HTTPS запросы перенаправлять на страницу блокировки.
Для решения поставлено задачи нужно использовать сценарии PCRF. Сценарий это последовательность сервисов. Сервисы, используемые в сценарии должны быть конечны, они должны иметь условие перехода на следующую ступень.
Это может быть:
обычный лимит по времени или трафику, при истечении которого пользователь попадает на следующую ступень сценария;
крон-лимит, выставляется выражение в формате quartz cron в нем указывается время в которое нужно перевести пользователя на следующую ступень.
Также в настройках сценария доступно ключевое слово again
, обозначающее, что пользователь должен вернуться в начало сценария и продолжить получать услугу. В этом случае лимиты по отдельным ступеням взводятся снова.
Предполагается что SoftWLC и BRAS уже настроены и введены в эксплуатацию.
Версии программного обеспечения:
SoftWLC 1.13
PCRF требуется лицензия для работы сценариев
ESR 1.6.2
Создание URL списков
Для выполнения поставленной задачи нужно создать два списка welcome и white_list. Список welcome используется при повторной авторизации клиентов, создается при первичной настройке SoftWLC для работы с BRAS.
В Личном Кабинете переходит на вкладку Настройки PCRF → URL списки
Создание списка welcome
Данный список должен содержать адрес портала
http://10.10.5.50:9000/eltex_portal/
Создание списка white_list
Данный список должен содержать адрес ресурса который будет доступен в момент блокировки, для удобства задаем адрес в виде регулярного выражения
^(https|http):\/\/eltex-co\.ru\/
Создание сервисов
В Личном Кабинете переходим на вкладку Сервисы и тарифы → Сервисы PCRF
Создание сервиса limit2h1Gb
Данный сервис будет выступать нулевой ступенью в нашем сценарии. В сервисе задаем квоту по времени и трафику согласно условиям задачи
Класс трафика – INTERNET, данный класс трафика должен разрешать доступ по всем протоколам;
ip access-list extended INTERNET rule 10 action permit enable exit exit
- Квота по времени – 2 часа, согласно условиям задачи;
- Квота по трафику – 1 Гб согласно условиям задачи;
- Интервал отправки аккаунтинга – 300 секунд;
- Приоритет – 10, сервисы с более низким приоритетом обрабатываются в первую очередь;
- Действие по умолчанию - permint
Создание сервиса blocking
Данный сервис будет выступать первой ступенью в нашем сценарии. Сервис будет блокировать доступ в интернет, все HTTP/HTTPS запросы будут перенаправлены на страницу портала "Доступ запрещен", доступ к https://eltex-co.ru/ по HTTP/HTTPS будет открыт.
Класс трафика – WELCOME, данный класс должен разрешать доступ по портам которые проксируются на BRAS
ip access-list extended WELCOME rule 1 action permit match protocol tcp match destination-port 443 enable exit rule 2 action permit match protocol tcp match destination-port 8443 enable exit rule 3 action permit match protocol tcp match destination-port 80 enable exit rule 4 action permit match protocol tcp match destination-port 8080 enable exit rule 5 action permit match protocol tcp match destination-port 9000 enable exit exit
- Интервал отправки аккаунтинга – 300 секунд;
- Приоритет – 10, сервисы с более низким приоритетом обрабатываются в первую очередь;
- Действие по умолчанию – redirect
- URL по умолчанию – http://<ip address>:9000/eltex_portal/access-denied.jsp, ссылка на страницу "Доступ запрещен", можно создать свою собственную старицу через Конструктор порталов
Добавляем правило URL фильтрации с действием permit и URL списком welcome, данный фильтр нужен что бы разрешить доступ в странице портала "Доступ запрещен".
Добавляем правильно URL фильтрации с действием permit и URL списком white_list, данный фильтр нужен что бы разрешить доступ до https://eltex-co.ru
Через дополнительное меню задаем время сброса блокировки
Сброс блокировки учитывает timezone клиента, ее нужно указать в настройках сервисного домена в EMS, если в домене клиента не указана timezone будет произведен поиск вверх по дереву, если в родительских доменах timezone не указана снятие блокировки будет проходит по UTC ± 0:00. Timezone задается в настройках доменов в EMS
Создание сценария PCRF
В Личном Кабинете переходим на вкладку Сервисы и тарифы → PCRF сценарии
Создание сценария limit
Добавляем ранее созданные сервисы в сценарий, сервисы будут выдаться сверху вниз
На нулевой ступени клиент получит сервис с квотами (limit2h1Gb) , после исчерпания квот ему будет выдана первая ступень с сервисом блокировки (blocking), данный сервис будет действовать до момент сброса сервиса. После сброса сервиса клиент перейдет на вторую степень и переключится снова на нулевую ступень.
Создание тарифного плана
В Личном Кабинете переходим на вкладку Сервисы и тарифы → Тарифы, меняем фильтр на PCRF/BRAS
Создание тарифного плана limitTP
Добавляем новый тарифный план и выбираем ранее созданный сценарий limit
- Наименование – название limitTP;
- Код тарифа – может совпадать с наименованием limitTP;
- Домен – так как тарифный план может быть применен к разным клиентам создаем его в корневом домене root;
- Время жизни сессии – задаем время жизни сессии на BRAS. Если сессия клиента закрывается по причине исчерпания времени жизни и клиент активен в данный момент, текущая сессия будет завершена и запустится новая сессия, клиент пройдет прозрачную авторизацию через mac-auth;
Интервал запуска CheckCronBrasVerticle
Интервал запуска CheckCronBrasVerticle настраивает в конфигурации PCRF в блоке bras.cron.update.interval
"bras.cron.update.interval": { "interval" : 1, "unit": "hours" },
По умолчанию интервал запуска 1 час, для увеличения числа проверок нужно изменить данный параметр и перезапустить PCRF, например для запуска каждые 1800 секунд:
"bras.cron.update.interval": { "interval" : 1800, "unit": "Seconds" },
Как это работает
Клиент проходит регистрацию на портале и получает настроенный сценарий, в mongo можно увидеть на какой ступени находится клиент и какие у него сервисы:
> use pcrf switched to db pcrf > db.scripts.find({"user_name" : "79139001234"}).pretty(); { "_id" : "5d0c9359cc4e0c72ceb395ff", "domain" : "Auto1_test.Sibir.OTT.root", "title" : "limit", "user_name" : "79139001234", "step" : 0 } > db.service.find({"user_name" : "79139001234"}).pretty(); { "_id" : "5d0c9359cc4e0c72ceb39600", "user_domain" : "Auto1_test.Sibir.OTT.root", "user_name" : "79139001234", "service_list" : { "limit2h1Gb" : { "service_domain" : "root", "quota_time" : NumberLong(7200), "quota_volume" : NumberLong(1073741824) }, "blocking" : { "service_domain" : "root", "quota_cron" : "06/24/2019 - 07:00:00 YEKT" } } }
Клиент находится на нулевой степени сценария, в сценарии два сервиса limit2h1Gb и blocking. Далее возможно два пути развития:
Если клиент использовал свою квоту, PCRF отправит CoA запрос (command=services-reauth) на BRAS и переведет клиента на следующую ступень сценария, BRAS перезапросит сервисы у PCRF, PCRF выдаст данные новой ступени. В mongo изменится step в коллекции scripts и возведутся квоты для сервиса limit2h1Gb.
- Если клиент не использовал свою квоту и отключился от сети его сессия будет закрыта по бездействию через 10 минут, т.е. он останется на нулевой ступени сценария.
В назначенное время PCRF просмотрит данные в коллекции service, если клиент находится на нулевой ступени, PCRF возведет квоты в исходное состояние, если клиент находится на первой ступени PCRF, переключит его на следующую ступень, т.е. служебное слово "again". В debug логах PCRF можно увидеть такие строки:
==> /var/log/eltex-pcrf/eltex-pcrf-service.log <== 2019-06-21T16:09:16,955 [vert.x-eventloop-thread-2] DEBUG CheckCronBrasVerticle ?.(line:). Current time 2019-06-21T09:09:16.955Z 2019-06-21T16:09:17,070 [vert.x-eventloop-thread-2] DEBUG CheckCronBrasVerticle ?.(line:). Imagine time 06/21/2019 - 14:09:00 +0500 2019-06-21T16:09:17,071 [vert.x-eventloop-thread-2] DEBUG CheckCronBrasVerticle ?.(line:). Value {"quota_cron":"06/21/2019 - 14:09:00 +0500","service_domain":"root"} 2019-06-21T16:09:17,071 [vert.x-eventloop-thread-2] DEBUG CheckCronBrasVerticle ?.(line:). service_name blocking, cronTime 2019-06-21T14:09+05:00, service_domain root 2019-06-21T16:09:17,071 [vert.x-eventloop-thread-2] DEBUG CheckCronBrasVerticle ?.(line:). Difference 16 2019-06-21T16:09:17,071 [vert.x-eventloop-thread-2] DEBUG CheckCronBrasVerticle ?.(line:). Start to cron BrasCron(userName=79139001234, userDomain=Auto1_test.Sibir.OTT.root, serviceName=blocking, date=2019-06-21T14:09+05:00[Asia/Yekaterinburg], serviceDomain=root) 2019-06-21T16:09:17,076 [vert.x-eventloop-thread-1] DEBUG ReinitAllSerPersExcCronStrg ?.(line:). Search sessions by name = '79139001234' AND domain = 'Auto1_test.Sibir.OTT.root' for all services: [] 2019-06-21T16:09:17,076 [vert.x-eventloop-thread-1] DEBUG ReinitAllSerPersExcCronStrg ?.(line:). Try to get tariff domain for service name=79139001234, domain=Auto1_test.Sibir.OTT.root. Reload from base 25, hashed 41997. 2019-06-21T16:09:17,084 [vert.x-eventloop-thread-2] DEBUG CheckCronBrasVerticle ?.(line:). Successfully all checked
В коллекции scripts изменился номер шага:
> db.scripts.find({"user_name" : "79139001234"}).pretty(); { "_id" : "5d0c9359cc4e0c72ceb395ff", "domain" : "Auto1_test.Sibir.OTT.root", "title" : "limit", "user_name" : "79139001234", "step" : 2 }
Когда клиент вернется он получит обновленные сервисы и сможет получить услугу согласно поставленной задаче.
Известные ограничения
Если в сценарии используется более одного сервиса с квотами и клиент не дошел до сервиса с блокировкой, то после сброса состояния он останется в текущем сервисе с возведенными квотами, т.е. не перейдет на нулевую ступень. При повтором подключении клиент не сможет получить услугу в полном объеме, так как начнет работу с середины пути.