Есть 2 FreeSwitch, один в Интернете на белом адресе, другой за NAT организации (да еще и без белого адреса, дальше еще NAT провайдера), которая просто дала попользоваться Интернетом. На внешнем сервере был создан extension для авторизации. Изнутри сети был создан транк на внешний сервер под этим юзером.
Звонки изнутри через транк наружу ходят. Основной вопрос как звонить обратно, внутрь сети через этот единственный коннект.
Проблема в том, что FreeSwitch по умолчанию не умеет делать полноценный inbound Trunk с отдельной авторизацией как asterisk по учетной записи и без указания статического адреса, во всех примерах или перенастраивают NAT или делают фильтр по IP, входящая авторизация привязана или к IP или к extension. И да, там fusionPBX, прямой доступ к xml есть только в диалплане.
Транк
изнутри сделан так:
<gateway name="MyTrunk-to-external">
<param name="username" value="1002"/>
<param name="password" value="****password"/>
<param name="realm" value="domain.domain"/>
<param name="proxy" value="domain.domain"/>
<param name="register-proxy" value="domain.domain"/>
<param name="expire-seconds" value="60"/>
<param name="register" value="true"/>
</gateway>
На
внешней АТС - просто extension.
Если я руками сделаю роут так на внешней АТС при звонке на внутреннюю АТС на номер 7000:
<condition field="destination_number" expression="^(70\d{2})$">
....всякие стандартные set......
<action application="set" data="callee_id_number=$1"/>
<action application="bridge" data="user/1002@${domain_name}"/>
</condition>
где 1002 - юзер, под которым изнутри коннектится транк, то звонки внутрь до АТС проходят, но строкой INVITE управлять не получается, приходит такое, номеров нет:
INVITE sip:gw+228322f9-ea66-48e4-b481-98a4bf2e185@10.101.36.23:5080;transport=tcp;gw=228322f9-66-48e4-b481-098a4bf2e185 SIP/2.0
Нашел, что можно пихать в строку разные параметры, например NPDI для таких случаев:
<action application="export" data="sip_invite_tel_params=rn=$1;npdi=yes"/>
тогда INVITE приходит хоть с какой то информацией о изначальном номере набора (поле rn=):
INVITE sip:gw+228322f9-ea66-48e4-b481-098a4bf2e185;rn=7000;npdi=yes@10.101.36.23:5080;transport=tcp;gw=228322f9-66-48e4-b481-098a4bf2e185 SIP/2.0
Так что можно сделать костыль и звонить на
внутренней АТС по полученному номеру RN вручную, так как freeswitch по дефолту не обрабатывает npdi:
<condition field="destination_number" expression="rn=(\d{4}\@?.*)">
<action application="transfer" data="user/$1@${domain_name}"/>
</condition>
Если выставить на на
внутренней АТС на транке параметр
<param name="extension-in-contact value="true"/>
, то в поле INVITE будет имя пользователя регистрации
( INVITE sip:1002;rn=7000....)
, если еще добавить
<param name="extension" value="7000"/>
то звонок просто будет приходить всегда на этот номер независимо от набранного номера...
Пробывал создать на
внешней АТС транк с привязкой к extension юзера, на который авторизуется внутренняя АТС
<gateway name="MyTrunk-to-external">
<param name="username" value="1002"/>
<param name="password" value="****password"/>
<param name="extension" value="1002"/>
<param name="realm" value="local.domain"/>
<param name="proxy" value="local.domain"/>
<param name="register-proxy" value="local.domain"/>
<param name="expire-seconds" value="60"/>
<param name="register" value="false"/>
</gateway>
но ожидаемо не заработал Bridge туда, отваливается по таймауту. Если proxy убрать или выставить 0.0.0.0 то тоже самое.
1 Как это сделать более правильно, чтоб непрограммист мог потом подключать такие транки и настраивать роутинг простыми путями, как с обычными транками а не через ковыряние костылей ?
2 Можно ли создать такой gateway именно на вход на внешней АТС чтоб к нему подключить просто по диалплану маршрутизацию?