1、為了驗(yàn)證NAT環(huán)境的測(cè)試效果,我們首先需要搭建一個(gè)簡(jiǎn)單的NAT測(cè)試環(huán)境這里,我們介紹幾種不同的NAT環(huán)境:
- 服務(wù)器在數(shù)據(jù)中心,例如,阿里云等環(huán)境。用戶側(cè)在NAT中。
- 在內(nèi)網(wǎng)環(huán)境下使用路由器創(chuàng)建不同的IP地址端來(lái)測(cè)試NAT環(huán)境,例如:192.168.XX,172.16.xx或者10.0.0.0等不同地址段。如果使用這樣的環(huán)境的話,我們需要設(shè)置use nat_uac_test() 。注意,這里的標(biāo)志可以根據(jù)不同的IP地址段進(jìn)行不同的檢測(cè)。用戶需要參考官方文檔做相應(yīng)的調(diào)整。
- 在本地創(chuàng)建一個(gè)虛擬機(jī),設(shè)置為NAT環(huán)境,終端在此虛擬機(jī)環(huán)境中對(duì)服務(wù)器進(jìn)行呼叫測(cè)試。這是最簡(jiǎn)單的測(cè)試環(huán)境,可以模擬一個(gè)簡(jiǎn)單的NAT環(huán)境。
2、現(xiàn)在我們配置一個(gè)基于RTP Proxy的環(huán)境測(cè)試NAT問(wèn)題。用戶需要幾個(gè)步驟來(lái)進(jìn)行測(cè)試配置。
首先,用戶需要安裝在本機(jī)一個(gè)RTP Proxy中,通過(guò)執(zhí)行命令行就可以進(jìn)行安裝:apt-get install rtpproxy。然后對(duì)RTP Proxy進(jìn)行配置,修改配置文件/ etc / default / rtpproxy:
。DJ(rèn)為rtpproxy
。?刂撇遄。
#CONTROL_SOCK = “UNIX:/var/run/rtpproxy/rtpproxy.sock”
。R赨DP套接字上偵聽(tīng),請(qǐng)取消注釋以下行:
CONTROL_SOCK = UDP:127.0.0.1:7890
。鬟f給守護(hù)進(jìn)程的其他選項(xiàng)。
EXTRA_OPTS =“ - l SERVER_IP”
#此地址是IP服務(wù)器地址。
修改配置以后,重新啟動(dòng)服務(wù)器:/etc/init.d/rtpproxy restart。
。然后修改CFG文件支持我們?cè)O(shè)置的NAT環(huán)境加載所需模塊:
- loadmodule“nathelper.so”
- loadmodule“rtpproxy.so”
- loadmodule“dialog.so”
然后添加模塊支持參數(shù):
- modparam( “usrloc”, “nat_bflag”, “NAT_FLAG”)
- modparam(“注冊(cè)商”,“received_avp”,“$ avp(42)”)
- modparam(“nathelper”,“received_avp”,“$ avp(42)”)
- modparam(“rtpproxy”,“rtpproxy_sock”,“udp:127.0.0.1:7890”)
- modparam(“nathelper”,“natping_interval”,30)
- modparam(“nathelper”,“ping_nated_only”,1)
- modparam(“nathelper”,“sipping_bflag”,“SIPPING_FLAG”)
- modparam(“nathelper”,“sipping_from”,“sip:pinger@192.168.0.17”)
。W⒁庑薷臑橛脩糇约旱姆⻊(wù)器地址。
然后添加NAT檢測(cè):
force_rport();
。W⒁膺@里要設(shè)置為18,具體參數(shù)設(shè)置,參考官方文檔。
if(nat_uac_test(“18”)){
if(method ==“REGISTER”){
fix_nated_register();
} else {
fix_nated_contact();
}
setflag(NAT_FLAG);
}
初始化一個(gè)請(qǐng)求,創(chuàng)建對(duì)話框:
create_dialog();
檢測(cè)是否設(shè)置標(biāo)志:
if(isflagset(NAT_FLAG)){
setbflag(NAT_BFLAG);
setbflag(SIPPING_FLAG);
};
在INVITEs中開(kāi)啟支持helper路由方式:
if(subst_uri('/(sip:。*); nat = yes / \ 1 /')){
setbflag(NAT_BFLAG);
};
if(isflagset(NAT_FLAG)|| isbflagset(NAT_BFLAG)){
路線(mediarelay);
};
添加媒體路由設(shè)置:
路線[mediarelay] {
if(is_method(“INVITE”)){
if(has_body(“application / sdp”)){
rtpproxy_engage();
}
}
}
設(shè)置轉(zhuǎn)發(fā)路由:
onreply_route [handle_nat] {
# - 重播塊路由 -
。
if(isbflagset(NAT_BFLAG)){
append_hf(“P-hint:Onreply-route-fixcontact \ r \ n”);
fix_nated_contact();
}
出口;
}
完成修改以后,用戶重新啟動(dòng)軟交換。
3、配置完成后,如果配置成功的話,用戶可以通過(guò)以下幾種方式來(lái)做進(jìn)一步的測(cè)試:
通過(guò)opensipsctl ul檢查終端注冊(cè)地址,通過(guò)CONTACT值和收到的地址消息。如果配置成功的話,NAT環(huán)境下顯示有不同的地址段。
使用帶NAT的終端進(jìn)行注冊(cè)測(cè)試,這里需要關(guān)閉STUN,軟電話使用外網(wǎng)地址。
使用帶NAT環(huán)境的軟電話進(jìn)行呼叫測(cè)試,查看呼叫狀態(tài)。
軟電話使用等待按鍵重新創(chuàng)建re-invite,檢查呼叫的語(yǔ)音是否丟失。如果環(huán)境配置成功的話,re-invite以后語(yǔ)音不會(huì)丟失。
4、在本講座中,我們介紹了一個(gè)如何通過(guò)軟交換結(jié)合RTP proxy實(shí)現(xiàn)簡(jiǎn)單NAT穿透的場(chǎng)景測(cè)試環(huán)境中用戶首先需要在本地安裝rtp代理,并且配置不同的地址段檢測(cè)來(lái)查詢NAT環(huán)境,最后通過(guò)CFG中的NAT檢測(cè),路由設(shè)置來(lái)協(xié)助帶NAT的終端實(shí)現(xiàn)注冊(cè)呼叫。這里再次說(shuō)明,我們這里搭建的NAT環(huán)境是一個(gè)NAT的示例,它的目的是幫助讀者了解NAT場(chǎng)景和其基本的解決思路。事實(shí)上,在實(shí)際生產(chǎn)環(huán)境中,NAT問(wèn)題是一個(gè)非常棘手的問(wèn)題,目前沒(méi)有一種解決方案可以解決所有的NAT問(wèn)題,不同NAT環(huán)境需要不同的配置環(huán)境和解決辦法來(lái)處理。
參考資料:
http://www.kamailio.org.cn/doku.php?id=dispatcher_dispatcher_load-balancer_module_released
http://wiki.kolmisoft.com/index.php/Implementations
關(guān)注微信公眾號(hào):asterisk-cn,獲得有價(jià)值的行業(yè)分享
freepbx 技術(shù)論壇:www.ippbx.org.cn
Asterisk, freepbx技術(shù)文檔: www.freepbx.org.cn
歐米(Omni)智能客服解決方案
融合通信商業(yè)解決方案,協(xié)同解決方案首選產(chǎn)品:www.hiastar.com