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
<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>
<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
<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>
<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