uac_auth cseq increase Решение solve
Авторизация при помощи uac_auth имеет недостаток.
Она не генерирует новый CSEQ. в результате чего некоторые девайсы орут мол закольцовка . Loop Detected.
Решение было найдено из документации и выглядит оно мягко говоря не очень, особенно если нарисовать схему:
А -> Proxy1 -> b2b -> Proxy1 -> sbc.megafon.ru.
Почему нужно посылать звонок обратно в прокси, а не сразу в мегафон?
Да можно сразу в Мегафон, вот только инфу о таком звонке вы потеряете. Более того, вы не сможете сделать фейловер для Мегафона.
После того как я посмотрел на это решение, меня охватило уныние ибо не красиво. Взялся за третий способ и вот он-то и привел к желаемому результату. Хотя для этого используется стороннее ПО: SEMS все же этот SEMS очень хороший инструмент для opensips.
1. Способ описанный в письме Богданом: http://opensips.org/pipermail/users/2010-January/010215.html
> I’m trying to authenticate a UAC phone with a third party SIP to
> PSTN gateway, while having OpenSIPS in between. The gateway rejects
> repeated INVITEs with the same cseq number. The situation is quite
> typical, so I’m sure that OpenSIPS provides a way to solve this
> problem, no?
>
OpenSIPS itself no (as said, it cannot change elements that are defining
the dialog). But you may try a trick – when you receive the auth request
from the GW, ask the caller again for auth (from opensips), so that the
caller will generate a new proper INVITE you can use for auth. Shortly,
instead of the generating the second INVITE on opensips, force the
client (in whatever way) to generate it (to have proper cseq) and you
simply attach the credentials to the new INVITE when sending it to
GW…..just an idea, never tried it 🙂
В этом способе говорится о том, точбы заставить UAC отправить новый invite и пофиг каким способом это вы сделаете. Я этого способа не нашел, наверняка он очень простой.
2. Способ использовать b2b_uac. Но здесь возникает вопрос, а сможет ли вообще b2b Это сделать. Будем проверять….
способ оказался рабочий, но остается проблема с медиа_прокси.
Пока разбирался как работают сценарии, оказалось, что необходимый нам сценарий крайне прост. Прям вот вообще, выглядит так:
<scenario id=”b2b_test” name=”MS start and end” param=”1″ type=”script”>
<init>
<bridge>
<server>
<id>server1</id>
</server>
<client>
<id>client1</id>
<type>message</type>
<destination>
<value type=”param”>1</value>
</destination>
</client>
</bridge>
<state>1</state>
</init>
</scenario>
приведу выедржку из конфига:
loadmodule “b2b_entities.so”
loadmodule “b2b_logic.so”
modparam(“b2b_entities”, “db_mode”, 0)
modparam(“b2b_entities”, “script_req_route”, “b2b_request”) #request recieved
modparam(“b2b_entities”, “script_reply_route”, “b2b_reply”) #reply recieved
modparam(“b2b_logic”, “db_mode”, 0)
modparam(“b2b_logic”, “script_scenario”, “/usr/sipcolor/etc/opensips/b2b_test.xml”)
3. Работа с SEMS я решил скачать исходники 1.5 и скомпилировать только то что мне нужно, а именно CORE и SBC приложение.
Работа по компиляции уперлась в недостающие библиотеки, которые в принципе были легко установленны. На одной из систем возникла ошибка при компиляции исполняемого файла: pthread_cancel.
лечится добавлением ключа -pthread к компилятору. в Makefile.defs.
Всегда устанавливаю приложения в свои папки типа /usr/isp через префикс “make prefix=/usr/isp”. Так очень удобно искать файлы самого приложения.
UDP: в коде SEMS плагине uac_auth есть проверка на метод шифрования проверяется на MD5 и если вам прровайдер пришлет в нижнем регистре буквы md5 то хрен вам а не авторизация. патчится легко в файлике модуля.
Итак установили. Ниже приведу выдержки из трех файлов sems.conf, sbc.conf, auth_b2b.sbcprofiles.conf
sems.conf: Здесь главное указать какое приложение запускать я указал sbc.
…
# example for announcement with only g711 and ilbc codecs
# load_plugins=wav;ilbc;announcement
load_plugins=wav;isac;l16;gsm;ilbc;uac_auth;sbc
…
# examples:
# application = conference
# application = $(mapping)
# application = $(ruri.user)
# application = $(ruri.param)
# application = $(apphdr)
application = sbc
…
sbc.conf: необходимо указать профайлы для приложения sbc.
# profiles – comma-separated list of call profiles to load
#
# .sbcprofile.conf is loaded from module config
# path (the path where this file resides)
profiles=auth_b2b
# active call profile – comma separated list, first non-empty is used
#
# o active_profile=<profile_name> always use <profile_name> #
# o active_profile=$(ruri.user) use user part of INVITE Request URI
#
# o active_profile=$(paramhdr) use “profile” option in P-App-Param header
#
# o any replacement pattern
#
active_profile=auth_b2b
…
auth_b2b.sbcprofiles.conf: настройка самого модуля авторизации, кстати этот модуль на данный момент имеет ограничение: в него нельзя передать прокси сервер, если вам нужно иметь разные домен и прокси куда посылать запрос. next_hop можно указать только один. в связи с этим для авторизации на двух провайдеров придется пока запустить две копии SEMS.
UDP: посылается звонок на разных провайдеров очень просто, active_profile указывается $M($rU=>ruri_map),refuse , где ruri_map файлик соответствий номера с диалпланом, также можно сделать файлик соответствий IP входящего звонка и т.д. очень, очень гибко усе.
…
RURI=sip:$rU@todomain.ru
#From=””$P(u)” <sip:$P(u)@$P(d)>”
#To=””$rU” <sip:$rU@$P(d)>”
From=”<sip:name@fromdomain.ru>”
To=”<sip:$rU@todomain.ru>”
## routing
# outbound proxy:
#outbound_proxy=sip:79.170.27.75:5067
# force outbound proxy (in-dialog requests)?
#force_outbound_proxy=yes
# destination IP[:port] for outgoing requests
next_hop=proxy.forauth.ru
enable_auth=yes
auth_user=”02345234524″
auth_pwd=”1PвапрвапрвапрlX”
…
Запуск SEMS командой: /usr/isp/sbin/sems -f /usr/isp/etc/sems/sems.conf
и смотрим syslog для анализа того что происходит во время вызова, кстати, лог у SEMS просто отличный!
Load Balancing SIP
UAC – > LB -> (PROXY1 | PROXY2 | … ) -> UAS
Задача: раскидать звонки между sip proxy, сначала на PROXY1, в случае его недоступности на PROXY2.
В идеале если хочется распределять нагрузку между несколькими прокси серверами, то нужно делать LB в режиме stateless (использовать функцию forward() совместо с модулем dispatcher) однако в таком случае нет возможности сделать failover в случае падения одного из проксей, т.к. response нельзя поймать в отдельный блок. (хотя возможно разместив код в разделе onreply_route… надо будет проверить).
Сначала учтем ситуацию что в сообщении уже содержится route и вызовем функцию loose_route. без нее вы рискуете на некоторых звонках, это зависит от вашего окружения, получить зацикливание сообщений ACK. Нужно обязательно проверить, чтобы loose вызывался для ACK сообщений и участвующих в диалоге, а не для первых сообщений в диалоге, т.к. это может привести к пробеганию через ваш прокси трафика на чужие сервера, либо на поставщиков услуг, что страшнее, т.к. это сразу минус бабки.
Ниже представлен конфиг:
request_route {
if (loose_route()) { #Если сообщение содержит Route: то функция выдаст 1. Если его там нет, то 0. Здесь мы проверяем, есть ли в сообщении Route и если да, то…
xlog(“L_INFO”,”ACK TRansported…”); #Выводим в лог любую хрень полезную для понимания
t_relay(); #Оправляем сообщение согласно этому заголовку Route.
exit; #Завершаем выполнение скрипта, т.к. больше LB делать ничего не надо.
}
if (!ds_select_domain(“1”, “8”)) # Здест мы пользуемся функцией которая выберет для нас адрес прокси (proxy1) и подставит его в URI (первая строчка в SIP сообщении)
{
xlog(“L_ALERT”,”404 No route $ru”); # ВЫводим в лог сообщение елси ни один из проксей не доступен.
send_reply(“404″,”No route”); #Посылаем “клиенту” 404 сообщение, мол, нет возможности отправить вызов.
exit; # Завершаем скрипт
} else {
t_on_failure(“RTF_DISPATCH”); # Если таки прокси для сообщения определен, то привязываем ответ к разделу “RTF_DISPATH”, там мы поймаем ответ, и если он говорит о проблеме с прокси, то отправим сообщение на другой прокси.
xlog(“L_ALERT”,”Passed dispatcher $ru via $du $rm”); # Запишем в лог информацию о том, что сообщение будет отправленно на $ru.(при вызове функции ds_select_domain $ru меняется на новый
route(RELAY); # собственно отправляем сообщение в раздел где оно отправится к $ru.
}
}
| Posted in Без рубрики, Готовые решения | No Comments »
call_control cdrtool maxsessiontime
При работе функции Maxsessiontime система упорно не подгружает указанный лимит для пользователя
Причина кроета в код rating.php район строчки 8577:
if (!preg_match(“/^0/”,$CDR->CanonicalURINormalized)) {
$log=sprintf (“MaxSessionTime=unlimited Type=prepaid CallId=%s BillingParty=%s DestId=None”,$NetFields[‘callid’],$CDR->BillingPartyId);
syslog(LOG_NOTICE, $log);
$this->logRuntime();
$ret=”none”.”\n”.”type=prepaid”;
return $ret; }
Если Зачем искать в номере начало на 0 – решительно не понятно…. иметь ввиду.
call_control opensips application
При установке call_control возникает error: ‘Request’ object has no attribute ‘application’
Понятно, что где-то не передается свойства application. Исправляется таким способом:
заходим в sip.py из дистрибутивов
и self.application = “audio”
это конечно решение как говорится “влоб”, понятно что хорошо бы настроить передачу этого свойства от радиуса но мы этого делать не будем.
Ubuntu SYSLOG LOCAL0
При настройке на Ubuntu вывода syslog0 в отдельный файлик, например opensips.log, что является очень удобным никак не удававалось перенаправить собственно поток по FACILITY LOCAL0 в opensips.log.
а) не работает рестарт службы rsyslog
б) в отдельный файл конфиг не выливается
Успех случился, только после того как скопировал файл syslog в opensips.log и служба перезапускалась вот таким вот варварским способом
ps ax | grep syslog
kill XXX
где XXX Id процесса rsyslogd.
ну понятно строка конфига стандартная: local0.* -/var/log/opensips.log
1.08.2013Номера в городах России
Получили таблицу стоимости городских номеров.
Появился список городов в которых можно приобрести номер для рекламных целей. Подключение номера 5-7 дней. Переадресация выставляется на любой Ваш номер.
Для заказа 100@yooxy.ru или по телефону +7 351 7502213.
| Город | Стоимость | Аб. плата |
| Архангельск | 950 | 590 |
| Астрахань | 950 | 590 |
| Барнаул | 950 | 590 |
| Владивосток | 2850 | 590 |
| Волгоград | 950 | 590 |
| Воронеж | 1900 | 590 |
| Екатеринбург | 950 | 590 |
| Ижевск | 950 | 590 |
| Иркутск | 950 | 590 |
| Казань | 950 | 590 |
| Калининград | 950 | 590 |
| Кемерово | 950 | 590 |
| Краснодар | 950 | 590 |
| Красноярск | 950 | 590 |
| Минеральные Воды | 950 | 590 |
| Москва | 950 | 590 |
| Мурманск | 950 | 590 |
| Нижний Новгород | 950 | 590 |
| Нижний Тагил | 950 | 590 |
| Новосибирск | 950 | 590 |
| Омск | 950 | 590 |
| Оренбург | 950 | 590 |
| Пермь | 950 | 590 |
| Петропавловск-Камчатский | 2850 | 590 |
| Ростов-на-Дону | 950 | 590 |
| Рязань | 1900 | 590 |
| Самара | 950 | 590 |
| Санкт-Петербург | 950 | 590 |
| Саратов | 950 | 590 |
| Сочи | 950 | 590 |
| Ставрополь | 950 | 590 |
| Сургут | 1140 | 590 |
| Тверь | 1900 | 590 |
| Тольятти | 950 | 590 |
| Томск | 950 | 590 |
| Тула | 1900 | 590 |
| Тюмень | 1140 | 590 |
| Ульяновск | 950 | 590 |
| Уфа | 950 | 590 |
| Хабаровск | 2850 | 590 |
| Челябинск | 950 | 590 |
| Южно-Сахалинск | 2850 | 590 |
| Якутск | 2850 | 590 |
| Ярославль | 1900 | 590 |
| Posted in Городские номера, Готовые решения | No Comments »
Multifon, мультифон не работает… входящих нет

Сегодня после 9 утра по Московскому времени перестал работать Мультифон. Не принимает входящие вызовы, исодящие делает. Всё, что смог сделать оформить заявку в технической поддержке, в которой мне сообщили что обращения с подобными проблемами уже были специалистам заявка будет передана.
Всем кто столкнулся – терпения.
52274924
2.07.2013Грязный хак
Возникла необходимость по времени делать переадресацию с одного номера на другой. В рамках opensips эта прямо скажем не его задача. Но как оказалось в рамках нескольких десятков клиентов эта задача вполне под силу и opensips.
Заводим в крон скрипт который модифицирует таблицу dialplan так как нам нужно. просто прямым запросом. Естественно это придется делать для каждого клиента.
Привет.
21.04.2013Переезд на 1.9 с 1.7.2
Из-за частых проблем с памятью и не желанием с ними бороться переехал на версию 1.9. Не скажу что задача сложная, несколько часов времени. большое желание переписать конфиг с его логикой.
Но в итоге все базы обновил, заполнил, все вертится на новье.
Большой минус в новой панели у модуля dialplan у меня web не заработал – скопировал со старой версии и удалил в некоторых частях ссылки на match_len – этого столбца в новой таблице диалплана – нет.
Привет.
2.04.2013Userblacklist / GlobalBlack list
Реализация Чернго и белого списка на opensips.
Достаточно триавиальная задача, но есть несколько ньюансов,прежде всего нужно понять по какой схеме мыбудемблокировать польователя, они могут быть разными. Мне нужно было реализовывать черные и белые списки относительно входящих звонков на номера,поэтому логика такая:
1) проверка набранного номера на наличие в глобальном блэклисте, Если есть то смерть, если нет,то далее….
2) проверим пользовательский черный список, если набранный номер есть, то проведем сверку с колонкой prefix поля from, и в зависимости от значения whitelist либо дадим звонку идти дальше либо выставим запрет.
сам код:
### Глобальный Черный список
if (!check_blacklist(“globalblacklist”)) {
xlog(“For $ru globalblack list Active…”);
$avp(is_in_blacklist) = “1”;
sl_send_reply(“403”, “Forbidden BlackListed”);
exit;
}
if (!check_user_blacklist(“$rU”, “$fd”, “$fU”)) {
sl_send_reply(“403”, “Forbidden BlackListed”);
xlog(“User Black listed $fu -> $ru”);
exit;
} else {
xlog(“User white list active for $fu to $rU”);
}
Обратите внимание на параметры к функции check_user_blacklist . Изменен порядок, так чтобы пользователем являлся набранный номер, а префикс применялся к АОНу т.е. номеру звонящего или проще говоря полю FROM.
Для понимания ссылка на то как выгядит сам список.