COA new version: відмінності між версіями
Sv (обговорення | внесок) м (→Настройка) |
Sv (обговорення | внесок) |
||
(Не показано 17 проміжних версій цього користувача) | |||
Рядок 1: | Рядок 1: | ||
COA это модуль ядра, который периодически просматривает данные абонентов (параметры авторизации, доступ, баланс и т.д) и в случае их изменения отправляет команды на оборудование. Например, при изменении тарифа, не сбрасывая сессию, он может послать команду на | ===Описание=== | ||
COA это модуль ядра, который периодически просматривает данные абонентов (параметры авторизации, доступ, баланс и т.д) и в случае их изменения отправляет команды на оборудование. Например, при изменении тарифа, не сбрасывая сессию, он может послать команду на изменение скорости. Либо при уходе баланса в минус послать команду блокировки. | |||
Используется совместно с Radius и устраняет его недостаток - когда данные соединения (ip, скорости, сервисы) устанавливаются только в момент подключения. | Используется совместно с Radius и устраняет его недостаток - когда данные соединения (ip, скорости, сервисы) устанавливаются только в момент подключения. | ||
Рядок 7: | Рядок 8: | ||
Конфиг /usr/local/nodeny/modules/coa/create.cfg.coa.cfg.pm. | Конфиг /usr/local/nodeny/modules/coa/create.cfg.coa.cfg.pm. | ||
Здесь вы можете увидеть, что coa отсылаются стандартной утилитой radclient (из пакета freeradius). Вы должны убедиться в | Здесь вы можете увидеть, что coa отсылаются стандартной утилитой radclient (из пакета freeradius). Вы должны убедиться в правильности пути к этой утилите в параметре $radclient - на Linux и FreeBSD пути различаются. | ||
Также в $radclient прописаны ключи, некоторые из которых вы можете подтюнить: | Также в $radclient прописаны ключи, некоторые из которых вы можете подтюнить: | ||
* t - сколько секунд ждем coa-ответа от устройства, после чего посылаем повторный пакет. Этот параметр зависит от того насколько долго идет пакет от сервера с модулем COA до самого дальнего BRAS. И обратно. Естественно, необходимо накинуть время на обработку пакетов BRAS и разные непредвиденные ситуации. Большой таймаут тоже не следует делать ибо этим вы уменьшаете время реакции, т.е. управление будет запаздывать. Тем не менее, в первую очередь важна надежность, поэтому важен баланс, но с гарантированным запасом. | * t - сколько секунд ждем coa-ответа от устройства, после чего посылаем повторный пакет. Этот параметр зависит от того насколько долго идет пакет от сервера с модулем COA до самого дальнего BRAS. И обратно. Естественно, необходимо накинуть время на обработку пакетов BRAS и разные непредвиденные ситуации. Большой таймаут тоже не следует делать ибо этим вы уменьшаете время реакции, т.е. управление будет запаздывать. Тем не менее, в первую очередь важна надежность, поэтому важен баланс, но с гарантированным запасом. | ||
* r - сколько попыток слать пакет. Если 2, то после первой неудачной посылается еще один. COA использует протокол UDP, поэтому могут быть ситуации, когда пакет потеряется. Две попытки нормальный вариант. | * r - сколько попыток слать пакет. Если 2, то после первой неудачной посылается еще один. COA использует протокол UDP, поэтому могут быть ситуации, когда пакет потеряется. Две попытки нормальный вариант. | ||
* p - максимальное одновременное количество coa-пакетов. Когда примерно в одно время изменяются данных большого количества абонентов, например, списание за услуги с последующей блокировкой, на BRAS идет большое количество coa-пакетов. Если их | * p - максимальное одновременное количество coa-пакетов. Когда примерно в одно время изменяются данных большого количества абонентов, например, списание за услуги с последующей блокировкой, на BRAS идет большое количество coa-пакетов. Если их отправлять последовательно, то это может занять большое количество времени. Поэтому пакеты посылаются параллельно в несколько потоков. Какое количество установить - зависит от производительности ваших BRAS... | ||
Для | Для разных ситуаций, в coa могут посылаться разные пакеты: | ||
* В '''$coa_connect__state_on''' атрибуты, которые посылаются когда подключен абонент, которому разрешен доступ в интернет | * В '''$coa_connect__state_on''' атрибуты, которые посылаются когда подключен абонент, которому разрешен доступ в интернет | ||
* В '''$coa_connect__no_money''' атрибуты, которые посылаются когда подключен абонент, которому запрещен доступ в интернет по причине минусового баланса | * В '''$coa_connect__no_money''' атрибуты, которые посылаются когда подключен абонент, которому запрещен доступ в интернет по причине минусового баланса | ||
Рядок 25: | Рядок 26: | ||
* Если вы закомментируете $coa_connect__no_money, то в случае недостачи финансов будет использоваться $coa_connect__state_off | * Если вы закомментируете $coa_connect__no_money, то в случае недостачи финансов будет использоваться $coa_connect__state_off | ||
* Скорее всего вам не понадобится $coa_disconnect | * Скорее всего вам не понадобится $coa_disconnect | ||
<br> | |||
В переменных могут использоваться два набора атрибутов, с ключами 1 и 2: | В переменных могут использоваться два набора атрибутов, с ключами 1 и 2: | ||
Рядок 39: | Рядок 41: | ||
</pre> | </pre> | ||
Зачем нужны очереди? Для некоторых ситуаций, которых у вас может и не быть | Зачем нужны очереди? Для некоторых ситуаций, которых у вас может и не быть (тогда используйте только либо ключ 1 либо 2). | ||
<br> | |||
====Ситуации, требующие две очереди==== | ====Ситуации, требующие две очереди==== | ||
Например, мы управляем скоростью с помощью сервисов | Например, мы управляем скоростью с помощью сервисов: | ||
<pre> | <pre> | ||
ERX-Service-Activate:1="svc-global-ipoe(1000000 | ERX-Service-Activate:1="svc-global-ipoe(1000000,1000000)" | ||
</pre> | </pre> | ||
Если возникнет необходимость изменить сервис, то мы сначала его | Если возникнет необходимость изменить сервис, то мы сначала его деактивируем, а потом устанавливаем иной. Либо этот же, но с другими параметрами. В этом случае, мы посылаем такой пакет: | ||
<pre> | <pre> | ||
Acct-Session-Id=12345, | Acct-Session-Id=12345, | ||
ERX-Service-Deactivate="svc-global-ipoe", | ERX-Service-Deactivate="svc-global-ipoe", | ||
ERX-Service-Activate:1="svc-global-ipoe(1000000 | ERX-Service-Activate:1="svc-global-ipoe(1000000,1000000)" | ||
</pre> | </pre> | ||
Однако, здесь есть проблема: если сервис svc-global-ipoe не был установлен, то будет ошибка и пакет | Однако, здесь есть проблема: если сервис svc-global-ipoe не был установлен, то будет ошибка и пакет будет проигнорирован, т.е. ERX-Service-Activate:1="svc-global-ipoe(1000000,1000000)" не выполнится. | ||
<br> | |||
Эту проблему можно было бы решить с помощью запоминания была ли установлена эта услуга ранее (что ненадежно и сложно) либо опроса BRAS (что медленно, а при большом количестве абонентов очень медленно). Поэтому, рекомендуется вариант: сначала удаляем все возможные сервисы, а потом устанавливаем тот, что нужен. | |||
Таким образом, чтобы гарантированно выполнился ERX-Service-Activate:1="svc-global-ipoe(1000000 | <br> | ||
Таким образом, чтобы гарантированно выполнился ERX-Service-Activate:1="svc-global-ipoe(1000000,1000000)", необходимо чтобы ERX-Service-Deactivate="svc-global-ipoe" был прислан в отдельном пакете. Однако, мы должны учитывать теоретическую ситуацию когда пакеты могут прийти в ином порядке - когда ранее посланный пакет может прийти после позже посланного. | |||
Для этого используются 2 очереди. Все пакеты на отключения посылаются в очереди 1. Причем они посылаются параллельно. Это пакеты не обязательно для одного ip. Их может быть много, если в данную секунду изменились данные многих абонентов. Например, пошлет 100 пакетов в 20 потоков. И только когда на все 100 будут получены ответы (ну или выйдет таймаут) | <br> | ||
Для этого используются 2 очереди. Все пакеты на отключения посылаются в очереди 1. Причем они посылаются параллельно. Это пакеты не обязательно для одного ip. Их может быть много, если в данную секунду изменились данные многих абонентов. Например, пошлет 100 пакетов в 20 потоков. И только когда на все 100 будут получены ответы (ну или выйдет таймаут) произойдет отправка пакетов из очереди 2, таким же параллельным образом. | |||
<br> | |||
====Формат пакетов==== | ====Формат пакетов==== | ||
Рядок 72: | Рядок 80: | ||
] | ] | ||
}; | }; | ||
</pre> | </pre> | ||
Рядок 85: | Рядок 92: | ||
<br><br> | <br><br> | ||
'''Если в параметрах авторизации будет параметр nas''' - coa пакет будет послан на сервер, ip которого берется из nas. В противном случае пакет будет послан на ip, указанный в конфиге. | '''Если в параметрах авторизации будет параметр nas''' - coa пакет будет послан на сервер, ip которого берется из nas. В противном случае пакет будет послан на ip, указанный в конфиге: | ||
[[Файл:nas_in_auth_properties.png]] | |||
===Запуск=== | |||
С выводом в консоль: | |||
<pre> | |||
perl noserver.pl -v -g=coa.cfg.pm | |||
</pre> | |||
Скорее всего, вам понадобится ипользовать ключ '''-i''' для того, чтобы отправлялись пакеты $coa_connect__state_off и $coa_connect__no_money |
Поточна версія на 07:43, 11 липня 2023
Описание
COA это модуль ядра, который периодически просматривает данные абонентов (параметры авторизации, доступ, баланс и т.д) и в случае их изменения отправляет команды на оборудование. Например, при изменении тарифа, не сбрасывая сессию, он может послать команду на изменение скорости. Либо при уходе баланса в минус послать команду блокировки.
Используется совместно с Radius и устраняет его недостаток - когда данные соединения (ip, скорости, сервисы) устанавливаются только в момент подключения.
Настройка
Конфиг /usr/local/nodeny/modules/coa/create.cfg.coa.cfg.pm.
Здесь вы можете увидеть, что coa отсылаются стандартной утилитой radclient (из пакета freeradius). Вы должны убедиться в правильности пути к этой утилите в параметре $radclient - на Linux и FreeBSD пути различаются.
Также в $radclient прописаны ключи, некоторые из которых вы можете подтюнить:
- t - сколько секунд ждем coa-ответа от устройства, после чего посылаем повторный пакет. Этот параметр зависит от того насколько долго идет пакет от сервера с модулем COA до самого дальнего BRAS. И обратно. Естественно, необходимо накинуть время на обработку пакетов BRAS и разные непредвиденные ситуации. Большой таймаут тоже не следует делать ибо этим вы уменьшаете время реакции, т.е. управление будет запаздывать. Тем не менее, в первую очередь важна надежность, поэтому важен баланс, но с гарантированным запасом.
- r - сколько попыток слать пакет. Если 2, то после первой неудачной посылается еще один. COA использует протокол UDP, поэтому могут быть ситуации, когда пакет потеряется. Две попытки нормальный вариант.
- p - максимальное одновременное количество coa-пакетов. Когда примерно в одно время изменяются данных большого количества абонентов, например, списание за услуги с последующей блокировкой, на BRAS идет большое количество coa-пакетов. Если их отправлять последовательно, то это может занять большое количество времени. Поэтому пакеты посылаются параллельно в несколько потоков. Какое количество установить - зависит от производительности ваших BRAS...
Для разных ситуаций, в coa могут посылаться разные пакеты:
- В $coa_connect__state_on атрибуты, которые посылаются когда подключен абонент, которому разрешен доступ в интернет
- В $coa_connect__no_money атрибуты, которые посылаются когда подключен абонент, которому запрещен доступ в интернет по причине минусового баланса
- В $coa_connect__state_off атрибуты, которые посылаются когда подключен абонент, которому запрещен доступ в интернет либо не подключен тариф доступа в интернет
- В $coa_disconnect атрибуты, которые посылаются когда абонент отключается (перестает быть авторизованным)
Замечания:
- Если в определенной ситуации вы не хотите отсылать пакет, просто закомментируйте данную переменную
- Если вы закомментируете $coa_connect__no_money, то в случае недостачи финансов будет использоваться $coa_connect__state_off
- Скорее всего вам не понадобится $coa_disconnect
В переменных могут использоваться два набора атрибутов, с ключами 1 и 2:
$coa_connect__state_on = { 1 => [ атрибуты, которые посылаются в первую очередь ], 2 => [ атрибуты, которые посылаются во вторую очередь ] };
Зачем нужны очереди? Для некоторых ситуаций, которых у вас может и не быть (тогда используйте только либо ключ 1 либо 2).
Ситуации, требующие две очереди
Например, мы управляем скоростью с помощью сервисов:
ERX-Service-Activate:1="svc-global-ipoe(1000000,1000000)"
Если возникнет необходимость изменить сервис, то мы сначала его деактивируем, а потом устанавливаем иной. Либо этот же, но с другими параметрами. В этом случае, мы посылаем такой пакет:
Acct-Session-Id=12345, ERX-Service-Deactivate="svc-global-ipoe", ERX-Service-Activate:1="svc-global-ipoe(1000000,1000000)"
Однако, здесь есть проблема: если сервис svc-global-ipoe не был установлен, то будет ошибка и пакет будет проигнорирован, т.е. ERX-Service-Activate:1="svc-global-ipoe(1000000,1000000)" не выполнится.
Эту проблему можно было бы решить с помощью запоминания была ли установлена эта услуга ранее (что ненадежно и сложно) либо опроса BRAS (что медленно, а при большом количестве абонентов очень медленно). Поэтому, рекомендуется вариант: сначала удаляем все возможные сервисы, а потом устанавливаем тот, что нужен.
Таким образом, чтобы гарантированно выполнился ERX-Service-Activate:1="svc-global-ipoe(1000000,1000000)", необходимо чтобы ERX-Service-Deactivate="svc-global-ipoe" был прислан в отдельном пакете. Однако, мы должны учитывать теоретическую ситуацию когда пакеты могут прийти в ином порядке - когда ранее посланный пакет может прийти после позже посланного.
Для этого используются 2 очереди. Все пакеты на отключения посылаются в очереди 1. Причем они посылаются параллельно. Это пакеты не обязательно для одного ip. Их может быть много, если в данную секунду изменились данные многих абонентов. Например, пошлет 100 пакетов в 20 потоков. И только когда на все 100 будут получены ответы (ну или выйдет таймаут) произойдет отправка пакетов из очереди 2, таким же параллельным образом.
Формат пакетов
$coa_connect__state_on = { 1 => [ 'Acct-Session-Id={{auth_ses}}, ERX-Service-Activate:1="pppoe_local({{speed_in1_mb}}m,{{speed_out1_mb}}m)"' ] };
В двойных фигурных скобках можно указать данные конкретного абонента, например:
- ip - ip адрес
- auth_ses - имя сессии
- speed_in1 - входящая скорость в битах
- speed_in1_kb - входящая скорость в килобитах
- speed_in1_mb - входящая скорость в мегабитах
Если в параметрах авторизации будет параметр nas - coa пакет будет послан на сервер, ip которого берется из nas. В противном случае пакет будет послан на ip, указанный в конфиге:
Запуск
С выводом в консоль:
perl noserver.pl -v -g=coa.cfg.pm
Скорее всего, вам понадобится ипользовать ключ -i для того, чтобы отправлялись пакеты $coa_connect__state_off и $coa_connect__no_money