
1、為了驗證NAT環(huán)境的測試效果,我們首先需要搭建一個(gè)簡(jiǎn)單的NAT測試環(huán)境這里,我們介紹幾種不同的NAT環(huán)境:
- 服務(wù)器在數據中心,例如,阿里云等環(huán)境。用戶(hù)側在NAT中。
- 在內網(wǎng)環(huán)境下使用路由器創(chuàng )建不同的IP地址端來(lái)測試NAT環(huán)境,例如:192.168.XX,172.16.xx或者10.0.0.0等不同地址段。如果使用這樣的環(huán)境的話(huà),我們需要設置use nat_uac_test() 。注意,這里的標志可以根據不同的IP地址段進(jìn)行不同的檢測。用戶(hù)需要參考官方文檔做相應的調整。
- 在本地創(chuàng )建一個(gè)虛擬機,設置為NAT環(huán)境,終端在此虛擬機環(huán)境中對服務(wù)器進(jìn)行呼叫測試。這是最簡(jiǎn)單的測試環(huán)境,可以模擬一個(gè)簡(jiǎn)單的NAT環(huán)境。
2、現在我們配置一個(gè)基于RTP Proxy的環(huán)境測試NAT問(wèn)題。用戶(hù)需要幾個(gè)步驟來(lái)進(jìn)行測試配置。
首先,用戶(hù)需要安裝在本機一個(gè)RTP Proxy中,通過(guò)執行命令行就可以進(jìn)行安裝:apt-get install rtpproxy。然后對RTP Proxy進(jìn)行配置,修改配置文件/ etc / default / rtpproxy:
#默認為rtpproxy
#控制插座。
#CONTROL_SOCK = “UNIX:/var/run/rtpproxy/rtpproxy.sock”
#要在UDP套接字上偵聽(tīng),請取消注釋以下行:
CONTROL_SOCK = UDP:127.0.0.1:7890
#傳遞給守護進(jìn)程的其他選項。
EXTRA_OPTS =“ - l SERVER_IP”
#此地址是IP服務(wù)器地址。
修改配置以后,重新啟動(dòng)服務(wù)器:/etc/init.d/rtpproxy restart。
。然后修改CFG文件支持我們設置的NAT環(huán)境加載所需模塊:
- loadmodule“nathelper.so”
- loadmodule“rtpproxy.so”
- loadmodule“dialog.so”
然后添加模塊支持參數:
- 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”)
#注意修改為用戶(hù)自己的服務(wù)器地址。
然后添加NAT檢測:
force_rport();
#注意這里要設置為18,具體參數設置,參考官方文檔。
if(nat_uac_test(“18”)){
if(method ==“REGISTER”){
fix_nated_register();
} else {
fix_nated_contact();
}
setflag(NAT_FLAG);
}
初始化一個(gè)請求,創(chuàng )建對話(huà)框:
create_dialog();
檢測是否設置標志:
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)){
路線(xiàn)(mediarelay);
};
添加媒體路由設置:
路線(xiàn)[mediarelay] {
if(is_method(“INVITE”)){
if(has_body(“application / sdp”)){
rtpproxy_engage();
}
}
}
設置轉發(fā)路由:
onreply_route [handle_nat] {
# - 重播塊路由 -
#
if(isbflagset(NAT_BFLAG)){
append_hf(“P-hint:Onreply-route-fixcontact \ r \ n”);
fix_nated_contact();
}
出口;
}
完成修改以后,用戶(hù)重新啟動(dòng)軟交換。
3、配置完成后,如果配置成功的話(huà),用戶(hù)可以通過(guò)以下幾種方式來(lái)做進(jìn)一步的測試:
通過(guò)opensipsctl ul檢查終端注冊地址,通過(guò)CONTACT值和收到的地址消息。如果配置成功的話(huà),NAT環(huán)境下顯示有不同的地址段。
使用帶NAT的終端進(jìn)行注冊測試,這里需要關(guān)閉STUN,軟電話(huà)使用外網(wǎng)地址。
使用帶NAT環(huán)境的軟電話(huà)進(jìn)行呼叫測試,查看呼叫狀態(tài)。
軟電話(huà)使用等待按鍵重新創(chuàng )建re-invite,檢查呼叫的語(yǔ)音是否丟失。如果環(huán)境配置成功的話(huà),re-invite以后語(yǔ)音不會(huì )丟失。
4、在本講座中,我們介紹了一個(gè)如何通過(guò)軟交換結合RTP proxy實(shí)現簡(jiǎn)單NAT穿透的場(chǎng)景測試環(huán)境中用戶(hù)首先需要在本地安裝rtp代理,并且配置不同的地址段檢測來(lái)查詢(xún)NAT環(huán)境,最后通過(guò)CFG中的NAT檢測,路由設置來(lái)協(xié)助帶NAT的終端實(shí)現注冊呼叫。這里再次說(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)注微信公眾號: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