SmartEdge + Freeradius, биллинговые капризы
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’
Благодарим за помощь Руслана Дядина, из компании «Энергетика и связь строительства», г. Тольятти.