Добрый день!
Подскажите как правильно описывать Trunk, чтобы разделять по каналам в Asterisk'е.
Допустим провайдер создал три учётные записи у себя.
0151*100
0151*101
0151*102
Я описал у себя их следующим образом:
[0151_100]
nat=never
dtmfmode=rfc2833
context=from-trunk
type=peer
insecure=invite
username=0151*100
fromuser=0151*100
secret=XXXXX
host=sip.provider.xxx
port=5060
promiscredir=yes
allow=alaw
allow=ulaw
allow=g729
[0151_101]
nat=never
dtmfmode=rfc2833
context=from-trunk
type=peer
insecure=invite
username=0151*101
fromuser=0151*101
secret=XXXXX
host=sip.provider.xxx
port=5060
promiscredir=yes
allow=alaw
allow=ulaw
allow=g729
[0151_102]
nat=never
dtmfmode=rfc2833
context=from-trunk
type=peer
insecure=invite
username=0151*102
fromuser=0151*102
secret=XXXXX
host=sip.provider.xxx
port=5060
promiscredir=yes
allow=alaw
allow=ulaw
allow=g729
строчки регистрации вида:
register=0151звезда100:XXXXX@sip.provider.xxx:5060/0151звезда100 register=0151звезда101:XXXXX@sip.provider.xxx:5060/0151звезда101 register=0151звезда102:XXXXX@sip.provider.xxx:5060/0151звезда102
Проблема в том что все входящие приходят в Trunk 0151_100:
[2012-03-19 10:33:13] VERBOSE[7003] pbx.c: -- Executing [0151*100@from-trunk:1] Set("SIP/0151_100-000006e5", "__FROM_DID=0151*100") in new stack
[2012-03-19 10:33:15] VERBOSE[7005] pbx.c: -- Executing [0151*101@from-trunk:1] Set("SIP/0151_100-000006e6", "__FROM_DID=0151*101") in new stack
[2012-03-19 10:33:25] VERBOSE[7013] pbx.c: -- Executing [0151*102@from-trunk:1] Set("SIP/0151_100-000006ed", "__FROM_DID=0151*102") in new stack
[2012-03-19 10:33:45] VERBOSE[7039] pbx.c: -- Executing [0151*101@from-trunk:1] Set("SIP/0151_100-000006f7", "__FROM_DID=0151*101") in new stack
[2012-03-19 10:34:16] VERBOSE[7103] pbx.c: -- Executing [0151*100@from-trunk:1] Set("SIP/0151_100-00000702", "__FROM_DID=0151*100") in new stack
[2012-03-19 10:38:22] VERBOSE[7400] pbx.c: -- Executing [0151*102@from-trunk:1] Set("SIP/0151_100-00000735", "__FROM_DID=0151*102") in new stack
[2012-03-19 10:38:47] VERBOSE[7418] pbx.c: -- Executing [0151*102@from-trunk:1] Set("SIP/0151_100-0000073b", "__FROM_DID=0151*102") in new stack
[2012-03-19 10:39:41] VERBOSE[7500] pbx.c: -- Executing [0151*100@from-trunk:1] Set("SIP/0151_100-00000751", "__FROM_DID=0151*100") in new stack
[2012-03-19 10:39:41] VERBOSE[7512] pbx.c: -- Executing [0151*101@from-trunk:1] Set("SIP/0151_100-00000752", "__FROM_DID=0151*101") in new stack
С помощью _FROMDID я отправляю на нужный внутренний канал, и в принципе всё работает. Но мне интересно понять, как правильно нужно описать Trunk'и, чтоб они корректно распределялись. С исходящими звонками проблем нет. Каждый идёт в свой Trunk.
Для чего это нужно: поставил FOP2 и там видны эти самые Trunk'и, и получаются что все входящие приходят на один Trunk, и это вызывает путаницу...
За ранее спасибо.
Астериск не сможет разделить эти транки если стоит insecure=invite. Единственный способ - использовать разные DID.
Тут подробнее http://igorg.ru/2012/02/22/sip-trank-neskolko-uchyotok/
Можно вылечить, только не совсем средствами Asterisk, а средствами iptables.
Что сделал я:
iptables -t nat -A OUTPUT -d 0.0.0.1 -j DNAT --to-destination --==ip-адрес сервера SIP==--
iptables -t nat -A OUTPUT -d 0.0.0.2 -j DNAT --to-destination --==ip-адрес сервера SIP==--
Что это даёт? Все исходящие пакеты на адрес 0.0.0.1 будут направляться на --==ip-адрес сервера SIP==--. Вроде бы ничего, НО! все ответы приходящие от сервера будут так же приходиться (как будто бы) с адреса 0.0.0.1 - это так работает механизм подмены адресов DNAT/SNAT из iptables. Это позволяет создать секцию типа type=peer по ip-адресу серверва соединений, который теперь всегда будет корректно назначаться именно тому каналу, который должен быть связан с этим IP.
Аналогично с 0.0.0.2.
Можно использовать любой удобный адрес, у меня шла настройка нескольких учётных записей мультифона, там адрес 193.201.229.35, я выбрал:
iptables -t nat -A OUTPUT -d 193.201.229.34 -j DNAT --to-destination 193.201.229.35
iptables -t nat -A OUTPUT -d 193.201.229.33 -j DNAT --to-destination 193.201.229.35
Соответственно необходимо подправить строчки регистрации на Asterisk, теперь в качестве сервера сипов надо будет указывать не адрес сервера, а то, что мы "подменяем" правильным адресом в iptables, то есть в моём примере регистрация идёт на 193.201.229.34 и 193.201.229.33 вместо 193.201.229.35 (это sbc.megafon.ru).
register => tcp://89xxXXXxxXX@multifon.ru:CoOlPaSsWd:89xxXXXxxXX@193.201.229.33:5060/my_ext1
register => tcp://89xxXXXxxXX@multifon.ru:CoOlPaSsWd:89xxXXXxxXX@193.201.229.34:5060/my_ext2
Лучшего решения я не нашёл.
Нужные настройки в секциях пиров sip.conf asterisk:
[xxx]
; симмка 89xxXXXxxXX с мультифона - SIP от мегафона
type=peer ; только пир - определение по ip адресу!!!
host=193.201.229.34 ; !!!!! этот адрес заменяется в iptables на правильный 193.201.229.35
insecure=port,invite ; обязательно так!!! Иначе входящий вызов не пройдёт!!!
context=incoming_calls ; контекст этот для входящих звонков, экстенжн указан в регистрации
fromuser=89xxXXXxxXX ; это нужно ТОЛЬКО для исходящих вызовов!!!
fromdomain=multifon.ru ; это нужно ТОЛЬКО для исходящих вызовов!!!
secret=xyz ; это нужно ТОЛЬКО для исходящих вызовов!!!
P.S. Чтобы iptables корректно обрабатывал преобразования необходимо использовать модули ip nat sip и ip conntrack sip (или nf nat sip и nf conntrack sip, вместо пробелов в названиях модулей - подчёркивания)
Проверить их наличие можно при помощи команды lsmod | grep sip, если они не загружаются автоматически, надо установить их загрузку в /etc/modules
Провайдер самый обычный. Провайдер этой подмены вообще не видит, всё происходит внутри стека сервера телефонии. Попробуйте у себя, поделитесь.
Валерий_ещё_один (Aug 31 '14)editЯ рад, что Вы фигнёй занимаетесь, но так-то тут люди для работы обычно пишут, про проблемы. Не мешайте.
Валерий_ещё_один (Aug 31 '14)editЯ просто хочу помочь всем, кто столкнулся с этой проблемой, разве это плохо? Пусть берут и пользуются. Никакого другого решения я больше не видел, да и судя по ответам авторов, они просто слили этот вопрос или забили на него. Что не так то?
Валерий_ещё_один (Sep 1 '14)editЕсли Вы считаете, что моё решение некорректно - объясните почему.
Укажите области (не-)применимости этого решения, если оно, с Вашей точки зрения, ограничено. Повторюсь ещё раз: нигде решения этой задачи я не видел, везде сливы и забивания.
Валерий_ещё_один (Sep 1 '14)editя вам обьяснил почему. по rfc необходимо брать информацию для авторизации из пакета,а не из адреса откуда занатилося. информация в пакете НЕ МЕНЯЕТСЯ в вашем "решении". потому это решение с точки зрения СТАНДАРТА протокола некорректно. иногда может работать. на тех провайдерах которых такие умные уже достали и они сделали на этот случай хак.
meral (Sep 1 '14)editДавайте я с Вами соглашусь. Это - неправильный подход, когда авторизация идёт по ip адресу, хотя она и предусмотрена в астериске. Правильный подход - авторизация по invite. Мультифон в инвайте мне шлёт в поле FROM: адрес звонящего. Есть адрес который можно использовать для авторизации в поле TO: - там указан телефон, куда идёт звонок. Собственно вопрос: каким образом сделать авторизацию корректной? match auth username = yes
Валерий_ещё_один (Sep 1 '14)editУ меня вот такие условия - астериск используется как шлюз звонков для службы такси, у меня руки связаны - я не могу убрать астериск, вся логика программы на этом висит. Один сип-провайдер даёт мне 2 транка, но у него 1 ip. В зависимости от того на какую линию пришёл звонок - должен включаться разный класс услуг в программе такси, это аксиомы под которые я должен подстроить астериск и программу такси. Да, я с Вами согласен, что неправильно авторизоваться по "подставленному" IP (и вообще авторизоваться по IP), но я вообще никак иначе авторизоваться при INVITE не могу, астериск не позволяет сделать это на тех условиях, в которых провайдер предоставляет телефонию - даже не используя iptables и conntrack - у меня в поле FROM телефон звонящего. Вы меня критикуете за "несоотвествие стандарту", но Вы вообще не предлагаете альтернативного варианта в этих условиях, это неконструктивный диалог.
Валерий_ещё_один (Sep 2 '14)editДва дня просматриваю логи по вечерам, вижу - провайдер в принципе не передаёт авторизацию в процессе передачи звонка (invite от сервера к asterisk, invite от asterisk к серверу, ack от сервера к астериску и тишина), и наконец меня озарило. Это же паранойя. Asterisk с точки зрения провайдера - это очередной СИП-телефон. Серверу СИП-провайдера слать пакеты с авторизацией на сип-телефон, который перед этим регался на сервере - абсурд. Всё правильно, type=peer - самое нужное тут. Если же очень сильно хочется всё-таки проверять, соответствует ли звонок регистрации, то можно назначить экстенжн с невероятным сложным именем, и проверять его во входящих.
Валерий_ещё_один (Sep 4 '14)editЗадан: Mar 19 '12
Просмотрен: 20,733 раз
Обновлен: Sep 01 '14
Проект компании "АТС Дизайн"
Asterisk® и Digium® являются зарегистрированными торговыми марками компании
Digium, Inc., США.
IP АТС Asterisk распространяется под лицензией
GNU GPL.