
1、為了驗(yàn)證NAT環(huán)境的測試效果,我們首先需要搭建一個(gè)簡單的NAT測試環(huán)境這里,我們介紹幾種不同的NAT環(huán)境:
- 服務(wù)器在數(shù)據(jù)中心,例如,阿里云等環(huán)境。用戶側(cè)在NAT中。
- 在內(nèi)網(wǎng)環(huán)境下使用路由器創(chuàng)建不同的IP地址端來測試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)行不同的檢測。用戶需要參考官方文檔做相應(yīng)的調(diào)整。
- 在本地創(chuàng)建一個(gè)虛擬機(jī),設(shè)置為NAT環(huán)境,終端在此虛擬機(jī)環(huán)境中對服務(wù)器進(jìn)行呼叫測試。這是最簡單的測試環(huán)境,可以模擬一個(gè)簡單的NAT環(huán)境。
2、現(xiàn)在我們配置一個(gè)基于RTP Proxy的環(huán)境測試NAT問題。用戶需要幾個(gè)步驟來進(jìn)行測試配置。
首先,用戶需要安裝在本機(jī)一個(gè)RTP Proxy中,通過執(zhí)行命令行就可以進(jìn)行安裝:apt-get install rtpproxy。然后對RTP Proxy進(jìn)行配置,修改配置文件/ etc / default / rtpproxy:
。DJ(rèn)為rtpproxy
。?刂撇遄
。ONTROL_SOCK = “UNIX:/var/run/rtpproxy/rtpproxy.sock”
#要在UDP套接字上偵聽,請取消注釋以下行:
CONTROL_SOCK = UDP:127.0.0.1:7890
。鬟f給守護(hù)進(jìn)程的其他選項(xiàng)。
EXTRA_OPTS =“ - l SERVER_IP”
。4说刂肥荌P服務(wù)器地址。
修改配置以后,重新啟動(dòng)服務(wù)器:/etc/init.d/rtpproxy restart。
。然后修改CFG文件支持我們設(shè)置的NAT環(huán)境加載所需模塊:
- loadmodule“nathelper.so”
- loadmodule“rtpproxy.so”
- loadmodule“dialog.so”
然后添加模塊支持參數(shù):
- modparam( “usrloc”, “nat_bflag”, “NAT_FLAG”)
- modparam(“注冊商”,“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ù)器地址。
然后添加NAT檢測:
force_rport();
#注意這里要設(shè)置為18,具體參數(shù)設(shè)置,參考官方文檔。
if(nat_uac_test(“18”)){
if(method ==“REGISTER”){
fix_nated_register();
} else {
fix_nated_contact();
}
setflag(NAT_FLAG);
}
初始化一個(gè)請求,創(chuàng)建對話框:
create_dialog();
檢測是否設(shè)置標(biāo)志:
if(isflagset(NAT_FLAG)){
setbflag(NAT_BFLAG);
setbflag(SIPPING_FLAG);
};
在INVITEs中開啟支持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、配置完成后,如果配置成功的話,用戶可以通過以下幾種方式來做進(jìn)一步的測試:
通過opensipsctl ul檢查終端注冊地址,通過CONTACT值和收到的地址消息。如果配置成功的話,NAT環(huán)境下顯示有不同的地址段。
使用帶NAT的終端進(jìn)行注冊測試,這里需要關(guān)閉STUN,軟電話使用外網(wǎng)地址。
使用帶NAT環(huán)境的軟電話進(jìn)行呼叫測試,查看呼叫狀態(tài)。
軟電話使用等待按鍵重新創(chuàng)建re-invite,檢查呼叫的語音是否丟失。如果環(huán)境配置成功的話,re-invite以后語音不會(huì)丟失。
4、在本講座中,我們介紹了一個(gè)如何通過軟交換結(jié)合RTP proxy實(shí)現(xiàn)簡單NAT穿透的場景測試環(huán)境中用戶首先需要在本地安裝rtp代理,并且配置不同的地址段檢測來查詢NAT環(huán)境,最后通過CFG中的NAT檢測,路由設(shè)置來協(xié)助帶NAT的終端實(shí)現(xiàn)注冊呼叫。這里再次說明,我們這里搭建的NAT環(huán)境是一個(gè)NAT的示例,它的目的是幫助讀者了解NAT場景和其基本的解決思路。事實(shí)上,在實(shí)際生產(chǎn)環(huán)境中,NAT問題是一個(gè)非常棘手的問題,目前沒有一種解決方案可以解決所有的NAT問題,不同NAT環(huán)境需要不同的配置環(huán)境和解決辦法來處理。
參考資料:
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