FreeSWITCH架構設計景埃,靈活、開放顶别、可擴展的開發(fā)方式谷徙,支持集群特點,對多種協(xié)議的可支持驯绎,對高級SIP特性的可支持等特性完慧,非常適合用來商業(yè)級的通信業(yè)務開發(fā)。
信令加密
為了使用SSL/TLS加密剩失,必須在FreeSWITCH環(huán)境下骗随,編譯OpenSSL庫。另外赴叹,需要制作CA和服務器證書鸿染。
// 安裝Openssl
sudo apt-get openssl libssl-dev
?// 重新編譯Freeswitch
./configure --with-opensslmake && make install
// Freeswitch提供了一個簡單的腳本可以幫助用戶證書,生成的證書和密鑰會自動保存到conf/ssl/文件夾乞巧。
?// 制作CA證書(cafile.pem)涨椒,統(tǒng)一使用主機名或IP作為CommonName的參數(shù)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"/> // 其他相關參數(shù) <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"/>
?// 其他可選相關參數(shù)
<param name="tls-only" value="false"/>?// 只啟用TLS端口
?<param name="tls-bind-params" value="transport=tls"/>?// 附加參數(shù)
<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操作系統(tǒng)下:復制CA證書并修改后綴名為.crt棺聊,雙擊彈出證書安裝對話框伞租,按照提示進行安裝即可。
?Ubuntu下:cat cafile.pem >> /etc/ssl/certs/ca-certificates.crt
4.1.3 使用SSLSSL加密工作類似于一種協(xié)商機制限佩,它通過網(wǎng)站或基于SSL服務端協(xié)商來實現(xiàn)加密葵诈。使用一個第三方來驗證安全證書,然后在發(fā)送方和接收方之間使用這個安全證書來交換信息祟同。理論上作喘,基于公共哈希和私有哈希的安全證書應該加載到電話本身和服務器端。通常情況下晕城,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連接的數(shù)據(jù)加密几睛,并在會話中一直維持這個連接。若要啟用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定義了發(fā)送和接收RTP的方法夯接,在這個方法中焕济,使用認證信息和集成方法來保護RTP數(shù)據(jù)。它支持單播和多播程序盔几,由于它是一個比較老的方式并且由一些主流IP通信廠家開發(fā)晴弃,逐漸成為大部分標準設備必須支持的加密方式。SRTP通過SIP在呼叫創(chuàng)建過程中進行加密協(xié)商,SIP雙方都必須同意支持RTP加密上鞠,通過交換密鑰對SIP包加密际邻。SRTP的密鑰交換通過控制信道完成,通過這些信息對語音流加密芍阎。注意世曾,除非用戶開啟了SIP數(shù)據(jù)的加密和明確SRTP的密鑰已經(jīng)啟用,為了實現(xiàn)終端和Freeswitch完全的安全連接谴咸,用戶應該使用SIP加密和SRTP加密轮听。
如果僅開啟了SRTP,則僅對RTP包的凈荷數(shù)據(jù)類型加密寿冕∪锍蹋可以從撥號計劃中設置基于每個呼叫開啟的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})}"/>
使用客戶端驗證辨赐,經(jīng)過SIP消息追蹤及分析,SDP加密媒體協(xié)商成功京办,獲取的相關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是一個相對新的方法掀序,使用密鑰自動協(xié)商,極大簡化了對RTP呼叫的加密設置和操作過程惭婿。它也添加了更多的優(yōu)點不恭,不再依賴于服務器端的加密。在服務器之間也可以進行加密财饥,并且雙方服務器都不會感覺到正在對RTP流媒體的內(nèi)容加密换吧。因為極大地降低了它們之間的依賴,這樣的方式提升了服務器的運行速度钥星。?
FreeSWITCH的開發(fā)方式
FreeSWITCH的開發(fā)方式較為多樣沾瓦,主要有以下幾種:
? 通過修改dialplan實現(xiàn)業(yè)務定制,不需要修改代碼谦炒,編寫腳本語言即可贯莺。
? 通過ESL方式實現(xiàn)業(yè)務定制,不需要修改代碼宁改,只需要編寫腳本語言即可缕探。
? 通過增加/修改mod實現(xiàn)業(yè)務定制和增加,當然也可以只實現(xiàn)application还蹲。
? 需要修改一定的核心代碼撕蔼。從上到下難易程度逐漸增加豁鲤,使用概率遞減,其中第一條不需要專業(yè)的研發(fā)人員開發(fā)鲸沮,技服琳骡,代理商,甚至客戶都可以編寫自己的dialplan讼溺,進行業(yè)務開發(fā)組合楣号。
開發(fā)方式有點:
較靈活,有多種方式可以進行業(yè)務開發(fā)怒坯,不一定需要編程炫狱;?
較開放,支持多種開放接口剔猿,包括XML视译,LUA,Javascript归敬,ESL等酷含,適合定制開發(fā);業(yè)務耦合較小汪茧,開發(fā)人員可以各自獨立開發(fā)模塊椅亚,并行開發(fā)效率較高
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
有安全傳輸和認證的方式支持:這種情況需要你的系統(tǒng)已經(jīng)安裝了OpenSSL
?make ossl
有PCAP播放、無認證支持:
make pcapplay
有PCAP播放和認證支持:
make pcapplay_ossl
驗證用內(nèi)置的測試場景模擬一個SIP客戶端和服務端.
# ./sipp -sn uas
# ./sipp -sn uac 127.0.0.1
sipp有幾個內(nèi)置場景舱污,可以查看sipp的幫助文件
腳本
?導出內(nèi)置腳本,根據(jù)需要的場景修改呀舔。
?./sipp -sd uac > uac.xml
?./sipp -sd uas > uas.xml
Valgrind工具
apt-getinstall libc6-dbg gdb valgrind
Valgrind是一個性能工具,用于提高軟件穩(wěn)定性扩灯。Valgrind由5個工具組成cachegrind媚赖,callgrind,massif珠插,helgrind 和memorycheck惧磺。
Cachegrind查看進程cache信息;
Callgrind 查看函數(shù)調用關系丧失;
Massif 詳細查看進程分配的內(nèi)存值豺妓;
Helgrind 調試線程工具 檢查各種同步錯誤(POSIX 和 PThreadAPI)惜互;
Memory check 內(nèi)存檢測工具布讹。
多線程程序GDB調試方法
第一步,首先獲得進程的所有線程id: ps -eLf | grep 進程名?
第二步训堆,通過gdb逐個連接線程 gdb attach <線程id> (需要確保單板上有可執(zhí)行的gdb程序描验,如果沒有傳一個上去) 如 gdb attach 1401?
第三步,連接上之后坑鱼,使用bt full查看調用棧 bt full 然后輸入q退出膘流,進程繼續(xù)執(zhí)行絮缅。使用同樣方法連接其他線程。https://my.oschina.net/andywang1988/blog/698603
通過GDB代碼學習:
【啟動調試】gdb freeswitch? 【設置斷點】b?mod_rtmp.c:418
【運行】r
【回到gdb】ctrl+c
【繼續(xù)運行】c
NMON性能數(shù)據(jù)采集工具
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參數(shù)說明--tool=callgrind 使用callgrind工具 --instr-atstart=no 啟動時不進trace --collect-systime收集系統(tǒng)時間
?以下是過程控制
callgrind_control -i on 開啟跟蹤
callgrind_control -d dump跟蹤數(shù)據(jù)
callgrind_control -i off 關閉跟蹤
kcachegrind 是一個解析跟蹤數(shù)據(jù) 生成圖像的工具
kcachegrind callgrind.out.12208gprof2dot.py -f callgrind callgrind.out.* |dot -Tpng -o report.png
統(tǒng)計網(wǎng)絡流量 iptraf -u -d p49p1
FreeSWITCH性能規(guī)格
單臺服務器規(guī)格
vCPU:2P8C?核工作頻率:2200 MHz內(nèi)存:8G網(wǎng)口:4GE
呼叫性能
最大會話并發(fā)數(shù):10000CAPS:100
說明
FreeSWITCH單臺服務器最大支持2w用戶呼股,100caps呼叫耕魄,1w最大會話數(shù);
CPU利用率為44%彭谁,內(nèi)存利用率為65%吸奴,內(nèi)存是較為緊缺的資源。
媒體性能 G.711a/μ 600路G.729ab 300路iLBC 300路
可靠性分布式
支持雙機冗余缠局,基于HA軟件實現(xiàn)则奥,且支持呼叫持久化(性能會有一定影響),雙機切換后狭园,呼叫能接續(xù)读处; 支持集群部署,通過OpenSIPS進行分發(fā)唱矛,實現(xiàn)多個Freeswitch之間負荷分擔罚舱,支持集群可擴展。
協(xié)議能力&接口
SIP揖赴、Skype馆匿、H323、IAX及Google Talk燥滑、SCCP(Skinny Call Control Protocol與思科話機互通)渐北;通過T1/E1擴展卡支持模擬話機
安全性
支持TLS信令加密和SRTP媒體加密SIP協(xié)議支持協(xié)議與接口防攻擊