AF
Asterisk Forum
обсуждения телефонии, VoIP и IP-PBX
12разделов
5 423тем
34 385сообщений
← К списку тем

Помогите понять технологию скрещивания asterisk+openser(kamailio)

OpenSER 13 сообщений -
#1

Помогите понять технологию скрещивания asterisk+openser(kamailio)


У меня уже просто рвет крышу, рытье по докам и сети помогает мало. Прошу помощи здесь.

Исходные данные такие:

Есть готовая работающая система на CallManager 4.1, к которой хочу добавить SIP-клиентов на kamailio/asterisk. Есть выход на PSTN через Cisco 5300. В рамках системы клиенты разграничены по правам, т.е. не все всем могут звонить.

Клиентов за NAT'ом не будет, все подключаются по VPN.

Планирю следующее:

kamailio принимает регистрации и работает load balancer'ом. Звонки должны проключаться, с учетом прав, заложенных в CallManager (тут я прекрасно понимаю, как это должно быть, так что фокусироваться на этом сильно не надо), на все возможные направления. Т.е. как внутри SIP-сети, так и на CallManager, и в PSTN. Кроме того, asterisk должен заведовать транскодингом, конференциями и, возможно, в будущем - голосовой почтой.

Разводка звонков на asterisk без балансировки уже обкатана и тут проблем как-бы нет. Транки с CallManager, с 5300, скрипт, который вытаскивает необходимые сведения с CallManager и либо разрешает проключать звонок на клиента, либо нет - работает.

А вот с балансировкой уже не могу понять, как это все увязать в единое целое. kamailio худо-бедно подкрутил в первом приближении, регистрации он принимает. И, если не отдавать звонки на asterisk, клиентов между собой соединяет. Но при отдаче звонка на asterisk (при этом хочу оставить kamailio на пути звонка, т.е. record_route()+t_relay()) я даже не вижу со стороны последнего попыток обработки; дело, похоже, даже до dialplan'а не доходит.

С техническими деталями как-нибудь разберусь. Прошу просветить по общему дизайну конкретными советами или подходящими ссылками. В частности, должен ли asterisk каким-то образом учитывать регистрацию от kamailio, или клиенты должны на нем регистрироваться? Если второе - то каким образом asterisk узнает, на какой IP отправлять INVITE?

В общем, даже толком не могу разобраться, какие вопросы задавать... Sad
#3

Конечно читал. Но именно о связке с *, тем более в условиях балансировки, там не сказать, чтобы очень уж много.
#5

Шуршал и по теме (конфиг слил - по мере возможнстей сверяюсь). kamailio тоже изучен подробно. Проблема в том, что везде - технические детали, подробности. Негде получить общую картину, в т.ч. - со стороны *.
#6

Цитата:
Негде получить общую картину, в т.ч. - со стороны *.

Не могу я этого понять. Значит SIP протокол темный лес для тебя. Читай книжки. Рано или поздно придет просветление.
#7

ZloMurz писал(а):
Рано или поздно придет просветление.


Не скажу, чтобы оно пришло, но полегче стало. Все-равно борьба больше напоминает поход слепого по минному полю... Wink

А вообще, не хочется заводить новую тему по этому вопросу - подниму пока эту. Какой модуль может при входящем звонке проверить регистрацию звонящего? Хочется, при необходимости (вдруг накладки какие случились, как с часовым поясом в соседней моей теме) провести принудительную авторизацию.
#8

Надо проверять при звонке зареган ли пир?
Тогда так
Код:

if (method=="INVITE") {

if (!proxy_authorize("","subscriber")) {
# Если получено сообщение INVITE, то мы должны отправить клиенту информацию,
# необходимую для дайджест авторизации. Если отправитель сообщения не может
# представить правильные данные дайджест авторизации, тогда сервер SER
# ответит сообщением с кодом ошибки 403.
#
# Обратите внимание: Этот пример требует того, чтобы вызывающий и вызываемый клиент
# были зарегистрированы на SIP маршрутизаторе. В будущих примерах мы подробнее
# остановимся на этом моменте, и покажем, как добавить "проверенные" SIP устройства,
# такие, как шлюзы в публичную телефонную сеть

proxy_challenge("","0");
return;
} else if (!check_from()) {
sl_send_reply("403", "Use From=ID");
return;
};

consume_credentials();


взято http://www.voip.rus.net/tiki-index.php?page=SER+and+NAT
#9

Это очевидный путь. В моем случае накладываются два момента. Первый я проверил почти случайно из-за разных часовых поясов на двух серверах. Клиент не зарегистрирован, прокси-авторизацию проходит - но в location-то он после этого не появляется. А по save("location") при каждом звонке в базу ложится новая запись о регистрации, что не есть хорошо.

Второй момент - asterisk, который тоже отправляет 407-й код - и тогда заваривается жуткая каша с обработкой нескольких последовательных INVITE.

Пока поглядываю в сторону reg_fetch_contacts из registrar. Вроде бы с ней можно сделать проверку на наличие регистрации и при необходимости завернуть на ветку www_auth/www_challenge.
#10

ZloMurz писал(а):
Надо проверять при звонке зареган ли пир?
Тогда так

Этот вариант не подходит! У меня часть звонков отбивалась!
Дело все в том, что INVITE приходит не один раз, а всякие re-INVITE сюда также попадают, вот на них иногда аудентификация и не проходит, а как результат -- разрыв соединения, причем со стороны телефона А. Телефон Б слушает тишину...

Added after 3 minutes:

Кстати, немного не в тему, но буду премного благодарен за способ авторизации звонка (не аудентификации UA, а именно авторизации самого вызова по номеру телефона).
Вариант -- делать это дальше, вместе с аккаунтингом, но только чем? У меня Quintum CallRelay ведет аккаунтинг, но вот авторизацию не смог прикрутить, что-то с radius'ом для этого не подружить.

_________________
Maksim Timofejev
#11

2 tma, не нашел какого-либо способа для авторизации вызова? Тоже проблема встала осуществления подобного.
#12

Код:
if (method=="INVITE") {
if (!proxy_authorize("domain","subscriber")) {
proxy_challenge("domain","0");
exit;
};
consume_credentials();
};


Использую вот такую конструкцию у себя, всё работает.
Не совсем понял чем плох вариант с proxy_authorize?
#13

ZloMurz писал(а):
не нашел какого-либо способа для авторизации вызова?

Здесь на формуе буквально недавно писали как.
Для меня это сейчас не актуально, но вскоре вновь понадобится -- вот тогда и буду разбираться.

_________________
Maksim Timofejev