COA new version: відмінності між версіями

Матеріал з NoDeny
Перейти до навігації Перейти до пошуку
м (Защитил страницу COA new version ([Редактирование=Разрешено только администраторам] (бессрочно) [Переименование=Разрешено только администраторам] (бессрочно)))
Рядок 10: Рядок 10:


Также в $radclient прописаны ключи, некоторые из которых вы можете подтюнить:
Также в $radclient прописаны ключи, некоторые из которых вы можете подтюнить:
* -t : сколько секунд ждем coa-ответа от устройства, после чего посылаем повторный пакет. Этот параметр зависит от того насколько долго идет пакет от сервера с модулем COA до самого дальнего BRAS. И обратно. Естественно, необходимо накинуть время на обработку пакетов BRAS и разные непредвиденные ситуация. Большой таймаут тоже не следует делать ибо этим вы уменьшаете время реакции, т.е. управление будет запаздывать. Тем не менее, в первую очередь важна надежность, поэтому важен баланс, но с гарантированным запасом.
* t - сколько секунд ждем coa-ответа от устройства, после чего посылаем повторный пакет. Этот параметр зависит от того насколько долго идет пакет от сервера с модулем COA до самого дальнего BRAS. И обратно. Естественно, необходимо накинуть время на обработку пакетов BRAS и разные непредвиденные ситуация. Большой таймаут тоже не следует делать ибо этим вы уменьшаете время реакции, т.е. управление будет запаздывать. Тем не менее, в первую очередь важна надежность, поэтому важен баланс, но с гарантированным запасом.
* -r : сколько попыток слать пакет. Если 2, то после первой неудачной посылается еще один. COA использует протокол UDP, поэтому могут быть ситуации, когда пакет потеряется. Две попытки, нормальный вариант.
* r - сколько попыток слать пакет. Если 2, то после первой неудачной посылается еще один. COA использует протокол UDP, поэтому могут быть ситуации, когда пакет потеряется. Две попытки, нормальный вариант.
* -p : максимальное одновременное количество coa-пакетов. Когда примерно в одно время изменяются данных большого количества абонентов, например, списание за услуги с последующей блокировкой, на BRAS идет большое количество coa-пакетов. Если их не отправлять параллельно, то это может занять большое количество времени. Поэтому пакеты посылаются параллельно в несколько потоков. Какое количество установить - зависит от производительности ваших BRAS...
* p - максимальное одновременное количество coa-пакетов. Когда примерно в одно время изменяются данных большого количества абонентов, например, списание за услуги с последующей блокировкой, на BRAS идет большое количество coa-пакетов. Если их не отправлять параллельно, то это может занять большое количество времени. Поэтому пакеты посылаются параллельно в несколько потоков. Какое количество установить - зависит от производительности ваших BRAS...




 
Для раных ситуаций, в coa могут посылаться разные атрибуты:
 
 
В переменных $coa_connect__state_on, $coa_connect__state_off и $coa_disconnect указываются атрибуты, которые посылаются Radius-сервером клиенту в определенных ситуациях:
* В '''$coa_connect__state_on''' атрибуты, которые посылаются когда подключен абонент, которому разрешен доступ в интернет
* В '''$coa_connect__state_on''' атрибуты, которые посылаются когда подключен абонент, которому разрешен доступ в интернет
* В '''$coa_connect__state_off''' атрибуты, которые посылаются когда подключен абонент, которому запрещен доступ в интернет
* В '''$coa_connect__no_money''' атрибуты, которые посылаются когда подключен абонент, которому запрещен доступ в интернет по причине минусового баланса
* В '''$coa_connect__state_off''' атрибуты, которые посылаются когда подключен абонент, которому запрещен доступ в интернет либо не подключен тариф доступа в интернет
* В '''$coa_disconnect''' атрибуты, которые посылаются когда абонент отключается (перестает быть авторизованным)
* В '''$coa_disconnect''' атрибуты, которые посылаются когда абонент отключается (перестает быть авторизованным)


Не обязательно использовать все три переменные.
Замечания:
* Если в определенной ситуации вы не хотите отсылать пакет, просто закомментируйте данную переменную
* Если вы закомментируете $coa_connect__no_money, то в случае недостачи финансов будет использоваться $coa_connect__state_off
* Скорее всего вам не понадобится $coa_disconnect


Атрибуты задаются таким образом:
В переменных могут использоваться два набора атрибутов, с ключами 1  и 2:


<pre>
<pre>
$coa_connect__state_on = {
$coa_connect__state_on = {
     type    => тип пакета,
     1 => [
     template => шаблон,
            атрибуты, которые посылаются в первую очередь
    ],
     2 => [
            атрибуты, которые посылаются во вторую очередь
    ]
};
};
</pre>
</pre>


Если же необходимо послать несколько команд:
Зачем нужны очереди? Для некоторых ситуаций, которых у вас может и не быть, тогда используйте только либо ключ 1 либо 2.
 
====Ситуации, требующие две очереди====
 
Например, мы управляем скоростью с помощью сервисов, например:
<pre>
ERX-Service-Activate:1="svc-global-ipoe(1000000},1000000)"
</pre>
 
Если возникнет необходимость изменить сервис, то мы сначала его деактивировать, а потом установить иной, либо этот же, но с другими параметрами. В этом случае, мы посылаем, например, такой пакет:


<pre>
<pre>
$coa_connect__state_on = [
Acct-Session-Id=12345,
    {
ERX-Service-Deactivate="svc-global-ipoe",
        type    => тип пакета,
ERX-Service-Activate:1="svc-global-ipoe(1000000},1000000)"
        template => шаблон,
    },
    {
        type    => тип пакета,
        template => шаблон,
    }
];
</pre>
</pre>


Тип пакета может быть:
Однако, здесь есть проблема: если сервис 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" был прислан в отдельном пакете. Однако, мы должны учитывать теоретическую ситуацию, когда ранее посланный пакет может прийти после позже посланного.


* '''coa''' - предписывает изменить параметры сессии
Для этого используются 2 очереди. Все пакеты на отключения посылаются в очереди 1. Причем они посылаются параллельно. Это пакеты не обязательно для одного ip. Их может быть много, если в данную секунду изменились данные многих абонентов. Например, пошлет 100 пакетов в 20 потоков. И только когда на все 100 будут получены ответы (ну или выйдет таймаут), произойдет отправка пакетов из очереди 2, таким же параллельным образом.
* '''disconnect''' - предписывает отключить клиента


Шаблон - это текст с атрибутами в виде:
====Формат пакетов====


<pre>
<pre>
атрибут=значение
$coa_connect__state_on = {
    1 => [
            'Acct-Session-Id={{auth_ses}}, ERX-Service-Activate:1="pppoe_local({{speed_in1_mb}}m,{{speed_out1_mb}}m)"'
    ]
};
'Acct-Session-Id={{auth_ses}}, ERX-Service-Activate:1="svc-global-ipoe({{speed_in1_mb}}m,{{speed_out1_mb}}m)"
</pre>
</pre>


Рядок 64: Рядок 79:
* ip - ip адрес
* ip - ip адрес
* auth_ses - имя сессии
* auth_ses - имя сессии
* speed_in1 - входящая скорость в битах
* speed_in1_kb - входящая скорость в килобитах
* speed_in1_kb - входящая скорость в килобитах
* speed_in1_mb -  входящая скорость в мегабитах
* speed_in1_mb -  входящая скорость в мегабитах

Версія за 12:24, 10 липня 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)"'
    ]
};
'Acct-Session-Id={{auth_ses}}, ERX-Service-Activate:1="svc-global-ipoe({{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, указанный в конфиге.