zhaohai1127@126.com / 2023-08-27
一般大型呼叫中心都有多个项目,不同项目需要分开计费。由于负载原因,不同项目往往使用不同的Freeswitch节点。Freeswitch在对接计费服务器时,可以通过设置不的主叫号码,在计费服务器中通过区分主叫号码来实现对不同项目计费。
计费服务器,一般需要对接外部或者第三方线路,因此计费服务器一般需要运行在公网ip地址上。Freeswitch对内部的呼叫中心职场提供服务,一般运行在内网中ip地址上,由此问题就产生了。
常规的配置,不同项目的多个Freeswitch直接对接计费服务器,配置较为复杂,本文提供一种方案,在Freeswitch和计费服务器之间增加一个代理服务器,从而简化不同项目的Freeswitch配置。
内网A项目Freeswitch -> |
内网B项目Freeswitch -> |代理服务器(多网卡) -> 公网计费服务器 内网C项目Freeswitch -> |
这里的代理服务器,实现b2bua的效果。语音流等媒体通过代理服务器实现二次转发。这里代理服务器通过Freeswitch实现,它同时运行在内网和公网,代理服务器的物理机有多个网卡。
把物理机的其中一个网卡配置一个公网IP地址,接入公网,最好和计费服务器在同一个公网网段; 再选择一个网卡配置内网IP地址,接入内网。
这里以内网A项目Freeswitch为例,假定它的IP地址是172.18.11.100
;
代理服务器的内网IP地址为172.18.11.250
,公网IP地址为36.31.121.188
;公网计费服务器IP地址为36.31.121.189
。
Freeswitch安装好之后,进入配置文件目录
cd /usr/local/freeswitch/conf/sip_profiles/
设置Freeswitch内网profile的配置,编辑internal.xml
文件,找到profile
下的settings
节点,修改或增加以下配置参数:
param name="sip-port" value="5060"/>
<param name="context" value="default"/>
<param name="rtp-ip" value="172.18.11.250"/>
<param name="sip-ip" value="172.18.11.250"/>
<param name="ext-rtp-ip" value="172.18.11.250"/>
<param name="ext-sip-ip" value="172.18.11.250"/>
<param name="accept-blind-reg" value="true"/>
<param name="accept-blind-auth" value="true"/>
<param name="auth-calls" value="false"/> <
以上参数,如果存在则修改,不存在则增加。172.18.11.250 是本机的内网IP地址。
设置Freeswitch公网网profile的配置,编辑external.xml
文件,找到profile
下的settings
节点,修改或增加以下配置参数:
param name="sip-port" value="5060"/>
<param name="context" value="public"/>
<param name="rtp-ip" value="36.31.121.188"/>
<param name="sip-ip" value="36.31.121.188"/>
<param name="ext-rtp-ip" value="36.31.121.188"/>
<param name="ext-sip-ip" value="36.31.121.188"/>
<param name="accept-blind-reg" value="true"/>
<param name="accept-blind-auth" value="true"/>
<param name="auth-calls" value="false"/> <
同样,以上参数,如果存在则修改,不存在则增加。 36.31.121.188 是本机的公网地址。
确保external.xml
中,profile
节点下存在以下配置:
gateways>
<X-PRE-PROCESS cmd="include" data="external/*.xml"/>
<gateways> </
接下来配置本机的外呼转发网关,在sip_profiles的external
文件夹创建gw.xml
文件,内容如下:
include>
<gateway name="gw">
<param name="realm" value="36.31.121.189:5060"/>
<param name="caller-id-in-from" value="true"/>
<param name="username" value="not-used"/>
<param name="register" value="false"/>
<gateway>
</include> </
如上所示,这里计费服务器地址是:36.31.121.189:5060。
设置内网呼入路由,接受从内网各个项目服务器发送过来的呼叫请求。编辑dialplan/default.xml文件:
<?xml version="1.0" encoding="utf-8"?>
include>
<context name="default">
<extension name="public_extensions">
<condition field="destination_number" expression="^(\d{3,15})$">
<action application="bridge" data="{absolute_codec_string='pcmu,pcma'}sofia/gateway/gw/$1"/>
<condition>
</extension>
</context>
</include> </
最后,重启Freeswitch。
进入Freeswitch控制台,通过指令sofia status
查看配置是否正常:
freeswitch@myserver> sofia status
Name Type Data State
=============================================================================================================
external profile sip:mod_sofia@36.31.121.188:5060 RUNNING (0)
internal profile sip:mod_sofia@172.18.11.250:5060 RUNNING (0)
external::gw gateway sip:0@36.31.121.189:5060 NOREG =============================================================================================================
通过判断external
和internal
的State
都为RUNNING (0)
,说明配置正常工作了。
内网服务器配置相对简单,只需要配置网关和拨号计划即可。网关地址指向代理服务器的内网IP地址。
include>
<gateway name="clientgw">
<param name="realm" value="172.18.11.250:5060"/>
<param name="register" value="false"/>
<param name="caller-id-in-from" value="true"/>
<param name="username" value="not-used"/>
<param name="password" value="not-used"/>
<gateway> </
然后设置分机的拨号计划,接受当前项目分机发送过来的呼叫请求。编辑dialplan/default.xml文件:
<?xml version="1.0" encoding="utf-8"?>
include>
<context name="default">
<extension name="public_extensions">
<condition field="destination_number" expression="^(\d{3,15})$">
<action application="bridge" data="{absolute_codec_string='pcmu,pcma'}sofia/gateway/clientgw/$1"/>
<condition>
</extension>
</context>
</include> </
最后,重启当前的Freeswitch实例。内网A项目服务器的地址是:172.18.11.100
。
座席端软电话注册到内网A项目服务器地址172.18.11.100
,然后拨号并发起外呼,此时可以查看计费服务器是否收到呼叫请求。如果有问题,可以同步打开代理服务器的Freeswitch控制台,并查看日志。
有人说,这里代理服务器之启动了一个实例,承受的负载有限呀。这里当然可以配置多个实例,sip-port设置不同,
同时配置好switch.conf.xml
中的rtp-start-port
和rtp-end-port
端口范围划分即可。
甚至还可以启动第3、4个网卡,设置为内网ip地址,这样网卡也可以实现负载平衡(:。
如果IP地址资源不够用的情况下,代理服务器的公网IP地址可以使用一个不存在的地址,即该IP地址没有被采购并分配到公司名下。 前提条件是,代理服务器的公网口需要和计费服务器在同一个交换机下,且代理服务器使用的公网IP地址和计费服务器的IP地址在同一个网段下。 配置好之后,注意检查从代理服务器到计费服务器,是否能相互PING通。
建议代理服务器和计费服务器都放置在硬件防火墙后面,同时尽量开启IP地址白名单。