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协议支持协议与接口防攻击