Интеграция Asterisk и BGBilling (Accounting) посредством изменения программного кода Asterisk

Материал из BiTel WiKi

Перейти к: навигация, поиск

Начиная с версии 1.4.2 Asterisk поддерживает интеграцию с системами биллинга, базирующимися на протоколе Radius AAA. Из "трех китов" Radius'a (Authentication, Authorization, Accounting) на данный момент Asterisk может отправлять только пакеты Accounting при завершении сессии (Acct-Status-Type=Stop). При этом Asterisk использует несколько отличные от используемых в повсеместной практике VoIP атрибуты Radius (вместо привычных атрибутов Cisco используются собственные атрибуты Digium). В связи с этим возникают некоторые сложности при интеграции Asterisk'а с BGBilling'ом, поскольку последний для обсчета сессий VoIP использует атрибуты Cisco.

Интеграцию Asterisk'а с BGBilling'ом можно осуществить двумя путями:

  1. Используя скрипты предобработки RADIUS запросов, заменить получаемые от Asterisk'а атрибуты Digium на атрибуты Cisco. Положительной стороной данного решения можно считать отсутствие необходимости изменения программного кода Asterisk'а. Отрицательной - сложность совмещения Asterisk'а с другими системами биллинга, базирующимися на протоколе Radius (если возникнет такая необходимость). Этот вариант интеграции рассматривается в статье Интеграция Asterisk и BGBilling (Accounting) посредством скрипта предобработки запросов Radius
  2. Посредством изменения программного кода Asterisk'а, реализовать возможность отправки им атрибутов Cisco. Преимущества данного решения - более простая интеграция с BGBilling'ом за счет использования de facto стандартных атрибутов Cisco. К отрицательным сторонам можно отнести необходимость изменения программного кода Asterisk'а, которое требует несколько углубленных знаний. В данной статье рассматривается именно этот вариант интеграции.

В статье мы не будем подробно касаться вопросов, связанных с общими настройками Linux, Asterisk и BGBilling, описанными в документации, а только рассмотрим те дополнительные действия, которые необходимо будет предпринять для интеграции Asterisk'а с BGBilling'ом. Изложенное ниже описание решения работает у автора данной статьи в тестовом режиме и может содержать некоторые ошибки, поэтому не рекомендуется использовать эти рекомендации при предоставлении коммерческих услуг без полного понимания принципов и алгоритмов работы всех частей системы.

В общих чертах, описанный ниже патч делает следующее:

  • Заменяются атрибуты вендора Digium (22736) на аналогичные атрибуты вендора Cisco (9)
  • Если в поле accountcode стандартной статистики Астериска (CDR) присутствует какое-либо значение, то оно подставляется в атрибут User-Name, если значения нет, то User-Name не выдается
  • Если в поле userfield стандартной статистики Астериска (CDR) присутствует значение "answer", то оно подставляется в атрибут h323-call-origin, при ином значении или отсутствии значения в поле userfield, в h323-call-origin будет установлено значение originate.

Итак, подразумевается, что у нас имеется:

  1. Установленная и настроенная ОС Linux, на которой будет установлен Asterisk
  2. Исходный дистрибутив Asterisk (asterisk-1.4.хх.tar.gz)
  3. Исходный дистрибутив radiusclient-ng (radiusclient-ng-0.5.6.tar.gz)
  4. Установленный и настроенный BGBilling

Установка:

1. Разворачиваем дистрибутив Asterisk и radiusclient-ng:

cd /usr/local/src
tar zxvf asterisk-1.4.хх.tar.gz
tar zxvf radiusclient-ng-0.5.6.tar.gz

2. Собираем radiusclient-ng

cd ./radiusclient-ng-0.5.6
./configure
make install

3. Собираем asterisk

cd ../asterisk-1.4.хх
./configure
make menuconfig

На данном этапе необходимо проверить и при необходимости включить использование cdr_radius (находится в разделе [2. Call Detail Recording]). Если указанная опция недоступна, то необходимо проверить корректность установки radiusclient-ng.

В следующем шаге необходимо применить патч к файлу ./cdr/cdr_radius.c. Приложенный патч был создан для Asterisk версии 1.4.13, и в случае применения его к другим версиям, возможно возникновение ошибок.

cdr_radius.patch

--- cdr_radius.c.orig 2007-06-15 03:50:40.000000000 +0600
+++ cdr_radius.c 2008-04-16 01:15:23.000000000 +0600
@@ -52,27 +52,17 @@
/*! ISO 8601 standard format */
#define DATE_FORMAT "%Y-%m-%d %T %z"

-#define VENDOR_CODE 22736
+#define VENDOR_CODE 9

enum {
- PW_AST_ACCT_CODE = 101,
- PW_AST_SRC = 102,
- PW_AST_DST = 103,
- PW_AST_DST_CTX = 104,
- PW_AST_CLID = 105,
- PW_AST_CHAN = 106,
- PW_AST_DST_CHAN = 107,
- PW_AST_LAST_APP = 108,
- PW_AST_LAST_DATA = 109,
- PW_AST_START_TIME = 110,
- PW_AST_ANSWER_TIME = 111,
- PW_AST_END_TIME = 112,
- PW_AST_DURATION = 113,
- PW_AST_BILL_SEC = 114,
- PW_AST_DISPOSITION = 115,
- PW_AST_AMA_FLAGS = 116,
- PW_AST_UNIQUE_ID = 117,
- PW_AST_USER_FIELD = 118
+ PW_H323_REMOTE_ADDRESS = 23,
+ PW_H323_CONF_ID = 24,
+ PW_H323_SETUP_TIME = 25,
+ PW_H323_CALL_ORIGIN = 26,
+ PW_H323_CALL_TYPE = 27,
+ PW_H323_CONNECT_TIME = 28,
+ PW_H323_DISCONNECT_TIME = 29,
+ PW_H323_DISCONNECT_CAUSE = 30
};

enum {
@@ -105,49 +95,26 @@
return -1;

/* Account code */
- if (!rc_avpair_add(rh, send, PW_AST_ACCT_CODE, &cdr->accountcode, strlen(cdr->accountcode), VENDOR_CODE))
- return -1;
+ if (strlen(cdr->accountcode))
+ if (!rc_avpair_add(rh, send, PW_USER_NAME, &cdr->accountcode, strlen(cdr->accountcode), 0))
+ return -1;
+

/* Source */
- if (!rc_avpair_add(rh, send, PW_AST_SRC, &cdr->src, strlen(cdr->src), VENDOR_CODE))
+ if (!rc_avpair_add(rh, send, PW_CALLING_STATION_ID, &cdr->src, strlen(cdr->src), 0))
return -1;

/* Destination */
- if (!rc_avpair_add(rh, send, PW_AST_DST, &cdr->dst, strlen(cdr->dst), VENDOR_CODE))
- return -1;
-
- /* Destination context */
- if (!rc_avpair_add(rh, send, PW_AST_DST_CTX, &cdr->dcontext, strlen(cdr->dcontext), VENDOR_CODE))
- return -1;
-
- /* Caller ID */
- if (!rc_avpair_add(rh, send, PW_AST_CLID, &cdr->clid, strlen(cdr->clid), VENDOR_CODE))
- return -1;
-
- /* Channel */
- if (!rc_avpair_add(rh, send, PW_AST_CHAN, &cdr->channel, strlen(cdr->channel), VENDOR_CODE))
+ if (!rc_avpair_add(rh, send, PW_CALLED_STATION_ID, &cdr->dst, strlen(cdr->dst), 0))
return -1;

- /* Destination Channel */
- if (!rc_avpair_add(rh, send, PW_AST_DST_CHAN, &cdr->dstchannel, strlen(cdr->dstchannel), VENDOR_CODE))
- return -1;
-
- /* Last Application */
- if (!rc_avpair_add(rh, send, PW_AST_LAST_APP, &cdr->lastapp, strlen(cdr->lastapp), VENDOR_CODE))
- return -1;
-
- /* Last Data */
- if (!rc_avpair_add(rh, send, PW_AST_LAST_DATA, &cdr->lastdata, strlen(cdr->lastdata), VENDOR_CODE))
- return -1;
-
-
/* Start Time */
if (ast_test_flag(&global_flags, RADIUS_FLAG_USEGMTIME))
gmtime_r(&(cdr->start.tv_sec), &tm);
else
ast_localtime(&(cdr->start.tv_sec), &tm, NULL);
strftime(timestr, sizeof(timestr), DATE_FORMAT, &tm);
- if (!rc_avpair_add(rh, send, PW_AST_START_TIME, timestr, strlen(timestr), VENDOR_CODE))
+ if (!rc_avpair_add(rh, send, PW_H323_SETUP_TIME, timestr, strlen(timestr), VENDOR_CODE))
return -1;

/* Answer Time */
@@ -156,7 +123,7 @@
else
ast_localtime(&(cdr->answer.tv_sec), &tm, NULL);
strftime(timestr, sizeof(timestr), DATE_FORMAT, &tm);
- if (!rc_avpair_add(rh, send, PW_AST_ANSWER_TIME, timestr, strlen(timestr), VENDOR_CODE))
+ if (!rc_avpair_add(rh, send, PW_H323_CONNECT_TIME, timestr, strlen(timestr), VENDOR_CODE))
return -1;

/* End Time */
@@ -165,47 +132,58 @@
else
ast_localtime(&(cdr->end.tv_sec), &tm, NULL);
strftime(timestr, sizeof(timestr), DATE_FORMAT, &tm);
- if (!rc_avpair_add(rh, send, PW_AST_END_TIME, timestr, strlen(timestr), VENDOR_CODE))
- return -1;
-
- /* Duration */
- if (!rc_avpair_add(rh, send, PW_AST_DURATION, &cdr->duration, 0, VENDOR_CODE))
+ if (!rc_avpair_add(rh, send, PW_H323_DISCONNECT_TIME, timestr, strlen(timestr), VENDOR_CODE))
return -1;

/* Billable seconds */
- if (!rc_avpair_add(rh, send, PW_AST_BILL_SEC, &cdr->billsec, 0, VENDOR_CODE))
+ if (!rc_avpair_add(rh, send, PW_ACCT_SESSION_TIME, &cdr->billsec, 0, 0))
return -1;

/* Disposition */
- tmp = ast_cdr_disp2str(cdr->disposition);
- if (!rc_avpair_add(rh, send, PW_AST_DISPOSITION, tmp, strlen(tmp), VENDOR_CODE))
+ switch (cdr->disposition) {
+ case AST_CDR_ANSWERED:
+ tmp = "0";
+ break;
+ case AST_CDR_NOANSWER:
+ tmp = "5";
+ break;
+ case AST_CDR_BUSY:
+ tmp = "17";
+ break;
+ case AST_CDR_FAILED:
+ tmp = "22";
+ break;
+ case AST_CDR_NULL:
+ tmp = "22";
+ break;
+ default:
+ tmp = "22";
+ break;
+ }
+
+ if (!rc_avpair_add(rh, send, PW_H323_DISCONNECT_CAUSE, tmp, strlen(tmp), VENDOR_CODE))
return -1;

- /* AMA Flags */
- tmp = ast_cdr_flags2str(cdr->amaflags);
- if (!rc_avpair_add(rh, send, PW_AST_AMA_FLAGS, tmp, strlen(tmp), VENDOR_CODE))
+ /* Setting Acct-Session-Id attribute for proper generation
+ of Acct-Unique-Session-Id on server side */
+ /* Unique ID */
+ if (!rc_avpair_add(rh, send, PW_ACCT_SESSION_ID, &cdr->uniqueid, strlen(cdr->uniqueid), 0))
+ return -1;
+ if (!rc_avpair_add(rh, send, PW_H323_CONF_ID, &cdr->uniqueid, strlen(cdr->uniqueid), VENDOR_CODE))
return -1;

- if (ast_test_flag(&global_flags, RADIUS_FLAG_LOGUNIQUEID)) {
- /* Unique ID */
- if (!rc_avpair_add(rh, send, PW_AST_UNIQUE_ID, &cdr->uniqueid, strlen(cdr->uniqueid), VENDOR_CODE))
- return -1;
- }
-
- if (ast_test_flag(&global_flags, RADIUS_FLAG_LOGUSERFIELD)) {
- /* append the user field */
- if (!rc_avpair_add(rh, send, PW_AST_USER_FIELD, &cdr->userfield, strlen(cdr->userfield), VENDOR_CODE))
- return -1;
- }

- /* Setting Acct-Session-Id & User-Name attributes for proper generation
- of Acct-Unique-Session-Id on server side */
- /* Channel */
- if (!rc_avpair_add(rh, send, PW_USER_NAME, &cdr->channel, strlen(cdr->channel), 0))
+ /* Call Type */
+ if (!rc_avpair_add(rh, send, PW_H323_CALL_TYPE, "voip", 4, VENDOR_CODE))
return -1;

- /* Unique ID */
- if (!rc_avpair_add(rh, send, PW_ACCT_SESSION_ID, &cdr->uniqueid, strlen(cdr->uniqueid), 0))
+ /* Call Origin */
+ if (strcmp(cdr->userfield, "answer"))
+ tmp = "originate";
+ else
+ tmp = "answer";
+
+ if (!rc_avpair_add(rh, send, PW_H323_CALL_ORIGIN, tmp, strlen(tmp), VENDOR_CODE))
return -1;

return 0;

Данный файл момещаем в директорию ./cdr и применяем его с помощью команды

patch -p0 < cdr_radius.patch

После выпонения команды, оригинальный файл сохраняется по именем cdr_radius.c.orig, а в cdr_radius.c будет находиться измененный код.

cd ../asterisk-1.4.хх
make install

На этом установку можно считать оконченной. Приступаем к настройке.

Настройка:

1. Настраиваем radiusclient-ng в соотвествии с документацией. По умолчанию, файлы конфигурации radiusclient-ng располагаются в директории /usr/local/etc/radiusclient-ng. Для корректной работы программы, возможно прийдется создать символьную ссылку на эту директорию с помощью команды

ln -s /usr/local/etc/radiusclient-ng /etc

В файле /usr/local/etc/radiusclient-ng/radiusclient.conf изменяем следующие настройки:

auth_order radius
authserver address:port # Здесь подставляем адрес сервера BGBilling и порт, указанный в auth.port BGRadiusVoip/radius.properties
acctserver address:port # Здесь подставляем адрес сервера BGBilling и порт, указанный в acct.port BGRadiusVoip/radius.properties

В файле /usr/local/etc/radiusclient-ng/radiusclient.conf добавляем строку для нашего сервера BGRadiusVoip, содержащую адрес сервера и пароль, который в дальнейшем будет указан в конфигурации NAS'а в BGRadiusVoip.

Для работы radiusclient-ng с атрибутами Cisco, необходимо добавить словарь атрибутов. Приложенный файл необходимо поместить в /usr/local/etc/radiusclient-ng/dictionary.cisco

# -*- text -*-
#
# dictionary.cisco
#
# Accounting VSAs originally by
# "Marcelo M. Sosa Lugones" <marcelo@sosa.com.ar>
#
# Version: $Id: dictionary.cisco,v 1.12.4.1 2005/11/30 22:17:21 aland Exp $
#
# For documentation on Cisco RADIUS attributes, see:
#
# http://www.cisco.com/univercd/cc/td/doc/product/access/acs_serv/vapp_dev/vsaig3.htm
#

VENDOR Cisco 9

#
# Standard attribute
#
BEGIN-VENDOR Cisco

ATTRIBUTE Cisco-AVPair 1 string vendor=Cisco
ATTRIBUTE Cisco-NAS-Port 2 string vendor=Cisco

#
# T.37 Store-and-Forward attributes.
#
ATTRIBUTE Cisco-Fax-Account-Id-Origin 3 string vendor=Cisco
ATTRIBUTE Cisco-Fax-Msg-Id 4 string vendor=Cisco
ATTRIBUTE Cisco-Fax-Pages 5 string vendor=Cisco
ATTRIBUTE Cisco-Fax-Coverpage-Flag 6 string vendor=Cisco
ATTRIBUTE Cisco-Fax-Modem-Time 7 string vendor=Cisco
ATTRIBUTE Cisco-Fax-Connect-Speed 8 string vendor=Cisco
ATTRIBUTE Cisco-Fax-Recipient-Count 9 string vendor=Cisco
ATTRIBUTE Cisco-Fax-Process-Abort-Flag 10 string vendor=Cisco
ATTRIBUTE Cisco-Fax-Dsn-Address 11 string vendor=Cisco
ATTRIBUTE Cisco-Fax-Dsn-Flag 12 string vendor=Cisco
ATTRIBUTE Cisco-Fax-Mdn-Address 13 string vendor=Cisco
ATTRIBUTE Cisco-Fax-Mdn-Flag 14 string vendor=Cisco
ATTRIBUTE Cisco-Fax-Auth-Status 15 string vendor=Cisco
ATTRIBUTE Cisco-Email-Server-Address 16 string vendor=Cisco
ATTRIBUTE Cisco-Email-Server-Ack-Flag 17 string vendor=Cisco
ATTRIBUTE Cisco-Gateway-Id 18 string vendor=Cisco
ATTRIBUTE Cisco-Call-Type 19 string vendor=Cisco
ATTRIBUTE Cisco-Port-Used 20 string vendor=Cisco
ATTRIBUTE Cisco-Abort-Cause 21 string vendor=Cisco

#
# Voice over IP attributes.
#
ATTRIBUTE h323-remote-address 23 string vendor=Cisco
ATTRIBUTE h323-conf-id 24 string vendor=Cisco
ATTRIBUTE h323-setup-time 25 string vendor=Cisco
ATTRIBUTE h323-call-origin 26 string vendor=Cisco
ATTRIBUTE h323-call-type 27 string vendor=Cisco
ATTRIBUTE h323-connect-time 28 string vendor=Cisco
ATTRIBUTE h323-disconnect-time 29 string vendor=Cisco
ATTRIBUTE h323-disconnect-cause 30 string vendor=Cisco
ATTRIBUTE h323-voice-quality 31 string vendor=Cisco
ATTRIBUTE h323-ivr-out 32 string vendor=Cisco
ATTRIBUTE h323-gw-id 33 string vendor=Cisco
ATTRIBUTE h323-incoming-conf-id 35 string vendor=Cisco

ATTRIBUTE h323-credit-amount 101 string vendor=Cisco
ATTRIBUTE h323-credit-time 102 string vendor=Cisco
ATTRIBUTE h323-return-code 103 string vendor=Cisco
ATTRIBUTE h323-prompt-id 104 string vendor=Cisco
ATTRIBUTE h323-time-and-day 105 string vendor=Cisco
ATTRIBUTE h323-redirect-number 106 string vendor=Cisco
ATTRIBUTE h323-preferred-lang 107 string vendor=Cisco
ATTRIBUTE h323-redirect-ip-address 108 string vendor=Cisco
ATTRIBUTE h323-billing-model 109 string vendor=Cisco
ATTRIBUTE h323-currency 110 string vendor=Cisco
ATTRIBUTE subscriber 111 string vendor=Cisco
ATTRIBUTE gw-rxd-cdn 112 string vendor=Cisco
ATTRIBUTE gw-final-xlated-cdn 113 string vendor=Cisco
ATTRIBUTE remote-media-address 114 string vendor=Cisco
ATTRIBUTE release-source 115 string vendor=Cisco
ATTRIBUTE gw-rxd-cgn 116 string vendor=Cisco
ATTRIBUTE gw-final-xlated-cgn 117 string vendor=Cisco

# SIP Attributes
ATTRIBUTE call-id 141 string vendor=Cisco
ATTRIBUTE session-protocol 142 string vendor=Cisco
ATTRIBUTE method 143 string vendor=Cisco
ATTRIBUTE prev-hop-via 144 string vendor=Cisco
ATTRIBUTE prev-hop-ip 145 string vendor=Cisco
ATTRIBUTE incoming-req-uri 146 string vendor=Cisco
ATTRIBUTE outgoing-req-uri 147 string vendor=Cisco
ATTRIBUTE next-hop-ip 148 string vendor=Cisco
ATTRIBUTE next-hop-dn 149 string vendor=Cisco
ATTRIBUTE sip-hdr 150 string vendor=Cisco

#
# Extra attributes sent by the Cisco, if you configure
# "radius-server vsa accounting" (requires IOS11.2+).
#
ATTRIBUTE Cisco-Multilink-ID 187 integer vendor=Cisco
ATTRIBUTE Cisco-Num-In-Multilink 188 integer vendor=Cisco
ATTRIBUTE Cisco-Pre-Input-Octets 190 integer vendor=Cisco
ATTRIBUTE Cisco-Pre-Output-Octets 191 integer vendor=Cisco
ATTRIBUTE Cisco-Pre-Input-Packets 192 integer vendor=Cisco
ATTRIBUTE Cisco-Pre-Output-Packets 193 integer vendor=Cisco
ATTRIBUTE Cisco-Maximum-Time 194 integer vendor=Cisco
ATTRIBUTE Cisco-Disconnect-Cause 195 integer vendor=Cisco
ATTRIBUTE Cisco-Data-Rate 197 integer vendor=Cisco
ATTRIBUTE Cisco-PreSession-Time 198 integer vendor=Cisco
ATTRIBUTE Cisco-PW-Lifetime 208 integer vendor=Cisco
ATTRIBUTE Cisco-IP-Direct 209 integer vendor=Cisco
ATTRIBUTE Cisco-PPP-VJ-Slot-Comp 210 integer vendor=Cisco
ATTRIBUTE Cisco-PPP-Async-Map 212 integer vendor=Cisco
ATTRIBUTE Cisco-IP-Pool-Definition 217 string vendor=Cisco
ATTRIBUTE Cisco-Assign-IP-Pool 218 integer vendor=Cisco
ATTRIBUTE Cisco-Route-IP 228 integer vendor=Cisco
ATTRIBUTE Cisco-Link-Compression 233 integer vendor=Cisco
ATTRIBUTE Cisco-Target-Util 234 integer vendor=Cisco
ATTRIBUTE Cisco-Maximum-Channels 235 integer vendor=Cisco
ATTRIBUTE Cisco-Data-Filter 242 integer vendor=Cisco
ATTRIBUTE Cisco-Call-Filter 243 integer vendor=Cisco
ATTRIBUTE Cisco-Idle-Limit 244 integer vendor=Cisco
ATTRIBUTE Cisco-Account-Info 250 string vendor=Cisco
ATTRIBUTE Cisco-Service-Info 251 string vendor=Cisco
ATTRIBUTE Cisco-Command-Code 252 string vendor=Cisco
ATTRIBUTE Cisco-Control-Info 253 string vendor=Cisco
ATTRIBUTE Cisco-Xmit-Rate 255 integer vendor=Cisco

VALUE Cisco-Disconnect-Cause Unknown 2
VALUE Cisco-Disconnect-Cause CLID-Authentication-Failure 4
VALUE Cisco-Disconnect-Cause No-Carrier 10
VALUE Cisco-Disconnect-Cause Lost-Carrier 11
VALUE Cisco-Disconnect-Cause No-Detected-Result-Codes 12
VALUE Cisco-Disconnect-Cause No-Detected-Result-Codes 13
VALUE Cisco-Disconnect-Cause User-Ends-Session 20
VALUE Cisco-Disconnect-Cause Idle-Timeout 21
VALUE Cisco-Disconnect-Cause Exit-Telnet-Session 22
VALUE Cisco-Disconnect-Cause No-Remote-IP-Addr 23
VALUE Cisco-Disconnect-Cause Exit-Raw-TCP 24
VALUE Cisco-Disconnect-Cause Password-Fail 25
VALUE Cisco-Disconnect-Cause Raw-TCP-Disabled 26
VALUE Cisco-Disconnect-Cause Control-C-Detected 27
VALUE Cisco-Disconnect-Cause EXEC-Program-Destroyed 28
VALUE Cisco-Disconnect-Cause Timeout-PPP-LCP 40
VALUE Cisco-Disconnect-Cause Failed-PPP-LCP-Negotiation 41
VALUE Cisco-Disconnect-Cause Failed-PPP-PAP-Auth-Fail 42
VALUE Cisco-Disconnect-Cause Failed-PPP-CHAP-Auth 43
VALUE Cisco-Disconnect-Cause Failed-PPP-Remote-Auth 44
VALUE Cisco-Disconnect-Cause PPP-Remote-Terminate 45
VALUE Cisco-Disconnect-Cause PPP-Closed-Event 46
VALUE Cisco-Disconnect-Cause Session-Timeout 100
VALUE Cisco-Disconnect-Cause Session-Failed-Security 101
VALUE Cisco-Disconnect-Cause Session-End-Callback 102
VALUE Cisco-Disconnect-Cause Invalid-Protocol 120

END-VENDOR Cisco

В файле /usr/local/etc/radiusclient-ng/dictionary необходимо добавить строку:

$INCLUDE dictionary.cisco

2. Настраиваем BGRadiusVoip. Настройка сводится к описанному в документации добавлению NAS'а в модуле IP-телефония. Указываем имя NAS'а, адрес IP, пароль. Устанавливаем Вендор Cisco (он должен присутствовать в конфигурации модуля). Создаем конфигурацию NAS'а и помимо параметра service, указываем:

auth.in=voip/answer
auth.out=voip/originate
acct.in=voip/answer
acct.out=voip/originate

3. Настраиваем Asterisk в соотвествии с документацией. Чтобы задействовать Radius Accounting, в файл /etc/asterisk/cdr.conf раскомментируем или добавим следующие строки:

[radius]
usegmtime=no ; log date/time in GMT
loguniqueid=yes ; log uniqueid
loguserfield=yes ; log user field
; Set this to the location of the radiusclient-ng configuration file
; The default is /etc/radiusclient-ng/radiusclient.conf
radiuscfg => /usr/local/etc/radiusclient-ng/radiusclient.conf

На этом основную настройку связки Asterisk'a с BGBilling'ом можно считать оконченной. В итоге, BGBilling должен получать примерно такие пакеты:

15 22:20:57
Type=ACCOUNTING_REQUEST
Attributes:
User-Name=pbxpress
NAS-IP-Address=x.x.x.x
NAS-Port=0
Acct-Status-Type=2
Acct-Delay-Time=0
Acct-Session-Time=699
Acct-Session-Id=1208274330.136
Calling-Station-Id=10027341003
Called-Station-Id=73512545454
h323-disconnect-cause=0
h323-connect-time=2008-04-15 21:45:46 +0000
h323-disconnect-time=2008-04-15 21:57:25 +0000
h323-conf-id=1208274330.136
h323-setup-time=2008-04-15 21:45:30 +0000
h323-call-origin=originate
h323-call-type=voip

Остановимся на некоторых ньюансах определения типа звонка.

Поскольку Asterisk не является шлюзом в том понимании, которое используется при характеристике оборудования, стоящего на границе между ТФОП и сетью IP, однозначно определить средствами BGBilling'а, какие звонки являются исходящими, а какие входящими не всегда возможно, в частности в тех случаях, когда Asterisk выполняет функции транзитного софтсвича. Поэтому для реализации алгоритма определения типа звонка можно использовать следующее решение - прописывать тип звонка средствами Asterisk'a в CDR userfield. Предложенный выше измененный модуль cdr_radius будет извлекать эти данные и передавать их BGBilling'у внутри атрибутов Radius'a. Записать информацию о типе звонка в Asterisk'е можно средствами dialplan'а, к примеру:

/etc/asterisk/extensions.ael

...

macro ael-answer( ext , dev ) {
Set(CDR(userfield)="answer");
Dial(${dev}/${ext},120);
Hangup;
};

macro ael-originate( ext , dev ) {
Set(CDR(userfield)="originate");
Dial(${dev}/${ext},120);
Hangup;
};

context ael-default {

_7XXXXXXXXXX => {
&ael-originate(${EXTEN},SIP/sipnet);
};

_10027340XXX => &ael-answer(${EXTEN},SIP/pbxpress);
_10027343XXX => &ael-answer(${EXTEN},SIP/cgp);

}
...

Как видно из данного примера, при описании каждого маршрута, мы используем макрос, записывающий требуемую информацию о типе звонка.

Еще одной востребованной функцией измененного модуля cdr_radius может оказаться возможность поместить в передаваемый биллингу атрибут User-Name значение, которое можно указать для каждого peer в файлах конфигурации каналов Asterisk'a (sip.conf, iax.conf и т.д.) с помощью параметра accountcode. В этом случае, если на пользователя маршрутизируется не один или несколько номеров, а целый префикс, возможна тарификация трафика не по номерам, а по пользователям (с использованием "Поиск по User-Name=ALIAS"), при этом в ALIAS надо указывать то значение, которое вы будете помещать в accountcode.

Пример в /etc/asterisk/sip.conf

...

[pbxpress]
type=peer
context=default ; Context for incoming calls from this user
host=x.x.x.x
accountcode=pbxpress

...

Архив с cdr_radius.patch и dictionary.cisco: Медиа:asterisk_files.zip

--ArtKZ 16:06, 19 апреля 2008 (UTC)

Личные инструменты