您当前的位置是:  首页 > 新闻 > 国内 >
 首页 > 新闻 > 国内 >

Kamailio/OpenSIPS学习笔记-如何使用RTP Proxy解决NAT问题

2018-05-09 10:14:56   作者:james.zhu   来源:CTI论坛   评论:0  点击:


  NAT问题是IP通信领域中经常见到的问题。通常情况下,NAT问题主要是有振铃无语音,或者出现单通问题。因为服务器端和客户端各种NAT部署的不同,所以导致不同的NAT问题,因此各种NAT问题解决的方式也有所不同。笔者在以前的文章中讨论了几种常见的NAT的解决方法。在以前的文章中笔者已经做过非常深入的讨论,并且笔者已经讨论过,目前大部分的NAT问题可以通过STUN服务器结合媒体转发服务器来解决。今天,我们专门讨论如何使用开源软交换结合RTP Proxy来解决NAT问题。
  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
 
【免责声明】本文仅代表作者本人观点,与CTI论坛无关。CTI论坛对文中陈述、观点判断保持中立,不对所包含内容的准确性、可靠性或完整性提供任何明示或暗示的保证。请读者仅作参考,并请自行承担全部责任。

专题