Подключение к IP-PBX Asterisk телефонных номеров из Германии по SIP

Возникла производственная необходимость подключить к IP-PBX Asterisk прямые телефонные номера из Германии по SIP как для приема входящих звонков, так и для осуществления исходящих. Выбор пал на тамошних операторов ТСОП 1&1 и sipgate GmbH. Сразу оговорюсь, что не знаю, на каких условиях они предоставляют номера по SIP и какие документы для этого необходимы, поскольку организационные вопросы улаживались не мною. Я даже не владею немецким языком 🙂

1&1

В моем распоряжении оказалось три одноканальных телефонных номера: +49XXXXXXXXXX4, +49XXXXXXXXXX7 и +49XXXXXXXXXX8. Первым делом создаем для них peer’ы:

[49XXXXXXXXXX4]
type=friend
secret=XXXXXXXXXX
qualify=yes
nat=no
insecure=port,invite
host=sip.1und1.de
fromuser=49XXXXXXXXXX4
fromdomain=1und1.de
dtmfmode=auto
defaultuser=49XXXXXXXXXX4
context=1und1-de-did
canreinvite=no
disallow=all
allow=alaw,ulaw
accountcode=49XXXXXXXXXX4
transport=udp,tcp
encryption=no

[49XXXXXXXXXX7]
type=friend
secret=XXXXXXXXXX
qualify=yes
nat=no
insecure=port,invite
host=sip.1und1.de
fromuser=49XXXXXXXXXX7
fromdomain=1und1.de
dtmfmode=auto
defaultuser=49XXXXXXXXXX7
context=1und1-de-did
canreinvite=no
disallow=all
allow=alaw,ulaw
accountcode=49XXXXXXXXXX7
transport=udp,tcp
encryption=no

[49XXXXXXXXXX8]
type=friend
secret=XXXXXXXXXX
qualify=yes
nat=no
insecure=port,invite
host=sip.1und1.de
fromuser=49XXXXXXXXXX8
fromdomain=1und1.de
dtmfmode=auto
defaultuser=49XXXXXXXXXX8
context=1und1-de-did
canreinvite=no
disallow=all
allow=alaw,ulaw
accountcode=49XXXXXXXXXX8
transport=udp,tcp
encryption=no

Для регистрации на сервере SIP Proxy оператора ТСОП 1&1 необходимы следующие настройки:

register => 49XXXXXXXXXX4?udp://49XXXXXXXXXX4:XXXXXXXXXX@sip.1und1.de:5060/49XXXXXXXXXX4
register => 49XXXXXXXXXX7?udp://49XXXXXXXXXX7:XXXXXXXXXX@sip.1und1.de:5060/49XXXXXXXXXX7
register => 49XXXXXXXXXX8?udp://49XXXXXXXXXX8:XXXXXXXXXX@sip.1und1.de:5060/49XXXXXXXXXX8

Для приема входящих звонков в плане нумерации создадим упоминавшийся ранее при настройке соответствующих peer’ов SIP контекст 1und1-de-did. В моем случае происходит простая переадресация на внутренние номера абонентов IP-PBX Asterisk:

[1und1-de-did]
exten => 49XXXXXXXXXX4,1,Dial(Local/102@staff)
exten => 49XXXXXXXXXX4,n,Hangup()

exten => 49XXXXXXXXXX7,1,Dial(Local/103@staff)
exten => 49XXXXXXXXXX7,n,Hangup()

exten => 49XXXXXXXXXX8,1,Dial(Local/104@staff)
exten => 49XXXXXXXXXX8,n,Hangup()

К сожалению, после применения данных настроек все входящие звонки от оператора ТСОП 1&1, скорее всего, будут отвергаться вашей IP-PBX Asterisk. Дело в том, что 1&1 инициирует вызовы с IP-адресов отличных от хостов сервера SIP Proxy (sip.1und1.de), на которых происходит регистрация. Такие вызовы IP-PBX Asterisk автоматически классифицирует как гостевые и помещает в контекст по умолчанию default. Для решения данной проблемы необходимо включить прием гостевых звонков в файле настроек "sip.conf":

allowguest=yes

А контекст плана нумерации по умолчанию default должен включать в себя контекст 1und1-de-did. Для этого в файл настроек "extensions.conf" добавляем строки наподобие следующих:

[default]
include => 1und1-de-did

Необходимо подчеркнуть, что разрешение гостевых звонков и предоставление возможности подключения к IP-PBX Asterisk через публичный Internet по SIP создает серьезную угрозу: можно стать жертвой fraud’а. У IP-PBX Asterisk присутствует уязвимость, связанная с тем, что исходящие звонки могут осуществляться абонентами без регистрации на SIP Proxy. Таким образом, для доступа к МН/МГ-связи достаточно лишь угадать номер внутреннего абонента, что согласитесь несложная задача, поскольку планы нумераций большинства организаций, как правило, весьма тривиальны. Поэтому никогда не разрешайте в контексте по умолчанию default МН/МГ-звонки через общеизвестные методы набора: "0", "00", "7", "8", "9", "+". В противном случае вы рисуете очень быстро превратиться в бесплатный переговорный пункт для мошенников, что чревато получением счетов за МН/МГ-связь на огромные суммы 🙁 Не стоит надеяться на то, что ваш сервер никому не нужен и его никогда не найдут, это произойдет очень быстро.
Реализация исходящих звонков в Германию имела одну сложность. Необходимо было сделать так, что бы у вызываемых абонентов определялись разные номера ТСОП в зависимости от того, кто из внутренних пользователей инициировал звонок. Например, на тот случай, если вызываемый абонент не ответил, а впоследствии решил перезвонить по пропущенному номеру. Я решил эту задачу с помощью специального макроса:

[macro-Dial-1und1]
exten => s,1,Set(1und1-peer=49XXXXXXXXXX4)
exten => s,n,GotoIF($["${CALLERID(num)}" = "102"]?cid102)
exten => s,n,GotoIF($["${CALLERID(num)}" = "103"]?cid103)
exten => s,n,GotoIF($["${CALLERID(num)}" = "104"]?cid104)
exten => s,n(dial),Dial(SIP/${ARG1}@${1und1-peer},60,tTr)
exten => s,n,Hangup
exten => s,n(cid102),Set(1und1-peer=49XXXXXXXXXX4)
exten => s,n,Goto(dial)
exten => s,n(cid103),Set(1und1-peer=49XXXXXXXXXX7)
exten => s,n,Goto(dial)
exten => s,n(cid104),Set(1und1-peer=49XXXXXXXXXX8)
exten => s,n,Goto(dial)

exten => _0X.,1,Macro(Dial-1und1,${EXTEN})

Таким образом, в зависимости от того, кто из внутренних абонентов инициировал вызов, его звонок будет маршрутизироваться через разные peer’ы оператора 1&1, что обеспечит подстановку правильного номера ТСОП, который увидит вызываемый абонент.

sipgate GmbH

Настройки для sipgate GmbH отказались далеко не идентичны 1&1. Мне был предоставлен всего один SIP peer, но многоканальный с четырьмя номерами: +49XXXXXXXXXXXX20, +49XXXXXXXXXXXX22, +49XXXXXXXXXXXX23 и +49XXXXXXXXXXXX24. Конфигурация peer’а:

[sipgate-de]
type=friend
host=sipconnect.sipgate.de
outboundproxy=sipconnect.sipgate.de
port=5060
username=1234567t0
fromuser=1234567t0
defaultuser=1234567t0
fromdomain=sipconnect.sipgate.de
secret=XXXXXXXXXX
dtmfmode=rfc2833
insecure=port,invite
canreinvite=no
registertimeout=600
disallow=all
allow=alaw
allow=ulaw
transport=udp,tcp
encryption=no
qualify=yes
nat=no
context=sipgate-de-did
accountcode=sipgate-de

Регистрируемся на сервере SIP Proxy оператора ТСОП sipgate GmbH:

register => 1234567t0?udp://1234567t0:XXXXXXXXXX@sipconnect.sipgate.de:5060/sipgate-de

Оператор ТСОП sipgate GmbH в отличие от 1&1 ведет себя более корректно, т.е. инициирует вызовы с IP-адреса сервера SIP Proxy, поэтому соответствующие входящие звонки без каких-либо дополнительных ухищрений будут попадать в контекст плана нумерации sipgate-de-did. Создадим его:

[sipgate-de-did]
exten => 49XXXXXXXXXXXX20,1,Dial(Local/102@staff)
exten => 49XXXXXXXXXXXX20,n,Hangup()

exten => 49XXXXXXXXXXXX24,1,Dial(Local/103@staff)
exten => 49XXXXXXXXXXXX24,n,Hangup()

exten => 49XXXXXXXXXXXX23,1,Dial(Local/104@staff)
exten => 49XXXXXXXXXXXX23,n,Hangup()

exten => 49XXXXXXXXXXXX22,1,Dial(Local/105@staff)
exten => 49XXXXXXXXXXXX22,n,Hangup()

Опять все сводится к переадресации на внутренние номера абонентов IP-PBX Asterisk.
Самым сложным в настройке подключения к оператору sipgate GmbH оказалась подстановка разных номеров ТСОП в зависимости от того, кто из внутренних пользователей инициировал звонок. Проблема в том, что peer в нашем распоряжении всего один, а номера – два, в отличие от 1&1, где на каждый номер было по своему отдельному peer’у. Поэтому в случае sipgate GmbH указание номера ТСОП, который должен определяться у вызываемого абонента реализуется путем модификации полей SIP перед вызовом директивы плана нумерации Dial() в IP-PBX Asterisk:

[macro-Dial-sipgate-de]
exten => s,1,Set(sipgate-de-cid=49XXXXXXXXXXXX24)
exten => s,n,GotoIF($["${CALLERID(num)}" = "102"]?cid102)
exten => s,n,GotoIF($["${CALLERID(num)}" = "103"]?cid103)
exten => s,n,GotoIF($["${CALLERID(num)}" = "104"]?cid104)
exten => s,n,GotoIF($["${CALLERID(num)}" = "105"]?cid105)
exten => s,n(dial),Set(CALLERID(num)=${sipgate-de-cid})
exten => s,n,SipAddHeader(P-Preferred-Identity: )
exten => s,n,SipAddHeader(Diversion: <${sipgate-de-cid}@sipconnect.sipgate.de>)
exten => s,n,Dial(SIP/${ARG1}@sipgate-de,60,tTr)
exten => s,n,Hangup
exten => s,n(cid102),Set(sipgate-de-cid=49XXXXXXXXXXXX20)
exten => s,n,Goto(dial)
exten => s,n(cid103),Set(sipgate-de-cid=49XXXXXXXXXXXX24)
exten => s,n,Goto(dial)
exten => s,n(cid104),Set(sipgate-de-cid=49XXXXXXXXXXXX23)
exten => s,n,Goto(dial)
exten => s,n(cid105),Set(sipgate-de-cid=49XXXXXXXXXXXX22)
exten => s,n,Goto(dial)

exten => _49X.,1,Macro(Dial-sipgate-de,+${EXTEN})

Если же вы по какой-либо причине желаете скрыть свой номер, то можете воспользоваться следующей директивой:

SipAddHeader(Privacy: id)

В заключении хочу сказать, что со временем от услуг оператора ТСОП 1&1 пришлось отказаться. Начали поступать жалобы, что входящие звонки не проходят. IP-PBX Asterisk вообще никаких вызовов не видел. Анализ сетевого трафика с помощью сниффера выявил, что сообщения SIP INVITE иногда оказываются настолько велики, что не помещаются в 1480 байт дейтаграммы UDP, поэтому фрагментируются. Однако до сервера с IP-PBX Asterisk приходила только первая из них по порядку, а остальные части терялись. Естественно, невозможно найти крайнего, в ситуации, когда между нами и 1&1 находится несколько транзитных магистральных операторов глобальной сети Internet 🙁

Поделиться ссылкой:

Оставить комментарий


Примечание - Вы можете использовать эти HTML tags and attributes:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>