广告 《大道至简,给所有人看的编程课》 🔥

《FreeSWITCH案例大全》

3.3 通过代理服务器实现Freeswitch和计费服务器的对接

zhaohai1127@126.com / 2023-08-27

3.3.1 背景及概述

一般大型呼叫中心都有多个项目,不同项目需要分开计费。由于负载原因,不同项目往往使用不同的Freeswitch节点。Freeswitch在对接计费服务器时,可以通过设置不的主叫号码,在计费服务器中通过区分主叫号码来实现对不同项目计费。

计费服务器,一般需要对接外部或者第三方线路,因此计费服务器一般需要运行在公网ip地址上。Freeswitch对内部的呼叫中心职场提供服务,一般运行在内网中ip地址上,由此问题就产生了。

常规的配置,不同项目的多个Freeswitch直接对接计费服务器,配置较为复杂,本文提供一种方案,在Freeswitch和计费服务器之间增加一个代理服务器,从而简化不同项目的Freeswitch配置。

3.3.2 配置结构

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

3.3.3 代理服务器配置步骤

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

通过判断externalinternalState都为RUNNING (0),说明配置正常工作了。

3.3.4 内网A项目服务器配置

内网服务器配置相对简单,只需要配置网关和拨号计划即可。网关地址指向代理服务器的内网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

3.3.5 分机测试

座席端软电话注册到内网A项目服务器地址172.18.11.100,然后拨号并发起外呼,此时可以查看计费服务器是否收到呼叫请求。如果有问题,可以同步打开代理服务器的Freeswitch控制台,并查看日志。

3.3.6 负载问题

有人说,这里代理服务器之启动了一个实例,承受的负载有限呀。这里当然可以配置多个实例,sip-port设置不同, 同时配置好switch.conf.xml 中的rtp-start-portrtp-end-port端口范围划分即可。
甚至还可以启动第3、4个网卡,设置为内网ip地址,这样网卡也可以实现负载平衡(:。

3.3.7 一个小技巧

如果IP地址资源不够用的情况下,代理服务器的公网IP地址可以使用一个不存在的地址,即该IP地址没有被采购并分配到公司名下。 前提条件是,代理服务器的公网口需要和计费服务器在同一个交换机下,且代理服务器使用的公网IP地址和计费服务器的IP地址在同一个网段下。 配置好之后,注意检查从代理服务器到计费服务器,是否能相互PING通。

3.3.8 安全问题

建议代理服务器和计费服务器都放置在硬件防火墙后面,同时尽量开启IP地址白名单。



本书版权所有 © 杜金房及各位贡献者 2016-2023,仅供在线阅读,谢绝一切形式转载。 本书还在写作中,持续更新。 如果你也想写上几句,欢迎加入我们。 | 返回首页 |