В настоящее время самым доступным способом подключения к цифровой телефонии является использование протокола SIP. Даже средние компании при подключении часто используют более одного телефонного номера, либо количество каналов, привязанных к одному номеру не хватает и устраивается псевдо-серийный номер путем использования переадресации между несколькими SIP аккаунтами. Я хотел бы написать о небольших проблемах, которые несет в себе такой способ подключения, а так же о способах их решения. Необходимость такого разъяснения возникла после неоднократного появления на форумах типовых вопросов, на которые как правило многие «специалисты» дают неправильные ответы.
На данный момент реалии таковы, что многие операторы не могут вам предложить несколько SIP номеров в одном транке и выдают для каждого номера свои регистрационные данные. При этом успешно регистрируясь на сервере провайдера и успешно получая/отправляя вызовы можно не заметить каких-либо проблем, но важно их понимать. Однажды столкнувшись с проявлением такой проблемы и разобравшись с ней, вы можете сэкономить себе массу нервов, а так же будете яснее понимать что происходит в вашей сети.
Проблема:
При регистрации на сервере оператора ваш Астериск сообщает серверу провайдера свой IP адрес, а так же порт, где будет ожидаться соединение по SIP протоколу. При этом Астериск для нескольких учетных записей использует один и тот же порт. Далее работа настроенного транка делится на два типа: совершение исходящих и входящих вызовов. При совершении исходящих вызовов в команде Dial/msk1111111 указывается имя пира, для вызова используются соответствующие авторизационные данные. Пример конфигурации:
register=74951111111:xxx@myprovider.ru
register=74952222222:yyy@myprovider.ru[msk1111111]
username=74951111111
fromuser=74951111111
context=from-trunk1111111
type=friend
secret=xxx
insecure=invite
host=myprovider.ru[msk2222222]
username=74952222222
fromuser=74952222222
secret=yyy
context=from-trunk2222222
type=friend
insecure=invite
host=myprovider.ru
У многих существует иллюзия, что при входящем вызове так же произойдет авторизация по указанным логину и паролю, однако это не так (обратите внимание что при настройке транков вы повсеместно используете опцию insecure=invite). При поступлении входящего вызова авторизация не предусмотрена, поэтому поиск пира по имени пользователя и паролю невозможен. Однако поиск транка, по которому поступил вызов происходит и он отображается в наименовании входящего канала. Каким образом? По значению параметра host и port, а так как они одинаковы, то на какой бы номер вызов не поступил входящий вызов, всегда будет найден последний (поведение между версиями asterisk может отличаться) из пиров. В примере — это пир msk2222222.
Наблюдаемые аномалии:
- Если у пиров, с одним значением host, указаны различные контексты, то будет создаваться впечатление что астериск игнорирует контексты всех пиров, кроме последнего из указанных в конфигурационном файле.
- При входящем вызове, если завершение вызова идет со стороны астериска (например, сотрудник первым кладет трубку), то вызов не сможет завершиться нормально, пока звонящий самостоятельно не завершит вызов. При обычном диалоге эта проблема почти незаметна и изнутри компании не чувствуется — тишину вместо сигнала отбоя слышит звонящий, но если компанию будут осаждать автоинформаторы, такая проблема может стать серьезной — линии будут заняты и вы не сможете их освободить по своей воле.
Решение (способ1):
Игнорировать наличие проблемы, максимально компенсировать её наличие настройками. Вызовы ото всех аккаунтов, относящихся к одному серверу,принимать в едином контексте. Некорректное завершение вызова игнорируем, в первую очередь принимая вызовы через последний описанный в sip.conf аккаунт.
Решение (способ2):
Договориться с провайдером на передачу нескольких номеров по транку с единственной авторизацией, либо без регистрации вообще. Порой это бывает сложно сделать как технически, так и организационно.
Решение (способ3):
Использовать FreeSWITCH, для полной либо частичной замены Asterisk в такой ситуации. Этот способ решения позволяет сделать полностью технически верное решение для организации транка в такой ситуации. FreeSWITCH в отличии от Asterisk имеет возможность настройки нескольких SIP профилей, использующих различные порты и интерфейсы. При использовании данного решения настраивается несколько профилей, по количеству регистраций. В зависимости от CallerID исходящие вызовы маршрутизируются в диалплане FS.