FreeSwitch: настройка SIP gateway и маршрутизации

Настройка Sip_profiles (транспорта) и gateways (транков). Входящая и исходящая маршрутизация. Примеры и комментарии.

Gateway basics

Gateway configurations

Допустимые параметры для gateway:

  • register - например false, когда вы не хотите регистрироваться, но для вызова нужна авторизация на шлюзе, или вызов авторизуется по ACL.
    • true или false
  • schema - Оставить пустым (Digest по умолчанию).
    • Digest
  • realm - область авторизации, в некоторых случаях удаленный сервер может требовать этот параметр.
    • realm name
  • username - Авторизация от имени заданного пользователя, только если from-user не задано.
    • username
  • auth-username - имя пользователя для исходящей регистрации
    • username
  • password - просто пароль
    • password (vEry&stRoNg8paSs)
  • caller-id-in-from - брать CallerId из заголовка From: или нет.
    • true или false
  • extension - Контакт, будет использован как DID удаленной стороной.
    • extension (12345)
  • extension-in-contact - посылать extension в SIP Contact header.
    • true или false (default)

extension-in-contact пример

extension-in-contact пример

value="false"
Contact: <sip:gw+GATEWAY_NAME@REMOTE_SERVER;transport=udp;gw=GATEWAY_NAME>
value="true"
Contact: <sip:USERNAME@REMOTE_SERVER;transport=udp;gw=GATEWAY_NAME>

Anthony Minessale says:

I added the param extension-in-contact (true/false) to latest trunk.

Be aware it's broken behavior for your provider to demand a certain username in the contact. The reason we put gw+<gateway name> in the contact user is it's the only guaranteed way to find out what gateway the call was associated with. We can of course put it in the params on the contact but we know many sip endpoints eat off all the params from your contact when you register. So we use the contact user to avoid this issue. If you use this new parameter and set it to true, the contact will be whatever is in the «extension» parameter which defaults to the same as the username, so just setting this parameter should do what you want but it will also disable our ability to associate the call with the gateway it was placed from.


  • proxy - если не задано, будет использовано gateway name.
    • адрес|имя удаленного сервера
  • context - контекст для входящих вызовов.
    • context
  • expire-seconds - как часто посылать запрос на регистрацию register по умолчанию 3600, если не задано другое.
    • seconds
  • retry-seconds - как часто повторять попытки регистрации при неудаче.
    • seconds
  • from-user - имя пользователя используемое по умолчанию, если username не задано
    • username
  • from-domain - Домен в поле From.
    • domain
  • register-proxy - для тех случаев, когда у вас есть прокси-сервер на котором вы регистрируетесь и другой сервер для отправки вызовов, если это один и то же сервер - оставьте пустым.
    • proxy
  • contact-params -дополнительные параметры в поле Contact:. Например: tport=tcp.
    • param
  • register-transport - udp,tcp или tls если вкл. в профиле.
    • udp,tcp или tls

Простейший пример sip gateways и dialplan

 +---------------------+          +-----------------------+
 |    Extensions       |          |       Profiles        |
 |  ../conf/directory  |          |  ../conf/sip_profiles |
 +---------------------+          +-----------------------+
            |                                 |
            +----------+          +-----------+ 
                       |          |
                       V          V
                  +---------------------+
                  |      Contexts       |
                  |  ../conf/dialplan   |
                  +---------------------+

Подробнее о конфигурации sip_profiles и directory

Легенда

Значения использованные в примерах: данные шлюзов.

IP/domainGateway Name
192.168.0.252samsung
sip.itsp.comitsp
SIP транк (gateway) частной сети АТС.

../conf/sip_profiles/internal/samsung.xml

freeswitch
<include>
    <gateway name="samsung">
      <param name="username" value="samsung"/>
      <param name="password" value="register:false"/>
      <param name="proxy" value="192.168.0.252"/>
      <param name="register" value="false"/>
      <param name="context" value="default"/>
      <param name="caller-id-in-from" value="true"/>
    </gateway>
</include>

Если в параметре <param name="proxy" value="192.168.0.252"/> порт не задан, то используется 5060, по умолчанию.
Чтобы задать специфический порт SIP сигнализации, используйте форму записи: <param name="proxy" value="192.168.0.252:5077"/>

Так как gateway создан в sip_profileinternal, входящие вызовы из корпоративной АТС будут попадать непосредственно в контекст default и если пользователь с вызываемым номером существует, он будет вызван. Дополнительные правила входящей маршрутизации не требуются. Таким образом вы можете создать корпоративную телефонную сеть со сквозной нумерацией.

Поле <param name="caller-id-in-from" value="true"/> обеспечит передачу внутреннего номера из поля From: в качестве CallerID.

SIP gateway провайдера ( ITSP )

../conf/sip_profiles/external/itsp.xml

<include>
    <gateway name="itsp">
      <param name="username" value="itsp"/>
      <param name="password" value="12345"/>
      <param name="realm" value="sip.itsp.com"/>
      <param name="from-user" value="itsp_user"/>
      <param name="from-domain" value="sip.itsp.com"/>
      <param name="proxy" value="sip.itsp.com:5060"/>
      <param name="expire-seconds" value="800"/>
      <param name="register" value="true"/>
      <param name="retry-seconds" value="60"/>
      <param name="context" value="public"/>
      <param name="caller-id-in-from" value="false"/>
    </gateway>
</include>
Входящая маршрутизация из контекста Public

../conf/dialplan/public/00_inbound_did.xml

<include>
  <extension name="public_did">
    <condition field="destination_number" expression="^(7771000)$">
      <!--	  
	  $${domain} это домен FreeSwitch по умолчанию, назначенный в vars.xml.**
      --> 
      <action application="set" data="domain_name=$${domain}"/>
      <!-- этот пример направляет вызовы по  DID 7771000 на внутренний номер 1000 в контексте default -->
      <action application="transfer" data="1000 XML default"/>
    </condition>
  </extension>
</include>

<X-PRE-PROCESS cmd="set" data="domain=$${local_ip_v4}"/>
<X-PRE-PROCESS cmd="set" data="domain_name=$${domain}"/>

Устанавливает домен по умолчанию используемый FreeSWITCH, если другое не задано.
По умолчанию $${local_ip_v4}, т.е. IP сервера определенный FS по умолчанию.

Исходящая маршрутизация через gateway's

вводные данные маршрутизации

Набор Четырехзначных номеров в частную сеть АТС
цифрыexpressionextension name
2XXX^(2\d{3})$local.samsung

../conf/dialplan/default/01_samsung.xml

<include>
  <extension name="local.samsung">
    <condition field="destination_number" expression="^(2\d{3})$">
	<action application="set" data="effective_caller_id_name=${user_data(${username}@${domain_name} var effective_caller_id_name)}"/> 
	<action application="set" data="effective_caller_id_number=${user_data(${username}@${domain_name} var effective_caller_id_number)}"/> 
      <action application="bridge" data="sofia/gateway/samsung/$1"/>
    </condition>
  </extension>
</include>
Внешние вызовы через провайдера без префикса
цифрыextension name
XXXXXXXlocal.itsp
8[09]XXXXXXXXXmobile.itsp
8[1-8]X.inter.itsp

../conf/dialplan/default/01_itsp.xml

<include>
  <extension name="local.itsp">
    <condition field="destination_number" expression="^(\d{7})$">
     <action application="set" data="outbound_caller_id_number=${user_data(${username}@$${domain} var outbound_caller_id_number)}"/> 
     <action application="set" data="outbound_caller_id_name=${user_data(${username}@$${domain} var outbound_caller_id_name)}"/> 
      <action application="bridge" data="sofia/gateway/itsp/$1"/>
    </condition>
  </extension>
 
  <extension name="moble.itsp">
    <condition field="destination_number" expression="^(8[09]\d{9})$">
        <action application="set" data="outbound_caller_id_number=${user_data(${username}@$${domain} var outbound_caller_id_number)}"/> 
	<action application="set" data="outbound_caller_id_name=${user_data(${username}@$${domain} var outbound_caller_id_name)}"/> 
      <action application="bridge" data="sofia/gateway/itsp/$1"/>
    </condition>
  </extension>
 
  <extension name="inter.itsp">
    <condition field="destination_number" expression="^(8[1-8]\d+)$">
        <action application="set" data="outbound_caller_id_number=${user_data(${username}@$${domain} var outbound_caller_id_number)}"/> 
	<action application="set" data="outbound_caller_id_name=${user_data(${username}@$${domain} var outbound_caller_id_name)}"/> 
      <action application="bridge" data="sofia/gateway/itsp/$1"/>
    </condition>
  </extension>
</include>

Глобальная переменная ${outbound_caller_id_number} задается в файле vars.xml:

     <X-PRE-PROCESS cmd="set" data="outbound_caller_id_name=fs"/>
     <X-PRE-PROCESS cmd="set" data="outbound_caller_id_number=777777"/>

обычно требуется передать провайдеру callerID из вашего пула номеров, это можно сделать для каждого маршрута:

      <action application="set" data="effective_caller_id_number=8129981138"/>
      <action application="set" data="effective_caller_id_name=8129981138"/>

Переменная ${effective_caller_id_number} указывает непосредственно на поле From: из SIP заголовка вызывающего устройства.

Её можно заменить переменной заданной в настройках юзера — ../directory/default/user.xml<variable name="effective_caller_id_number" value="8129981138"/>,

получается при помощи команды ${user_data(${username}@${domain_name} var effective_caller_id_number)}

Внешние вызовы через провайдера через префикс "9".
префиксцифрыextension name
9XXXXXXXlocal.itsp
98[09]XXXXXXXXXmobile.itsp
98X.international.itsp
<include>
<extension name="local.itsp">
    <condition field="caller_id_number" expression="^397\d$"/>
    <condition field="destination_number" expression="^9(\d{7})$">
      <action application="set" data="effective_caller_id_number=8129981138"/>
      <action application="set" data="effective_caller_id_name=8129981138"/>
      <action application="bridge" data="sofia/gateway/itsp/$1"/>
    </condition>
  </extension>
 
  <extension name="mobile.itsp">
        <condition field="caller_id_number" expression="^397\d$"/>
    <condition field="destination_number" expression="^9(8[09]\d{9})$">
      <action application="set" data="effective_caller_id_number=8129981138"/>
      <action application="set" data="effective_caller_id_name=8129981138"/>
      <action application="bridge" data="sofia/gateway/itsp/$1"/>
    </condition>
  </extension>
 
  <extension name="international.itsp">
        <condition field="caller_id_number" expression="^397\d$"/>
    <condition field="destination_number" expression="^9(8\d+)$">
      <action application="set" data="effective_caller_id_number=8129981138"/>
      <action application="set" data="effective_caller_id_name=8129981138"/>
      <action application="bridge" data="sofia/gateway/itsp/$1"/>
    </condition>
  </extension>
 
</include>

Условие

 <condition field="caller_id_number" expression="^397\d$"/>

можно использовать для ограничения доступа к gateway.
В примере через данный gateway смогут звонить только номера 3970-3979.

См. также:

sc qc FreeSWITCH

FreeSWITCH

  • freeswitch/dp/fs_basic_gateways.txt
  • Последние изменения: 2022/09/05