一、架构分享
上一篇文章“从零到一“基于Freeswitch二次开发:Freeswitch入门与网络架构 (一) 对Freeswitch二次开发做了一个介绍,距离这篇文章的发布时间有点久了,之前一直没时间把下文补上来。正好到了年末想起来,就把我们的一个实现架构进行分享。
我们自己开发移动端APP如安卓、IOS:
1、移动端就是一个sip协议的客户端,可以通过Freeswitch服务器进行语音通信,Freeswitch再通过落地语音网关实现网络语音到PSTN网络的打通,使用开源的sip客户端SDK Linphone:
Linphone SDK 项目地址: https://github.com/BelledonneCommunications
2、关于Freeswitch的sip抓包监控,我们采用的是Homer这个开源sip监控项目,Freeswitch本身支持对接Homer,可以在Freeswitch中进行配置Homer监听地址,将整个sip协议流程数据写入Homer的数据库,之后再通过UI可视化界面直观进行问题排查
Homer项目地址: https://github.com/sipcapture/homer
3、Bill话单计费方式,我们将Freeswitch的话单通过生成文件的形式,通过Filebeat采集话单推送到Kafka消息队列,再通过计费消费者进行消费,生成话单数据,最后将话单数据推送到APP后端进行计费操作
4、通过ELK技术栈将话单新建消费组消费数据后写入ES,可以通过ES进行话单数据统计、异常发现、异常排查,结合Homer定位到具体某一次sip协议的全过程
5、为了保证计费的正确性和成本风险可控性,我们需要提供一个强制kill挂断某一次通话的相关接口。因为实际过程中可能会存在某种bug, 移动端已经挂了,但是Freeswitch还没有释放某一次通话,导致这个链路一直存在,如用户才30秒已经挂了,但是这个链路持续了10几分钟,那我收用户30秒的钱,但是运营商会收我10分钟的钱,那就会造成和线路方结算亏本问题。
所以每次客户端挂断,我们都会通过sip id进行强制挂断操作,保证不会出现结算亏本问题。我们暂且叫这个HTTP服务为【ESL服务】,因为已经有开源SDK连接Freeswitch,所以我们采用的是Python Flask即可。
二、安全性保证
1、HTTPS、SIPS协议
在HTTP Web服务本身我们肯定想都不用想,直接上HTTPS来保证数据的安全性、站点身份的可靠性。
sip协议本身也是明文进行传输,往往我们会忽略。 但是这个sip协议针对语音这样的APP安全性更为敏感。
因为我们早期测试服就因为不是很重视,测试服就被sip疯狂灌水攻击,伴随着破解sip账号、密码很多的sip包。如果我们没有上SSL的话,传输过程中的sip账号、密码一旦泄露就会造成盗打问题,导致经济损失。
所以Freeswitch支持SSL的方式,针对sip协议进行SSL加密,从而来保证sip协议非明文传输、站点身份可靠性验证。
2、本地IDC与阿里云服务通信,通过SSH隧道交互
我们某些服务进行了上云操作,但是某些应用只能在本地IDC机房。那么我们怎么方便监控云上的相关服务,或者如连接云上的MySQL、ES这样敏感的数据呢?
1、放开安全组,限制IP地址进行访问。 这种方式最简单,但是不能避免数据明文公网传输,数据被窃取的问题。
2、通过SSH隧道的方式,通过SSH隧道将阿里云服务与本地IDC机房打通,这样的方式相对第一种方式更加安全。
我们就采用的是第二种方式。