FreeSWITCH multi-tenant

[video]

Cuando tenemos varios clientes que envian poco trafico, es una buena idea colocarlos todos en el mismo equipo, el problema viene cuando queremos aplicar diferentes reglas de negocio para cada uno de ellos, se vuelve complicado el ruteo de llamadas y la separacion de trafico. pudiendo ocacionar problemas de ruteo (y cobro) de trafico de diferentes clientes.

Por esto es una buena opcion segmentar o particionar, un solo equipo de freeswitch entre varios clientes.

Dominios

Para este ejemplo usaremos los siguientes subdominios.

coca.dev4telco.mx
pepsi.dev4telco.mx

Coca Directory

coca.dev4telco.mx.xml

<include>
  <domain name="coca.dev4telco.mx">
    <params>
      <param name="dial-string" value="{^^:sip_invite_domain=${dialed_domain}:presence_id=${dialed_user}@${dialed_domain}}${sofia_contact(*/${dialed_user}@${dialed_domain})},${verto_contact(${dialed_user}@${dialed_domain})}"/>
      <param name="jsonrpc-allowed-methods" value="verto"/>
    </params>

    <variables>
      <variable name="record_stereo" value="true"/>
      <variable name="default_gateway" value="$${default_provider}"/>
      <variable name="default_areacode" value="$${default_areacode}"/>
      <variable name="transfer_fallback_extension" value="operator"/>
      <variable name="user_context" value="coca.dev4telco.mx"/>
    </variables>


    <groups>
      <group name="coca.dev4telco.mx">
	<users>
	  <X-PRE-PROCESS cmd="include" data="coca.dev4telco.mx/*.xml"/>
	</users>
      </group>
    </groups>

  </domain>
</include>

Pepsi Directory

/etc/freeswitch/directory# cat pepsi.dev4telco.mx.xml

<include>
  <domain name="pepsi.dev4telco.mx">
    <params>
      <param name="dial-string" value="{^^:sip_invite_domain=${dialed_domain}:presence_id=${dialed_user}@${dialed_domain}}${sofia_contact(*/${dialed_user}@${dialed_domain})},${verto_contact(${dialed_user}@${dialed_domain})}"/>
      <param name="jsonrpc-allowed-methods" value="verto"/>
    </params>

    <variables>
      <variable name="record_stereo" value="true"/>
      <variable name="default_gateway" value="$${default_provider}"/>
      <variable name="default_areacode" value="$${default_areacode}"/>
      <variable name="transfer_fallback_extension" value="operator"/>
      <variable name="user_context" value="pepsi.dev4telco.mx"/>
    </variables>

    <groups>
      <group name="pepsi.dev4telco.mx">
	<users>
	  <X-PRE-PROCESS cmd="include" data="pepsi.dev4telco.mx/*.xml"/>
	</users>
      </group>
    </groups>

  </domain>
</include>

Usuarios / extensiones

/etc/freeswitch/autoload_configs/acl.conf.xml

vane@coca.dev4telco.mx
vivi@coca.dev4telco.mx

angy@pepsi.dev4telco.mx
pame@pepsi.dev4telco.mx

Extensiones Coca

vane@pepsi.dev4telco.mx

<include>
  <user id="vane">
    <params>
      <param name="password" value="20240913"/>
      <param name="vm-password" value="1000"/>
    </params>
    <variables>
      <variable name="callgroup" value="coca"/>
    </variables>
  </user>
</include>


vivi@pepsi.dev4telco.mx

<include>
  <user id="vivi">
    <params>
      <param name="password" value="20240913"/>
      <param name="vm-password" value="1000"/>
    </params>
    <variables>
      <variable name="callgroup" value="coca"/>
    </variables>
  </user>
</include>

Extensiones Pepsi

angy@pepsi.dev4telco.mx

<include>
  <user id="angy">
    <params>
      <param name="password" value="20240913"/>
      <param name="vm-password" value="1000"/>
    </params>
    <variables>
      <variable name="callgroup" value="pepsi"/>
    </variables>
  </user>
</include>


pame@pepsi.dev4telco.mx

<include>
  <user id="pame">
    <params>
      <param name="password" value="20240913"/>
      <param name="vm-password" value="1000"/>
    </params>
    <variables>
      <variable name="callgroup" value="pepsi"/>
    </variables>
  </user>
</include>

SIP Profile

asas

<profile name="trunk">
  <aliases>
  </aliases>
  <gateways>
  </gateways>

  <domains>
    <domain name="all" alias="true" parse="false"/>
  </domains>

  <settings>
    <param name="debug" value="0"/>
    <param name="sip-trace" value="no"/>
    <param name="sip-capture" value="no"/>
    <param name="watchdog-enabled" value="no"/>
    <param name="watchdog-step-timeout" value="30000"/>
    <param name="watchdog-event-timeout" value="30000"/>
    <param name="log-auth-failures" value="false"/>
    <param name="forward-unsolicited-mwi-notify" value="false"/>
    <param name="context" value="dp_pepsicola"/>
    <param name="rfc2833-pt" value="101"/>
    <param name="sip-port" value="$${internal_sip_port}"/>
    <param name="dialplan" value="XML"/>
    <param name="dtmf-duration" value="2000"/>
    <param name="inbound-codec-prefs" value="$${global_codec_prefs}"/>
    <param name="outbound-codec-prefs" value="$${global_codec_prefs}"/>
    <param name="rtp-timer-name" value="soft"/>
    <param name="rtp-ip" value="192.168.5.234"/>
    <param name="sip-ip" value="192.168.5.234"/>
    <param name="hold-music" value="$${hold_music}"/>
    <param name="apply-nat-acl" value="nat.auto"/>
    <param name="apply-inbound-acl" value="domains"/>
    <param name="local-network-acl" value="localnet.auto"/>
    <param name="record-path" value="$${recordings_dir}"/>
    <param name="record-template" value="${caller_id_number}.${target_domain}.${strftime(%Y-%m-%d-%H-%M-%S)}.wav"/>
    <param name="manage-presence" value="true"/>
    <param name="presence-hosts" value="$${domain},192.168.5.234"/>
    <param name="presence-privacy" value="$${presence_privacy}"/>
    <param name="inbound-codec-negotiation" value="generous"/>
    <param name="tls" value="$${internal_ssl_enable}"/>
    <param name="tls-only" value="false"/>
    <param name="tls-bind-params" value="transport=tls"/>
    <param name="tls-sip-port" value="$${internal_tls_port}"/>
    <param name="tls-passphrase" value=""/>
    <param name="tls-verify-date" value="true"/>
    <param name="tls-verify-policy" value="none"/>
    <param name="tls-verify-depth" value="2"/>
    <param name="tls-verify-in-subjects" value=""/>
    <param name="tls-version" value="$${sip_tls_version}"/>
    <param name="tls-ciphers" value="$${sip_tls_ciphers}"/>
    <param name="inbound-late-negotiation" value="true"/>
    <param name="nonce-ttl" value="60"/>
    <param name="auth-calls" value="$${internal_auth_calls}"/>
    <param name="auth-subscriptions" value="true"/>
    <param name="inbound-reg-force-matching-username" value="true"/>
    <param name="auth-all-packets" value="false"/>
    <param name="ext-rtp-ip" value="192.168.5.234"/>
    <param name="ext-sip-ip" value="192.168.5.234"/>
    <param name="rtp-timeout-sec" value="300"/>
    <param name="rtp-hold-timeout-sec" value="1800"/>
    <!--
    <param name="force-register-domain" value="$${domain}"/>
    <param name="force-subscription-domain" value="$${domain}"/>
    <param name="force-register-db-domain" value="$${domain}"/>
    -->
    <param name="ws-binding"  value=":5066"/>
    <param name="wss-binding" value=":7443"/>
    <param name="challenge-realm" value="auto_from"/>
  </settings>
</profile>

Coca Dialplan

<include>
  <context name="coca.dev4telco.mx">
  </context>
</include>

Pepsi Dialplan

<include>
  <context name="pepsi.dev4telco.mx">
  </context>
</include>

Conclusión

Freeswitch nos permite separar el trafico por dominios, esto facilita la aplicaciones de reglas de ruteo y separacion de trafico en equipos compartidos por varios clientes, para mas información se recomienda consultar la  documentacion oficial de freeswitch.


Julio Carranza