Ericsson SmartEdge + Freeradius, биллинговые капризы


с. 1

Ericsson SmartEdge + Freeradius, биллинговые капризы

При использовании нового BRAS для терминации абонентов очень часто возникают нюансы интеграции с биллингом. В нашей практике был и такой случай:


Терминация по схеме vlan-per-user, успешно запущена opt.82, работают freeradius, «биллинг», в качестве BRAS — SmartEdge. Нужно чтобы биллинг идентифицировал абонента по vlanID и выдавал соответствующий IP-адрес, для этого VlanID должен быть в атрибуте Username в Access-Request`e, иные варианты биллинг кушать отказывается.
Для решения можно использовать атрибуты Calling-Station-ID и/или NAS-Port-ID.

Calling-Station-ID.

Атрибут отправляется радиус сервера в access-request и accounting-request пакетах, значение атрибута зависит от типа подключенного сабскрайбера. По умолчанию Calling-Station-ID не отправляется, что бы включить, нужно в контексте выполнить команду:

(config-ctx)#radius attribute calling-station-id

Для настройки формата атрибута используется следующая команда:



radius attribute calling-station-id {[{media atm | media eth}] format {agent | description | hostname agent| slot-port agent}

Формат по-умолчанию slot-port имеет значение «Hostname#slot/port#Vlan-ID«, например «Redback#2/3#303« — то что нужно!


Возможно изменить разделитель в строке с ”#” на любой другой, для удобства разбора строки, это можно сделать следующей командой:
(config-ctx)#radius attribute calling-station-id separator separator

Другой вариант NAS-Port-ID.

Атрибут отправляется радиус сервера в access-request и accounting-request пакетах. По умолчанию в зависимости от типа подключения абонента строка атрибута имеет значение:

slot/port [vpi-vci vpi vci | vlan-id [tunl-vlan-id:]pvc-vlan-id] [pppoe sess-id | clips sess-id]. Пример: 4/1 vpi-vci 207 138 pppoe 5

В контексте можно изменить формат строки:


radius attribute nas-port-id {format {agent-circuit-id [agent-remote-id] | all | hostname {agent-circuit-id [agent-remote-id]} | physical | agent-remote-id} | modified-agent-circuit-id [prefix-lg-description] | prepend-separator | separator separator}

Например, если указать формат physical:


(config-ctx)#radius attribute nas-port-id format physical
формат отправляемого атрибута NAS-Port-Id будет: slot/port [vpi-vci vpi vci | vlan-id [tunl-vlan-id:]pvc-vlan-id].

Мы будем использовать Calling-Station-Id, потому что парсить его проще.

Итак:
1. Включаем отправку номера vlan в атрибуте Calling-Station-Id
#context local
#radius attribute calling-station-id format description (в данном случае достаточно radius attribute calling-station-id)
В результате в радиус-запросе появляется атрибут:
Calling-Station-Id = «Redback#2/4#501« 

2. Пишем мини-скрипт, который вырезает номер vlan из «входящего» атрибута и отдает его в «стандартный вывод». 


/etc/raddb/vlanrm.pl

#!/usr/bin/perl


($rb,$port,$vlan)= split(/#/,$ARGV[0], 3);
print $vlan;

3. В конфигурационном файле freeradius radiusd.conf в секции модулей добавляем rewrite, отдаем скрипту значение %{Calling-Station-Id}, результатом перезаписываем атрибут Username. Обращаем внимание что Username в акаунтинговых запросах не будет перезаписываться. Если необходимо, нужно прописать rwusername и в секции аккаунтинга.

 

modules {


….
   attr_rewrite rwusername {
        attribute = «User-Name«
        searchin = packet
        new_attribute = no
        searchfor = »%{User-Name}»
        ignore_case = no
        replacewith = »%{exec:/etc/raddb/vlanrm.pl %{Calling-Station-Id}}»
        append = no
    }

и в секции авторизации его вызов 


authorize {
    rwusername

   …. 


4. Всё! Убеждаемся что перезапись работает в дебаге радиус сервера:
radius_xlat: '00:22:15:a0:5b:ce'
radius_xlat: Running registered xlat function of module exec for
string '/etc/raddb/vlanrm.pl
%{Calling-Station-Id}'
rlm_exec (exec): Executing /etc/raddb/vlanrm.pl %{Calling-Station-Id}
radius_xlat: '/etc/raddb/vlanrm.pl Redback#2/4#501'
Exec-Program: /etc/raddb/vlanrm.pl Redback#2/4#501
Exec-Program output: 501
Exec-Program-Wait: plaintext: 501
Exec-Program: returned: 0
rlm_exec (exec): result 0
radius_xlat: '501'
rlm_attr_rewrite: Changed value for attribute User-Name from
'00:22:15:a0:5b:ce' to '501'

с. 1

скачать файл