
1、为了验证NAT环境的测试效果,我们首先需要搭建一个简单的NAT测试环境这里,我们介绍几种不同的NAT环境:
- 服务器在数据中心,例如,阿里云等环境。用户侧在NAT中。
- 在内网环境下使用路由器创建不同的IP地址端来测试NAT环境,例如:192.168.XX,172.16.xx或者10.0.0.0等不同地址段。如果使用这样的环境的话,我们需要设置use nat_uac_test() 。注意,这里的标志可以根据不同的IP地址段进行不同的检测。用户需要参考官方文档做相应的调整。
- 在本地创建一个虚拟机,设置为NAT环境,终端在此虚拟机环境中对服务器进行呼叫测试。这是最简单的测试环境,可以模拟一个简单的NAT环境。
2、现在我们配置一个基于RTP Proxy的环境测试NAT问题。用户需要几个步骤来进行测试配置。
首先,用户需要安装在本机一个RTP Proxy中,通过执行命令行就可以进行安装:apt-get install rtpproxy。然后对RTP Proxy进行配置,修改配置文件/ etc / default / rtpproxy:
#默认为rtpproxy
#控制插座。
#CONTROL_SOCK = “UNIX:/var/run/rtpproxy/rtpproxy.sock”
#要在UDP套接字上侦听,请取消注释以下行:
CONTROL_SOCK = UDP:127.0.0.1:7890
#传递给守护进程的其他选项。
EXTRA_OPTS =“ - l SERVER_IP”
#此地址是IP服务器地址。
修改配置以后,重新启动服务器:/etc/init.d/rtpproxy restart。
。然后修改CFG文件支持我们设置的NAT环境加载所需模块:
- 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”)
#注意修改为用户自己的服务器地址。
然后添加NAT检测:
force_rport();
#注意这里要设置为18,具体参数设置,参考官方文档。
if(nat_uac_test(“18”)){
if(method ==“REGISTER”){
fix_nated_register();
} else {
fix_nated_contact();
}
setflag(NAT_FLAG);
}
初始化一个请求,创建对话框:
create_dialog();
检测是否设置标志:
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);
};
添加媒体路由设置:
路线[mediarelay] {
if(is_method(“INVITE”)){
if(has_body(“application / sdp”)){
rtpproxy_engage();
}
}
}
设置转发路由:
onreply_route [handle_nat] {
# - 重播块路由 -
#
if(isbflagset(NAT_BFLAG)){
append_hf(“P-hint:Onreply-route-fixcontact \ r \ n”);
fix_nated_contact();
}
出口;
}
完成修改以后,用户重新启动软交换。
3、配置完成后,如果配置成功的话,用户可以通过以下几种方式来做进一步的测试:
通过opensipsctl ul检查终端注册地址,通过CONTACT值和收到的地址消息。如果配置成功的话,NAT环境下显示有不同的地址段。
使用带NAT的终端进行注册测试,这里需要关闭STUN,软电话使用外网地址。
使用带NAT环境的软电话进行呼叫测试,查看呼叫状态。
软电话使用等待按键重新创建re-invite,检查呼叫的语音是否丢失。如果环境配置成功的话,re-invite以后语音不会丢失。
4、在本讲座中,我们介绍了一个如何通过软交换结合RTP proxy实现简单NAT穿透的场景测试环境中用户首先需要在本地安装rtp代理,并且配置不同的地址段检测来查询NAT环境,最后通过CFG中的NAT检测,路由设置来协助带NAT的终端实现注册呼叫。这里再次说明,我们这里搭建的NAT环境是一个NAT的示例,它的目的是帮助读者了解NAT场景和其基本的解决思路。事实上,在实际生产环境中,NAT问题是一个非常棘手的问题,目前没有一种解决方案可以解决所有的NAT问题,不同NAT环境需要不同的配置环境和解决办法来处理。
参考资料:
http://www.kamailio.org.cn/doku.php?id=dispatcher_dispatcher_load-balancer_module_released
http://wiki.kolmisoft.com/index.php/Implementations



关注微信公众号:asterisk-cn,获得有价值的行业分享
freepbx 技术论坛:www.ippbx.org.cn
Asterisk, freepbx技术文档: www.freepbx.org.cn
欧米(Omni)智能客服解决方案
融合通信商业解决方案,协同解决方案首选产品:www.hiastar.com