FreeSWITCH开源介绍

FreeSWITCH架构设计,灵活、开放、可扩展的开发方式,支持集群特点,对多种协议的可支持,对高级SIP特性的可支持等特性,非常适合用来商业级的通信业务开发。

信令加密

为了使用SSL/TLS加密,必须在FreeSWITCH环境下,编译OpenSSL库。另外,需要制作CA和服务器证书。

// 安装Openssl
sudo apt-get openssl libssl-dev
 // 重新编译Freeswitch
./configure --with-opensslmake && make install
// Freeswitch提供了一个简单的脚本可以帮助用户证书,生成的证书和密钥会自动保存到conf/ssl/文件夹。
 // 制作CA证书(cafile.pem),统一使用主机名或IP作为CommonName的参数gentls_cert setup -cn pbx.freeswitch.org -alt DNS:pbx.freeswitch.org -org freeswitch.org
// 制作服务器证书(agent.pem)
 gentls_cert create_server -cn 10.170.103.239 -alt DNS:10.170.103.239 -org 10.170.103.239
 // 启用SSL/TLS,有两种配置形式:
 // 一、修改全局配置vars.conf.xml,则profile从这里获取具体配置
 <X-PRE-PROCESS cmd="set" data="internal_ssl_enable=true"/> <X-PRE-PROCESS cmd="set" data="external_ssl_enable=true"/> // 其他相关参数 <X-PRE-PROCESS cmd="set" data="sip_tls_version= tlsv1,tlsv1.1,tlsv1.2"/> <X-PRE-PROCESS cmd="set" data="sip_tls_ciphers=ALL:!ADH:!LOW:!EXP:!MD5:@STRENGTH"/> <X-PRE-PROCESS cmd="set" data="internal_tls_port=5061"/> <X-PRE-PROCESS cmd="set" data="external_tls_port=5081"/>
// 二、修改单独的profile,也可以配合使用vars.conf.xml,比如sip_profiles/internal.conf.xml<param name="tls" value="true"/><param name="tls-sip-port" value="5061"/><param name="tls-version" value="tlsv1,tlsv1.1,tlsv1.2"/><param name="tls-cert-dir" value="/usr/local/freeswitch/conf/ssl"/><param name="tls-ciphers" value=" ALL:!ADH:!LOW:!EXP:!MD5:@STRENGTH"/>
 // 其他可选相关参数
<param name="tls-only" value="false"/> // 只启用TLS端口
 <param name="tls-bind-params" value="transport=tls"/> // 附加参数
<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=""/>  // 指定检查特殊inbound用户组 

导入根证书到客户端

SSL/TLS加密通信要求客户端必须验证服务端的证书,反之则可以不作要求。客户端对服务端进行证书验证的严格程度也是可以控制的。这里必须把服务端证书的根证书添加到客户端的信任列表中。
 Windows操作系统下:复制CA证书并修改后缀名为.crt,双击弹出证书安装对话框,按照提示进行安装即可。
 Ubuntu下:cat cafile.pem >> /etc/ssl/certs/ca-certificates.crt
4.1.3 使用SSLSSL加密工作类似于一种协商机制,它通过网站或基于SSL服务端协商来实现加密。使用一个第三方来验证安全证书,然后在发送方和接收方之间使用这个安全证书来交换信息。理论上,基于公共哈希和私有哈希的安全证书应该加载到电话本身和服务器端。通常情况下,SSLv23 + SRTP是对防火墙支持最友好的,也是相对比较容易在Freeswitch上配置的,支持了大部分客户端的加密和大部分的SIP终端。
 若要启用SSL加密,只需修改TLS Version为sslv2,sslv3,sslv23,比如vars.conf.xml中 <X-PRE-PROCESS cmd="set" data="sip_tls_version=sslv2,sslv3,sslv23"/>或profile中 <param name="tls-version" value="sslv2,sslv3,sslv23"/>
4.1.4 使用TLSTLS是另外一种加密机制,支持建立安全信令。它看起来是相对比较成熟的策略,对所有TCP连接的数据加密,并在会话中一直维持这个连接。若要启用TLS加密,只需修改TLS Version为tlsv1,tlsv1.1,tlsv1.2,比如vars.conf.xml中<X-PRE-PROCESS cmd="set" data="sip_tls_version=tlsv1,tlsv1.1,tlsv1.2"/>或profile中<param name="tls-version" value="tlsv1,tlsv1.1,tlsv1.2"/>使用客户端验证。

媒体加密

4.2.1 使用SRTPSRTP定义了发送和接收RTP的方法,在这个方法中,使用认证信息和集成方法来保护RTP数据。它支持单播和多播程序,由于它是一个比较老的方式并且由一些主流IP通信厂家开发,逐渐成为大部分标准设备必须支持的加密方式。SRTP通过SIP在呼叫创建过程中进行加密协商,SIP双方都必须同意支持RTP加密,通过交换密钥对SIP包加密。SRTP的密钥交换通过控制信道完成,通过这些信息对语音流加密。注意,除非用户开启了SIP数据的加密和明确SRTP的密钥已经启用,为了实现终端和Freeswitch完全的安全连接,用户应该使用SIP加密和SRTP加密。
如果仅开启了SRTP,则仅对RTP包的净荷数据类型加密。可以从拨号计划中设置基于每个呼叫开启的SRTP加密,通过以下方式设置:
<action application="set" data="rtp_secure_media=true"/><action application="export" data="rtp_secure_media=true"/>
通道变量rtp_secure_media的值有三种:true—强制,false—禁止,optional—可选。
也可以在用户directory中的dial-string中设置。 <paramname="dial-string" value="{sip_secure_media=${regex(${sofia_contact(${dialed_user}@${dialed_domain})}|transport=tls)},presence_id=${dialed_user}@${dialed_domain}}${sofia_contact(${dialed_user}@${dialed_domain})}"/>
使用客户端验证,经过SIP消息追踪及分析,SDP加密媒体协商成功,获取的相关SIP消息及日志结果如下:
m=audio 4002 RTP/SAVP 117 107 9 8 0 110 96 97 3 18 101
a=crypto:1 AES_CM_128_HMAC_SHA1_80 
 a=crypto:2 AES_CM_128_HMAC_SHA1_32 
使用ZRTPZRTP是一个相对新的方法,使用密钥自动协商,极大简化了对RTP呼叫的加密设置和操作过程。它也添加了更多的优点,不再依赖于服务器端的加密。在服务器之间也可以进行加密,并且双方服务器都不会感觉到正在对RTP流媒体的内容加密。因为极大地降低了它们之间的依赖,这样的方式提升了服务器的运行速度。 

FreeSWITCH的开发方式

FreeSWITCH的开发方式较为多样,主要有以下几种:
 通过修改dialplan实现业务定制,不需要修改代码,编写脚本语言即可。
 通过ESL方式实现业务定制,不需要修改代码,只需要编写脚本语言即可。
 通过增加/修改mod实现业务定制和增加,当然也可以只实现application。
 需要修改一定的核心代码。从上到下难易程度逐渐增加,使用概率递减,其中第一条不需要专业的研发人员开发,技服,代理商,甚至客户都可以编写自己的dialplan,进行业务开发组合。
开发方式有点:
较灵活,有多种方式可以进行业务开发,不一定需要编程; 
较开放,支持多种开放接口,包括XML,LUA,Javascript,ESL等,适合定制开发;业务耦合较小,开发人员可以各自独立开发模块,并行开发效率较高

SIPP工具

安装依赖库apt-get install openssl libssl-dev libssl1.0.0 libssl0.9.8 pcaputils libssl-dev libncursesw5-dev libncurses5-dev libcap-dev make gcc bison flex build-essential libncurses-dev libpcap-dev sip-tester
下载源代码wget http://sourceforge.net/projects/sipp/files/sipp/3.3/sipp-3.3.tar.gz/
编译安装
无TLS和密码验证支持:make
有安全传输和认证的方式支持:这种情况需要你的系统已经安装了OpenSSL
 make ossl
有PCAP播放、无认证支持:
make pcapplay
有PCAP播放和认证支持:
make pcapplay_ossl
验证用内置的测试场景模拟一个SIP客户端和服务端.
# ./sipp -sn uas
# ./sipp -sn uac 127.0.0.1
sipp有几个内置场景,可以查看sipp的帮助文件
脚本
 导出内置脚本,根据需要的场景修改。
 ./sipp -sd uac > uac.xml
 ./sipp -sd uas > uas.xml

Valgrind工具

apt-getinstall libc6-dbg gdb valgrind
Valgrind是一个性能工具,用于提高软件稳定性。Valgrind由5个工具组成cachegrind,callgrind,massif,helgrind 和memorycheck。
Cachegrind查看进程cache信息;
Callgrind 查看函数调用关系;
Massif 详细查看进程分配的内存值;
Helgrind 调试线程工具 检查各种同步错误(POSIX 和 PThreadAPI);
Memory check 内存检测工具。

多线程程序GDB调试方法

第一步,首先获得进程的所有线程id: ps -eLf | grep 进程名 
第二步,通过gdb逐个连接线程 gdb attach <线程id> (需要确保单板上有可执行的gdb程序,如果没有传一个上去) 如 gdb attach 1401 
第三步,连接上之后,使用bt full查看调用栈 bt full 然后输入q退出,进程继续执行。使用同样方法连接其他线程。

https://my.oschina.net/andywang1988/blog/698603

通过GDB代码学习:

【启动调试】gdb freeswitch  【设置断点】b mod_rtmp.c:418
【运行】r
【回到gdb】ctrl+c
【继续运行】c

NMON性能数据采集工具

apt-get install nmon
./nmon -f -t -r test -s 10 -c 3600

分析定位

apt-get install graphviz
apt-get install kcachegrind
gprof2dot https://github.com/jrfonseca/gprof2dot
valgrind --tool=callgrind --instr-atstart=no --collect-systime=yes --collect-bus=yes ./freeswitch -vg –nosql参数说明--tool=callgrind 使用callgrind工具 --instr-atstart=no 启动时不进trace --collect-systime收集系统时间
 以下是过程控制
callgrind_control -i on 开启跟踪
callgrind_control -d dump跟踪数据
callgrind_control -i off 关闭跟踪
kcachegrind 是一个解析跟踪数据 生成图像的工具
kcachegrind callgrind.out.12208gprof2dot.py -f callgrind callgrind.out.* |dot -Tpng -o report.png
统计网络流量 iptraf -u -d p49p1

FreeSWITCH性能规格

单台服务器规格
vCPU:2P8C 核工作频率:2200 MHz内存:8G网口:4GE
呼叫性能
最大会话并发数:10000CAPS:100
说明
FreeSWITCH单台服务器最大支持2w用户,100caps呼叫,1w最大会话数;
CPU利用率为44%,内存利用率为65%,内存是较为紧缺的资源。
媒体性能 G.711a/μ 600路G.729ab 300路iLBC 300路

可靠性分布式

支持双机冗余,基于HA软件实现,且支持呼叫持久化(性能会有一定影响),双机切换后,呼叫能接续; 支持集群部署,通过OpenSIPS进行分发,实现多个Freeswitch之间负荷分担,支持集群可扩展。

协议能力&接口

SIP、Skype、H323、IAX及Google Talk、SCCP(Skinny Call Control Protocol与思科话机互通);通过T1/E1扩展卡支持模拟话机

安全性

支持TLS信令加密和SRTP媒体加密SIP协议支持协议与接口防攻击

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,802评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,109评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,683评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,458评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,452评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,505评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,901评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,550评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,763评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,556评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,629评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,330评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,898评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,897评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,140评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,807评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,339评论 2 342

推荐阅读更多精彩内容