Работа по протоколу Radius
Для работы по протоколу Radius структура взаимодействия основных частей модуля Voicе изображена на рисунке:
NAS (Network Access Server) - сервер, через который происходит звонок клиента. В роли NASа могут выступать специализированные компьютеры типа Cisco или любое другое оборудование поддерживающее Radius.
Обрабатываются следующие виды Radius-запросов:
авторизационный(access),
accounting(start/stop/update)
Базовые сведения о протоколе RADIUS и конфигурировании атрибутов.
Протокол RADIUS основан на UDP, представляет из себя пакет определённого типа с набором атрибутов. Рассмотрим ход типового соединения по логу RADIUS запросов (radius.log).
Time
:
12
.
09
.
2017
12
:
18
:
30
Packet type: Accounting-Request
Identifier:
198
Authenticator: {
29
3C
ED
92
11
62
3F
B4
45
60
B5
83
EC
3B
8F
FD
}
Attributes:
NAS
-
IP
-Address=
192
.
168
.
103
.
98
NAS
-Port=
0
Acct-Status-Type=
1
Acct-Delay-
Time
=
0
Acct-Session-Id=a18a094e-630d-436b-ab3d-82ad11f8fa6e
Called-Station-Id=
44179312622020
Called-Station-Id=
44179312622020
Login-Service=
0
Calling-Station-Id=
9612170985
cisco-avpair=h323-call-id=a18a094e-630d-436b-ab3d-82ad11f8fa6e
cisco-avpair=src-gw-ip=
192
.
168
.
103
.
100
cisco-avpair=src-gw-name=
9612170985
cisco-avpair=src-number-
in
=
9612170985
cisco-avpair=src-number-out=
9612170985
cisco-avpair=dst-gw-ip=
192
.
168
.
103
.
98
cisco-avpair=dst-gw-name=
44179312622020
cisco-avpair=dst-number-
in
=
44179312622020
cisco-avpair=dst-number-out=
44179312622020
h323-conf-id=a18a094e-630d-436b-ab3d-82ad11f8fa6e
h323-conf-id=a18a094e-630d-436b-ab3d-82ad11f8fa6e
h323-setup-time=
2017
-
09
-
12T12
:
18
:
26
.
100131
+
0300
h323-call-origin=originate
Time
:
12
.
09
.
2017
12
:
18
:
30
Packet type: Access-Request
Identifier:
201
Authenticator: {
54
F5
0C
3D
7F
FF
D8
B3
0A
EF
3C
91
5B
C4
C9
D1
}
Attributes:
User-Name=
79612170985
User-Password=�3ot�����g�� ZzT
NAS
-
IP
-Address=
192
.
168
.
103
.
98
NAS
-Port=
0
NAS
-Port-Id=
ISDN
3
/
0
:
D
:
14
Acct-Session-Id=a18a094e-630d-436b-ab3d-82ad11f8fa6e
NAS
-Port-Type=
44
Called-Station-Id=
79312622020
Calling-Station-Id=
79612170985
h323-conf-id=a18a094e-630d-436b-ab3d-82ad11f8fa6e
cisco-avpair=h323-call-type=outgoing
cisco-avpair=h323-ivr-out=transactionID:
1234
-
42232
h323-gw-id=
FREESW
h323-prompt-id=
79312622020
h323-call-origin=outgoing
Time
:
12
.
09
.
2017
12
:
18
:
30
Packet type: Access-Accept
Identifier:
201
Authenticator: {
E8
6C
BD
C2
6D
CF
ED
8D
49
DD
EC
45
93
83
F4
EF
}
Attributes:
Callback-Number=
192
.
168
.
103
.
100
h323-credit-amount=
499324
.
60
h323-credit-time=
8609044
h323-
return
-code=
0
Process time auth:
0
Time
:
12
.
09
.
2017
12
:
24
:
39
Packet type: Accounting-Request
Identifier:
228
Authenticator: {
76
4C
55
00
2B
5B
3F
D3
75
3C
6A
CE
46
20
E0
D0
}
Attributes:
NAS
-
IP
-Address=
192
.
168
.
103
.
98
NAS
-Port=
0
Acct-Status-Type=
2
Acct-Delay-
Time
=
0
Acct-Session-Id=e6889347-45b8-
4094
-a74a-014cdbb35ff2
Called-Station-Id=
44479312622020
Acct-Session-
Time
=
366
Login-Service=
0
Calling-Station-Id=
79612170985
cisco-avpair=h323-call-id=e6889347-45b8-
4094
-a74a-014cdbb35ff2
cisco-avpair=src-gw-ip=
192
.
168
.
103
.
100
cisco-avpair=src-gw-name=
79612170985
cisco-avpair=src-number-
in
=
79612170985
cisco-avpair=src-number-out=
79612170985
cisco-avpair=dst-gw-ip=
192
.
168
.
103
.
100
cisco-avpair=dst-gw-name=
44479312622020
cisco-avpair=dst-number-
in
=
44479312622020
cisco-avpair=pdd-time=
0
cisco-avpair=dst-number-out=
44479312622020
h323-conf-id=a18a094e-630d-436b-ab3d-82ad11f8fa6e
h323-setup-time=
2017
-
09
-
12T12
:
18
:
26
.
180100
+
0300
h323-call-origin=originate
h323-connect-time=
2017
-
09
-
12T12
:
18
:
28
.
420120
+
0300
h323-disconnect-time=
2017
-
09
-
12T12
:
24
:
34
.
560111
+
0300
h323-disconnect-cause=
10
Каждый пакет содержит информацию о NASе (NAS-Identifier и/или NAS-IP-Address), на основании которой RADIUS-сервер сопоставляет пришедший пакет NASу в модуле. При сопоставлении сначала производится поиск NASа с идентификатором, идентичным атрибуту NAS-Identifier пакета, затем, если результат отрицательный, идёт поиск NASа c IP-адресом, равным NAS-IP-Address. Если пришедшему пакету NAS не сопоставлен в radius.log, выводится ошибка NAS not found for Packet!!!.
Обмен сообщениями с каждым NASом шифруется определённым кодовым словом - секретом. Секрет должен совпадать для NASа в биллинге и для конфигурации самого NASа. При несовпадении секретов проверка пароля будет все время выдавать неверный результат, т.к. секрет используется в шифровании пароля.
Далее описана логика работы модуля . Большинство параметров описанных ниже ( h323-conf-id, h323-return-code, h323-credit-time, h323-credit-amount, Calling-Station-Id, Called-Station-Id) могут быть заменены в конфигурации NAS на другие. По умолчанию используются те, которые тут описаны.
Идентификатором соединения в пределах NASа для RADIUS-сервера выступает атрибут Acct-Session-Id. Обратите внимание, что он идентичен для всех пакетов в пределах сессии. NAS должен контролировать, чтобы в один момент времени одинаковый Acct-Session-Id не проставлялся в RADIUS-пакетах, относящихся к разным сессиям.
Для тех, кто переходит с модуля VoiceIP. Значения всех параметров по умолчанию остались такие же как в VoiceIP. Кроме одного : h323-conf-id заменен на Acct-Session-Id по умолчанию. Это можно исправить в конфигурации NAS-а.
Далее рассмотрим попакетно обмен данными между NASом и RADIUS-сервером по ходу соединения.
1. AUTHENTICATION_REQUEST
Запрос авторизации отправляется NASом RADIUS-серверу и содержит помимо идентификационной информации соединения, указанной выше, информацию, идентифицирующую пользователя. Возможна идентификация пользователя по номеру звонящего(Calling-Station-Id), логину и паролю (запрашивает IVR) или любому другому атрибуту, режим поиска настраивается на NAS.
При наличии пароль шифруется по алгоритму PAP с использованием секрета. При некорректном секрете пароль в PAP-режиме не расшифровывается и отображается в radius.log и в мониторе ошибок не в том виде, в котором был введён пользователем.
Передаётся последовательно два запроса авторизации. Первая авторизация передаётся до набора номера и содержит только идентифицирующую пользователя информацию.
Вторая авторизация высылается в случае успеха первой и содержит набранный номер, атрибут Called-Station-Id.
2. AUTHENTICATION_REJECT
Отказ в авторизации, код ошибки авторизации передаётся дополнительно в атрибуте h323-return-code. Детальную причину отказа в авторизации пользователя можно посмотреть в Мониторе модуля в режиме ошибок. Код ошибки авторизации указанный в квадратных скобках в мониторе совпадает со значением, передаваемым в атрибуте. Значение атрибута может быть использовано IVR системой для озвучивания причины ошибки.
3. AUTHENTICATION_ACCEPT
Пользователь авторизован.
Для первой авторизации это означает что он идентифицирован, пароль введён верно (если есть), остаток на балансе положителен, тариф установлен и т.п. В атрибутах передаётся h323-return-code=0 (нет ошибок) и h323-credit-amount=<остатку счета>.
При второй авторизации это означает, что верны все условия первой авторизации, а кроме того на набранный номер есть цена в тарифе. Дополнительно к атрибутам первой авторизации передаются атрибут h323-credit-time=<на сколько секунд разговора хватает баланса пользователя>. Значение данного атрибута ограничивается сверху значением переменной voip.max.time конфигурации модуля.
Дополнительно в AUTHENTICATION_ACCEPT могут передаваться атрибуты, указанные в конфигурации типа логина (см. далее).
4. ACCOUNTING_REQUEST START
Атрибут Acct-Status-Type для них равен 2. Данный тип запросов передаёт на RADIUS-сервер информацию о старте соединения. Radius создает сессию, которая становится видна в в Мониторе модуля.
5. ACCOUNTING_REQUEST UPDATE
Атрибут Acct-Status-Type для них равен 3. Данный тип запросов передаёт на RADIUS-сервер информацию о текущем статусе соединения. Radius обсчитываем сессию, обновляет в ней время соединения и стоимость. Время соединения берется из атрибута Acct-Session-Time.
6. ACCOUNTING_REQUEST STOP
Атрибут Acct-Status-Type для них равен 2. Данный тип запросов передаёт на RADIUS-сервер информацию о завершении соединения. Время соединения берется из атрибута Acct-Session-Time.
7. ACCOUNTING_RESPONSE
Ответ RADIUS-сервера о том, что он получил запрос аккаунтинга(START/UPDATE/STOP) . Ответ не содержит никаких атрибутов.
Возможны схемы работы с учётом только accounting-пакетов( или даже только Stop пакетов), без авторизации. В этом случае RADIUS-сервер не может запретить звонок при отсутствии цены в тарифе.