Page tree

Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

...

Данные блоки имеют одинаковую структуру:

КлючДопустимые значенияОписание

 

set_by

search_cache

Поиск профиля в кэше (MongoDB). Поиск выполняется в соответствии с критериями, указанными в ключе query. Хотя бы один из профилей (абонентский либо операторский) должен подбираться с использованием данного метода. Для подбора обоих профилей данный метод, как правило, используется только при необходимости формировать различные ответы в зависимости от результатов подбора каждого из профилей и наличия между ними подходящей привязки. Пример использования — IPoE-портал, для которого при авторизации абонентскому оборудованию выдаются различные атрибуты в зависимости от актуальности данных о нём в Гидре.

Если оба профиля подбираются с использованием этого метода, системная переменная $bind_id (идентификатор привязки абонентского оборудования к операторскому) заполняется в соответствии с типом привязки, указанном в ключе plugins → base → <plugin_instance_name> → actions → authorize → default_bind_type.

set_first_from_customer_profileПрофиль операторского оборудования извлекается из ранее подобранного профиля абонентского оборудования. В ключе filter определяются критерии отбора операторских профилей, а из удовлетворяющих фильтру профилей выбирается первый.
set_first_from_provider_profileПрофиль абонентского оборудования извлекается из ранее подобранного профиля операторского оборудования. В ключе filter определяются критерии отбора абонентских профилей, а из удовлетворяющих фильтру профилей выбирается первый. Данный метод, обычно используется для схемы доступа, в которой абонентское оборудование идентифицируется по данным операторского оборудования, к которому оно подключено: DHCP Option 82, Q-in-Q VLAN и т. д. При этом дополнительная фильтрация может использваться для проверки MAC-адреса абонентского оборудования, или ограничения профилей соответствующим нужной схеме доступа шаблоном, если одновременно используется несколько схем.
queryОдна или несколько пар key:value

Запрос для поиска профиля в кэше. Используется только с search_cache в качестве значения set_by. На основании пар key:value строится запрос в базу данных кэша.

Несмотря на то, что эти пары задаются не последовательностью, их порядок имеет значение. При запуске, агент формирует в БД кэша недостающие индексы для оптимизации работы с ней. Индексы для подбора профилей формируются с учётом порядка ключей в данном блоке. В связи с этим для оптимальной работы рекомендуется располагать ключи key в порядке убывания селективности: от более селективных (логин, MAC-адрес), к менее селективным (номер порта коммутатора, IP-адрес сервера доступа).

В качестве value такой пары может быть указан список значений. В таком случае соответствующий ключ профиля должен должен иметь значение, равное любому из элементов списка: в запросе к БД кэша к этому ключу применится оператор $in. Это позволяет, например, подбирать профиль по адресу привязанной к абонентскому оборудованию подсети, в которую входит IP-адрес из запроса, если маска подсети не известна. С помощью фильтра map_before для IP-адреса вычисляются подсети всех возможных размеров и список этих подсетей указывается в качестве критерия подбора профиля абонентского оборудования.

filterОдна или несколько пар key:valueФильтр для отбора вложенных профилей. Используется только с set_first_from_customer_profile или set_first_from_provider_profile в качестве значения set_by. В качестве критерия фильтра можно указывать тип привязки абонентского оборудования к операторскому, значения атрибутов подбираемого профиля и т. д.


Code Block
titleПример раздельного подбора абонентского и операторского профилей — использование IPoE-портала и идентификация по VLAN'у и номеру порта коммутатора с дополнительной проверкой MAC-адреса
collapsetrue
plugins:
  base:
    jmx5-qinq:
      actions:
        authorize:
          customer_profile: &customer_profile
            set_by: search_cache
            query:
              MAC-Address: $request.RAD_REQUEST.User-Name.normalize_mac()

          provider_profile: &provider_profile
            set_by: search_cache
            query:
              Switch-VLAN: $var.Remote-Circuit-Ids.Remote_Id
              Switch-Port-Code: $var.Remote-Circuit-Ids.Circuit_Id

          default_bind_type: network_connection

...

Шаблоны ответов определяются как последовательность и размещаются в ключе plugins → base → <plugin_instance_name> → actions → authorize → reply конфигурации плагина. Элементы данной последовательности имеют следующую структуру:

КлючДопустимые значенияОписание
conditionЛогическое вычисляемое выражениеУсловие применения шаблона: шаблон выбирается, если вычисляемое выражение из данного ключа вернуло истину, либо не задано.

templateRAD_CHECK

 

Пары key:value или возвращающее словарь вычисляемое выражение.

Шаблон блока RAD_CHECK ответа на запрос, где key — наименование RADIUS-атрибута ответа, а value — вычисляемое выражение, результат которого станет значением этого атрибута. В качестве value могут использоваться как единичные выражения, так и последовательности таких выражений. Последовательности выражений применяются для атрибутов, допускающих множественные значения. Атрибуты блока RAD_CHECK в сервере FreeRADIUS используются для управления процессом обработки запроса:

templateRAD_REPLY

 

Пары key:value или возвращающее словарь вычисляемое выражение.

Шаблон блока RAD_REPLY ответа на запрос, где key — наименование RADIUS-атрибута ответа, а value — вычисляемое выражение, результат которого станет значением этого атрибута. В качестве value могут использоваться как единичные выражения, так и последовательности таких выражений. Последовательности выражений применяются для атрибутов, допускающих множественные значения, таких как, например, Cisco-AVPair.

templateresult

Значение из словаря $rlm

Числовой код результата обработки запроса. Набор кодов и их предназначение описаны в вики проекта FreeRADIUS. Как правило используются два основных кода:

  • $rlm.OK — успешная авторизация.
  • $rlm.REJECT — отказ в авторизации.

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

...

Anchor
simultaneous-use_checking
simultaneous-use_checking
Ограничение количества одновременных сессий

Проверка количества сессий выполняется в разрезе профилей оборудования следующим образом:

  1. Разрешённое количество сессий определяется как наибольшее значение атрибута Simultaneous-Use среди подобранных абонентского и операторского профилей. Если такой атрибут в обоих профилях отсутствует или пуст, проверка не выполняется.
  2. К базе данных кэша делается запрос для подсчёта текущего количества активных сессий. Учитываются только сессии, привязанные к подобранным ранее профилям оборудования, и находящиеся в активном состоянии: Начата или Обновлена.
  3. Если текущее количество сессий больше или равно разрешённому, запрос маркируется тегом simultaneous-limit-exceeded.

Проверка наличия данного может быть использована как для выбора шаблона ответа, так и в after-фильтрах. Это позволяет, например, не отказывать в авторизации «лишним» сессиям, а отправлять для них особый набор атрибутов.

Code Block
titleПример настройки аутентификации по логину и паролю с ограничением на количество одновременных сессий
collapsetrue
plugins:
  base:
    l2tp-by-login:
      actions:
        authorize:
...
        authenticate:
          customer_profile:
            # Критерии подбора абонентского профиля идентичны таковым в authorize
            <<: *customer_profile
 
          provider_profile: {}

          reply:
            # Достигнуто ограничение на количество одновременных сессий
            - condition: $context.has_tag?('simultaneous-limit-exceeded')
              template:
                RAD_REPLY:
                  Reply-Message: '"You are already logged in"'

                result: $rlm.REJECT

            # Фиксированный внешний IP-адрес
            - condition: '    $customer_profile.attributes.try("Internet-Access-Service-Status") == "SERV_STATE_Provision"
                          and $customer_profile.attributes.Real-IP-Address.ip4?()'
              template:
                RAD_REPLY:
                  Acct-Interim-Interval: '"300"'
                  Cisco-AVPair:
                    - '"ip:vrf-id=REAL"'
                    - '"ip:ip-unnumbered=loopback221"'
                  Class: $customer_profile.attributes.L2TP-Class.coalesce("7")
                  Framed-IP-Address: $customer_profile.attributes.Real-IP-Address
                  Idle-Timeout: '"86400"'

                result: $rlm.OK

            # Динамический внутренний IP-адрес
            - condition: $customer_profile.attributes.try("Internet-Access-Service-Status") == "SERV_STATE_Provision"
              template:
                RAD_REPLY:
                  Acct-Interim-Interval: '"300"'
                  Cisco-AVPair:
                    - '"ip:vrf-id=NAT"'
                    - '"ip:ip-unnumbered=loopback220"'
                  Class: $customer_profile.attributes.L2TP-Class.coalesce("5")
                  Framed-Pool: '"NAT-1"'
                  Idle-Timeout: '"86400"'

                result: $rlm.OK

            # Доступ заблокирован (недостаточно средств)
            - template:
                RAD_REPLY:
                  Acct-Interim-Interval: '"600"'
                  Cisco-AVPair:
                    - '"ip:vrf-id=NOPAY"'
                    - '"ip:ip-unnumbered=loopback222"'
                  Cisco-Service-Info: '"QU;256000;9600;9600;D;256000;9600;9600"'
                  Framed-Pool: '"FREE-DNAT"'
                  Idle-Timeout: '"86400"'
                  mpd-limit:
                    - '"out#100=all shape 256000 pass"'
                    - '"in#100=all shape 256000 pass"'
                  Session-Timeout: '"86400"'
 
                result: $rlm.OK

 

Пост-аутентификация — действие post_auth

...

Обновление и запись новых сведений о сессии выполняется в соответствии с настраиваемым шаблоном. Шаблоны сессий определяются как последовательность и размещаются в ключе plugins → base → <plugin_instance_name> → actions → accounting → session → templates конфигурации плагина. Элементы данной последовательности имеют следующую структуру:

КлючДопустимые значенияОписание
conditionЛогическое вычисляемое выражениеУсловие применения шаблона: шаблон выбирается, если вычисляемое выражение из данного ключа вернуло истину, либо не задано.
attributesПары key:value

Перечень атрибутов сессии, которые необходимо сохранить в записи о ней. Здесь key — наименование атрибута сессии, а value — вычисляемое выражение, результат которого станет значением этого атрибута. В качестве value могут использоваться как единичные выражения, так и последовательности таких выражений.

Атрибуты сессии вычисляются и сохраняются только при обработке первого пакета аккаунтинга по данной сессии. Помимо этих атрибутов, при обработке Stop-пакета в отдельный параметр сессии записывается значение атрибута Acct-Terminate-Cause, отражающего причину завершения сессии.

template

Пары key:value.Шаблон ответа, где key — наименование RADIUS-атрибута ответа, а value — вычисляемое выражение, результат которого станет значением этого атрибута. В качестве value могут использоваться как единичные выражения, так и последовательности таких выражений. Последовательности выражений применяются для атрибутов, допускающих множественные значения, таких как, например, Cisco-AVPair.
services

Последовательность структур из трёх полей:

  • service_id
  • value
  • unit

Перечень услуг, которые необходимо тарифицировать в рамках данной сессии:

  • service_id — идентификатор номенклатурной позиции услуги в Гидре.
  • value — вычисляемое выражение, результат которого интерпретируется как общее потреблённое с начала данной сессии количество услуги.
  • unit — единица измерения услуги. Допустимые значения поля: bytes, kilobytes, megabytes, gigabytes, seconds, minutes, hours, days, months, bits_per_second, kilobits_per_second, megabits_per_second.

Как правило, в рамках одной сессии тарифицируется две детализированных потоковых услуги: для входящего направления трафика и для исходящего. Для вычисления количества по счётчикам Acct-Input-Octets, Acct-Output-Octets, Acct-Input-Gigawords и Acct-Output-Gigawords используются, как правило, следующие вычисляемые выражения:

  • $request.RAD_REQUEST.Acct-Input-Octets.to_i() + 4 * $request.RAD_REQUEST.Acct-Input-Gigawords.to_i().gigabytes()
  • $request.RAD_REQUEST.Acct-Output-Octets.to_i() + 4 * $request.RAD_REQUEST.Acct-Output-Gigawords.to_i().gigabytes()

service_profiletemplate_id

Целое числоДанный параметр применяется только при использовании на сервором доступа сервисной модели, при которой аккаунтинг приходит отдельно для базовой сесии абонента и для предоставляемых в рамках неё сервисов. Для шаблонов сервисных сессий в нём необходимо указать идентфикатор дочернего шабона абонентских профилей, который соответствует данному сервису. Тип такой сервисной сессии будет выбран на основании указанного сервисного шаблона.
load_to_hydratrue, falseФлаг, отражающий необходимость загрузки записи о данной сессии в основную БД Гидры. По умолчанию загружаются все сессии — данный флаг имеет смысл явно указывать только для «гостевых» сессий, для которых в Гидре нет подходящих профилей оборудования.

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

...