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

Kamailio/OpenSIPS学习笔记-如何通过软交换呼叫PSTN

2018-04-08 10:31:03   作者:james.zhu    来源:CTI论坛   评论:0  点击:


  通过软交换呼叫PSTN是非常普遍的一个功能,但是呼叫不同的目的地号码需要对其分机权限做一个签权管理。一般的业务控制包括,系统仅允许某些分机呼叫本地,系统允许其他特别分机呼叫外地长途,系统也可能还允许一些特殊用户可以呼叫某些国家的国际长途。如何实现对分机的呼叫控制是一个软交换和媒体服务器必须具有的一个功能。在媒体服务器中,我们可以通过拨号规则对其拨号位段进行判断来进行呼叫权限控制,在软交换的呼叫流程中也可以支持类似的功能。今天,我们就通过一个配置实例来实现对其呼叫权限的控制。
  1、在Kamalio或者OpenSIPS中,如果需要实现对其呼叫路由进行权限控制,可以通过两个模块来实现。这两个模块是:Permission 和 Group 模块。
  Permission 模块主要负责提供基于ACL的权限管理,例如呼叫路由,注册权限,URL权限,地址权限,可信任请求等进行权限判断管理。
  Group 模块主要对成员属性进行管理,通过数据库对其成员进行管理。
  通过以上两个主要的模块就可以实现分机管理,可以判断是否允许本地呼叫,长途呼叫或国际长途呼叫等功能。测试环境包括:opensips 软交换, Asterisk 和语音卡配置的freepbx或Asterisk媒体服务器。
  2、为了通过以上两个模块对呼叫路由权限进行管理,我们需要设置一些配置,加载相应的模块测试来支持具体的业务设置。
  首先,管理员需要在配置文件中加载需要的模块:
  loadmodule "permissions.so"
  loadmodule "group.so"
  然后加载模块以后,用户需要配置相应的模块参数:
  modparam("permissions", "db_url",
  "mysql://opensips:opensipsrw@localhost/opensips")
  modparam("group", "db_url",
  "mysql://opensips:opensipsrw@localhost/opensips")
  注意,以上配置文件是笔者配置的数据库用户和密码,用户需要修改为自己的配置账号,否则会出现数据库连接错误。
  cfg配置文件需要添加到配置,检查呼叫源地址状态:
  if(!check_source_address(“0”)){
  if (!proxy_authorize("", "subscriber")) {
  proxy_challenge("", "0");
  exit;
  }
  if (!db_check_from()) {
  sl_send_reply("403","Forbidden auth ID");
  exit;
  }
  }
  最后,在本cfg的配置中,检查呼出的号码匹配,判断是否允许本地呼叫,外地长途呼叫和国际长途呼叫业务。注意,此代码中的通配符用户可以根据自己的呼叫拨号规则来进行修改,以便支持用户自己的呼叫号码匹配。
  #拨打一个7位数的本地号码, 这里的本地城市是0755,用户可以修改为自己的城市区号,如果其他位数本地号码的话,
  if ($rU=~"^[2-9][0-9]{6}$") {
  if (db_is_user_in("credentials","local")) {
  prefix(“0755”);
  route(4); // 路由到route(4)
  exit;
  } else {
  sl_send_reply("403", "No permissions for local calls");
  exit;
  }
  }
  # 允许呼叫长途电话,例如1+区号+用户号码
  if (uri=~"^sip:1[0-9][0-9][0-9][2-9][0-9]{6}@") {
  if (db_is_user_in("credentials","ld")) {
  route(4); // 路由到 route(4)
  exit;
  } else {
  sl_send_reply("403", "No permissions for long distance");
  exit;
  }
  }
  #国际呼叫,允许呼叫011国际区号号码
  if (uri=~"^sip:011[0-9]*@") {
  if (db_is_user_in("credentials","int")) {
  strip(3);
  route(4); // 路由到route(4)
  exit;
  } else {
  sl_send_reply("403", "No permissions for international
  calls");
  exit;
  }
  }
  ## 通过网关呼出的路由规则
  route[4] {
  # 路由到网关地址,测试环境中,这里的地址是Asterisk+sangoma 语音板卡的地址,用户也可以使用其他的媒体服务器呼出。
  rewritehostport("ip_and_port_of_the_gateway");
  route(1);
  }
  完成相关cfg文件后,用户需要通过ACL添加不同分机(1000和1001)来进行呼叫测试。具体的执行步骤如下:
  • opensipsctl acl grant 1000@domain local // 本地呼叫
  • opensipsctl acl grant 1000@domain ld // 长途呼叫
  • opensipsctl acl grant 1000@domain int // 国际呼叫
  • opensipsctl acl grant 1001@domain local // 仅允许本地呼叫
  3、配置成功以后,用户就可以使用分机1000进行测试,分机1000可以分别拨打本地电话,长途电话,和国际长途来进行测试。如果配置成功,媒体服务器或者IPPBX呼出配置正常的话,用户可以听到对端的语音响应。用户也可以使用分机1001进行呼叫测试,拨打本地号码和其他的长途号码。如果配置成功的话,分机1001 仅能允许实现本地呼叫,因为在ACL设置中,此号码仅允许实现local call的呼叫。
  笔者再次提醒读者,我们使用的是e164的N7规范,本地号码一般视为七位数号码。另外,用户呼叫到asterisk IPPBX以后,笔者做了一个拨号规则的调整,对国际长途业务进行语音播放,没有真正呼叫国际长途号码。
  另外,此实例仅是一个根据不同号码实现的呼叫权限管理的cfg配置路由。用户可以根据实际的业务需求做进一步的拓展来满足不同用户不同国家的呼叫。实际生产环境中,用户可以根据一些用户的需求实现几种部署方式:
  根据号码权限或均衡负载的要求,软交换可以路由到不同的IPPBX IP地址。
  可以根据时间和资费不同路由到不同的落地资源
  ippbx或者媒体服务器可以支持其他的解决方案,例如freepbx+sangoma 语音板卡或sangoma 网关,freeswitch加sangoma 语音板卡或网关都可以实现落地呼叫。
  4、在本章节的介绍中,我们结合开源软交换和媒体服务器或IPPBX实现对不同分机号码进行呼叫权限管理的实例。在本实例中,我们使用了两个软交换重要的模块permission和group来分别实现ACL管理和成员的管理。在配置文件中,用户需要针对不同的号码进行号码匹配,然后路由到落地的Asterisk服务器。在实际生产环境中,用户也可能添加不同的媒体服务器实现更多的业务拓展和均衡负载的要求,用户可以针对不同的策略添加最终媒体服务器的IP地址来实现。
  总之,使用permission和group可以轻松实现对分机号码的权限管理,而且也相对比较灵活,支持更好的拓展。笔者希望本实例可以给读者提供一个正确的思路,读者可以根据自己的实际环境结合业务的需求做进一步的研究。
  参考资料:
  http://www.kamailio.org.cn/doku.phpid=group_user-groups_module_with_db-backend_released
  http://www.kamailio.org.cn/doku.phpid=permissions_permissions_control_module_released
  关注微信公众号:asterisk-cn,获得有价值的行业分享
  freepbx 技术论坛:www.ippbx.org.cn
  Asterisk, freepbx技术文档: www.freepbx.org.cn
  融合通信商业解决方案,协同解决方案首选产品:www.hiastar.com
【免责声明】本文仅代表作者本人观点,与CTI论坛无关。CTI论坛对文中陈述、观点判断保持中立,不对所包含内容的准确性、可靠性或完整性提供任何明示或暗示的保证。请读者仅作参考,并请自行承担全部责任。

专题