Подключение к FREERADIUS. Часть 4
- Подключение к FREERADIUS. Часть 1
- Насторойка М-200
- Подключение к FREERADIUS. Часть 2
- Насторойка FREERADIUS
- Подключение к FREERADIUS. Часть 3
- Авторизация
- Подключение к FREERADIUS. Часть 4
- Маршрутизация
Взаимодействие М-200 - freeradius позволяет средствами сервера управлять маршрутизацией вызовов. В идеале можно предположить полный отказ от использования таблиц маршрутизации и переход на внешний обработчик вызовов. Но это слишком серьезная задача, чтобы описать ее в этой статье. Так что сейчас я просто покажу, что можно сделать с вызовом, используя rlm_perl.
Из того, что м-200 отправляет в запросе, нас интересуют следующие поля:
$RAD_REQUEST{'Calling-Station-Id'} $RAD_REQUEST{'Called-Station-Id'} $RAD_REQUEST{'h323-gw-id'}
- Calling-Station-Id - номер вызывающего абонента
- Called-Station-Id - номер вызываемого абонента
- h323-gw-id - точка входа
- для потоков содержит физический адрес порта в формате #xxxxxxxxx.
- для абонентов содержит значение NUMBERA.
Для управления маршрутизацией используются следующие поля:
$RAD_REPLY{'Calling-Station-Id'} $RAD_REPLY{'Called-Station-Id'} $RAD_REPLY{'Connect-Info'}
- Calling-Station-Id - номер вызывающего абонента
- Called-Station-Id - номер вызываемого абонента
Соответственно эти параметры могут быть переданы в станцию, например вот так:
if ($RAD_REQUEST{'Calling-Station-Id'} == '904') { $RAD_REPLY{'Called-Station-Id'} = "060"; $RAD_REPLY{'Calling-Station-Id'} = "3311554"; return RLM_MODULE_OK; }
Тестовый звонок:
SEIZ EXT<SIP>(904)$ CALL EXT<SIP>(904)$:6157 -> CallAuth_in(770:9)$:6205 [904,407] SEIZ CallAuth_out(1538:9)$ CALL CallAuth_out(1538:9)$:6206 -> INT_IP(769/13)$:6131 [3311554,443]
Как видно, CallAuth_out организует вызов с измененными номерами.
- Connect-Info
Для маршрутизации вызовов после прохождения авторизации используется таблица, к которой привязаны порты авторизации:
<geshi lang=smp lines=0>
AIR [3] { PROFIL = 24 // AIR TYPE = AIR_UNIFIED PORT [1-10] { PROFIL = 67 // SIG = SIG_CALLAUTH GROUP = 17 }
.............. GROUP [17] { ROUTE = 7 }
..............
ROUTE [7] { NAME = "Radius" RECORD "***" LOCAL }
</geshi>
В данном случае это ROUTE [7]. По этой таблице все 3-х значные номера рассматриваются как внутренние.
Если станция получает Connect-Info, вместо LOCAL будет использовано направление, которое передано этим параметром. Параметр может содержать:
- Название одного из существующих направлений. Только латинские буквы.
- физический адрес порта в формате #xxxxxxxxx.
Например, у меня есть направление ps:
<geshi lang=smp lines=0>
DIR [14] { NAME = "ps" 7 }
</geshi>
Тогда, я могу перенаправить 3-х значный вызов в другое направление:
if ($RAD_REQUEST{'Calling-Station-Id'} == '904') { $RAD_REPLY{'h323-credit-time'} = "h323-credit-time=1000"; $RAD_REPLY{'Connect-Info'} = "ps"; $RAD_REPLY{'Called-Station-Id'} = "060"; $RAD_REPLY{'Calling-Station-Id'} = "3311554"; return RLM_MODULE_OK; }
Тестовый звонок:
Коммутатор: SEIZ EXT<SIP>(904)$ CALL EXT<SIP>(904)$:6157 -> CallAuth_in(770:10)$:6207 [904,407] SEIZ CallAuth_out(1538:10)$ CALL CallAuth_out(1538:10)$:6208 -> INT_IP(769/14)$:6132 [3311554,060] МАЛ SEIZ INT_IP(772/14)$ CALL INT_IP(772/14)$:779 -> DSS1(1:3,out,,)$:7 [3311554,060]
Как видно, вызов ушел в поток.
Так же можно использовать физический адрес:
if ($RAD_REQUEST{'Calling-Station-Id'} == '904') { $RAD_REPLY{'h323-credit-time'} = "h323-credit-time=1000"; $RAD_REPLY{'Connect-Info'} = "#100001015"; $RAD_REPLY{'Called-Station-Id'} = "060"; $RAD_REPLY{'Calling-Station-Id'} = "3311554"; return RLM_MODULE_OK; }
Но первый путь предпочтительнее.
Вот вкратце и все. Надеюсь эти заметки будут кому-нибудь полезны.