场景

呼叫中心中将呼叫平台模块作为通用中心进行单独部署,呼叫平台模块呼叫是通过其对应的呼叫管理系统来作为外呼数据管理、外呼策略管理、外呼结果报表管理以及外呼数据接入管理。需要使用外呼功能的其他业务模块第三方系统中心会传递数据给呼叫管理系统,但是为了数据的安全性。第三方业务系统传递的数据是加密脱敏数据。因此进入呼叫管理系统的数据都是加密的数据。

方案

1.常规呼叫方式

随着voip技术的发展,越来越多的呼叫使用voip的sip跟rtp协议;其中代表性地就是freeswitch。实现号码脱敏方案,需要对整体外呼链路清楚熟悉。不使用号码退敏的常规呼叫具体流程如下图:
image.png

2.号码脱敏呼叫方式

需要进行号码脱敏就是送给中继网关的号码一定是运营商可以识别的解密号码。所以在上面的常规呼叫方式链路中,我们只能在第三方中继跟平台接入层FS模块做改造,并添加一个加密解密的服务。具体呼叫流程图如下:
image.png

所以基于以上架构:我们在呼叫管理系统里面只需要配置不同的对接网关地址;如果需要进行脱敏的直接对接脱敏服务的sip网关地址;不需要脱敏的直接对接对应的第三方网关即可。

3、号码脱敏部署

1、freeswitch安装

创建cc目录,在生产系统打包/cc/cclib和/cc/freeswitch  fs打包前清理日志
将打包文件拷贝后解压,设置$LD_LIBRARY_PATH环境变量,增加/cc/cclib目录,并确保生效(参照平台安装文档)
建立软连 ln -s /cc/freeswitch /usr/local/freeswitch    

2、替换拨号计划表 :

将default.xml替换 /cc/freeswitch/conf/dialplan/下的文件
 <action application="lua" data="getcalled.lua gw1 http://解密服务器的url/${destination_number}"/> 

3、替换网关配置

将gw1.xml替换 /cc/freeswitch/conf/sipprofile/external/下的文件
修改gw1.xml realm为最终需要呼出的网关地址,username为实际呼出需要的主叫(如果网关不需要,则不用改username)

4、加入lua

将httpgetcalled.lua拷贝到/cc/freeswitch/scripts/下

5、加入lua库

将lua.tar.z拷贝到/cc/cclib/目录下,解压

6、启动freeswitch 拨测验证

4.号码脱敏设计细节

号码脱敏解密模块实现原理主要是通过getcalled.lua脚本实现具体如下:

package.path = '/cc/cclib/lua/?.lua;'
package.cpath = '/cc/cclib/lua/?.so;'
local http=require("socket.http");

local gw=argv[1] //获取的是gw1
local url=argv[2] //获取的是解密服务url
local uuid = session:get_uuid()

--开始发送http请求
local response_body = {}
      local res, code, response_headers = http.request{
        url = url,
        sink = ltn12.sink.table(response_body)}
if(code == nil or code ~=200) then
    freeswitch.consoleLog("ERR","http访问错误\n")
    return
end

  if type(response_body) == "table" then  
        res=table.concat(response_body)  
        freeswitch.consoleLog("INFO","请求结果是: "..res.."\n")
    local cjson = require("cjson");
    local jsdata = cjson.decode(res);
        freeswitch.consoleLog("INFO","请求结果是: "..tostring(jsdata).."\n")
    if(jsdata ~=nil) then
            freeswitch.consoleLog("INFO","请求结果是11: "..tostring(jsdata).."\n")
        local ret = jsdata["status"]
        local value = tostring(jsdata["data"]);
        if (ret ~= nil and ret == 1) then
            local new_session = freeswitch.Session("sofia/gateway/" .. gw .. "/" .. value) //所以需要配置一个gw1外部网关
            --freeswitch.consoleLog("ERR","请求结果是111: "..tostring(new_session).."\n")
            --if(new_Session ~= nil) then
                freeswitch.bridge(session, new_session)
            --else
            --    session:hangup()
            --end
            return
        end
    end
 
  end
session:hangup()

5.数据库连接问题

我们启动服务发现报错如下:
image.png

原因是我们使用lua脚本连接了数据库,现在我们需要将其注册掉,进入fs的自动装配文件下,注释掉user.lua连接数据库。

image.png


startshineye
91 声望26 粉丝

我在规定的时间内,做到了我计划的事情;我自己也变得自信了,对于外界的人跟困难也更加从容了,我已经很强大了。可是如果我在规定时间内,我只有3分钟热度,哎,我不行,我就放弃了,那么这个就是我自己的问题,因为你自己...


引用和评论

0 条评论