首页 > 其他分享 >opensips使用drouting进行路由

opensips使用drouting进行路由

时间:2024-04-21 22:57:32浏览次数:24  
标签:网关 drouting opensips dr id 路由

操作系统 :CentOS 7.6_x64

opensips版本:2.4.9

drouting是Dynamic Routing(动态路由)的缩写,该模块可为特定呼叫选择(基于多个条件)最佳网关。今天整理下CentOS7环境下opensips2.4.9的drouting模块笔记及使用示例,并提供运行效果视频和配套文件下载。

我将从以下几方面进行展开:
  • 模块数据库说明

  • 模块参数说明

  • 模块函数说明

  • 模块使用示例

drouting模块官方文档:

https://opensips.org/docs/modules/2.4.x/drouting.html

 CentOS7环境下源码安装opensips,可参考如下文章:

CentOS7环境源码安装opensips2.4.9

一、数据表说明

该模块使用的数据表:

dr_gatewaysdr_rulesdr_carriersdr_groupsdr_partitions这里大概列举下字段说明,具体信息参考官方文档: 

https://www.opensips.org/Documentation/Install-DBSchema-2-4#AEN4756

 常用的数据表关系如下:

 

1、dr_gateways

存储路由目的地或网关信息。

  • gwid

网关的唯一id,路由规则用来寻找路由。

  • type

网关类型(用户自定义字段)。

  • address

网关的地址(ip:port格式)。

  • strip

当使用此网关时,username字段(号码)的开头需要剥离的位数。

  • pri_prefix

当使用此网关时,添加的号码前缀。

  • attrs

网关的属性信息,可以为空。

  • probe_mode

探测模式,定义如下:0 - 不探测;1 - 禁用时探测;2 - 始终探测;

  • state

网关状态,定义如下:0 - 已启用1 - 已禁用2 - 临时禁用(探测中)

  • socket

对接(或探测)该网关使用的本地socket连接,可以是udp、tcp、tls协议。

  • description

网关的描述信息,可以为空。

2、dr_rules

存储路由规则信息。

  • ruleid

路由规则的唯一id值。

  • groupid

此规则包含的路由组id,以逗号分割的数字id列表,也可以是单个数值。

  • prefix

匹配该规则的数字前缀。

  • timerec

匹配该规则的时间周期,可以为空。

  • priority

规则的优先级(prefix和timerec字段都相同时适用)。

  • routeid

规则匹配时调用的路由块(在cfg文件中配置的)。

  • gwlist

规则匹配时引用的网关列表,以逗号分割的数字id列表,也可以是单个数值。

  • attrs

路由规则的属性值,可以为空。

  • description

路由规则的描述信息,可以为空。

3、dr_carriers

存储运营商信息。

  • id

表的主键,自增,模块中不使用。

  • carrierid

运营商的唯一id值。

  • gwlist

该运营商包含的网关id列表。

  • flags

该运营商的标志信息。

  • state

该运营商的状态。

  • attrs

该运营商的属性信息。

  • description

该运营商的描述信息。

4、dr_groups

存储路由组和用户(号码)的映射关系信息。

  • id

条目的id值。

  • username

用户名,一般是号码。

  • domain

用户所属域。

  • groupid

路由组id,对应dr_rules表的groupid字段。

  • description

描述信息。

5、dr_partitions

存储路由分区信息(数据库url,表名称和分区的avp变量名称。

该表用的比较少,具体信息参考官方文档。

二、模块参数说明

模块文件:drouting.so模块参数如下:

  • db_url  

用于设置数据库连接信息。

  • probing_interval  

探测的时间间隔,单位:秒默认值:300代表关闭探测功能。

  • probing_method

探测方法,默认是发 OPTIONS 包,可以配置为发 INFO 包:modparam("drouting", "probing_method", "INFO")

  • probing_from

sip消息的from头信息。
模块加载及配置数据库

文件:opensips.cfg

配置mysql示例:

#### drouting module
loadmodule "drouting.so"
modparam("drouting", "db_url", "mysql://root:[email protected]/opensips")
modparam("drouting", "probing_interval", 30)
modparam("drouting", "probing_method", "OPTIONS")
modparam("drouting", "probing_from", "sip:[email protected]")

三、函数说明

关键函数 do_routing

do_routing([part_and_or_groupID], [flags], [gw_whitelist], [rule_attrs_pvar], [gw_attrs_pvar], [carrier_attrs_pvar])

该函数根据数据库表中的规则和配置的参数触发消息路由。此功能可用于REQUEST_ROUTE、FAILURE_ROUTE和LOCAL_ROUTE。如果将 use_partitions 设置为 1,则 part_or_groupID 参数变为必填参数。否则所有参数都是可选的。其中任何一个都可以被忽略,只要正确放置必要的逗号分隔标记。参数说明:

  • part_and_or_groupID

指定路由的分区和路由组id值,其中,分区的值可以不指定,默认为0,如果指定分区,则格式为"partition':'[groupID]"

  • flags

函数行为标志,取值如下:W - 根据目的地的权重进行排序。F - 启用规则回退。L - 对前缀进行严格的长度匹配C - 仅检查被叫号码是否与路由规则匹配,而不加载/应用任何路由信息。

  • gw_whitelist

以逗号分割的网关列表白名单。

  • rule_attrs_pvar

输出参数,将匹配到的路由属性信息回写到变量中。

  • gw_attrs_pvar

输出参数,将匹配的网关属性信息回写到变量中。

  • carrier_attrs_pvar

输出参数,将匹配的运营商属性信息回写到变量中。

函数使用示例:

# all groups, sort on order, use_partitions is 0
do_routing();
...
# all groups, sort on order, use_partitions is 1, route by partition named "part"
do_routing("part:");
...
# group id 0, sort on order, use_partitions is 0
do_routing("0");
...
# group id 0, sort on order, use_partitions is 1, route by partition named "part"
do_routing("part:0");
...
# group id from $var(id), sort on order, use_partitions is 0
do_routing("$var(id)");
...
# all groups, sort on weights, use_partitions is 0
do_routing("", "W");
...
# all groups, use_partitions is 1, partition and group supplied by AVPs, do strict length matching
do_routing("$avp(partition):$avp(grp)","L")
...
# group id 2, sort on order, fallback rule and also return the gateway attributes
do_routing("2", "F", , , "$var(gw_attributes)");

四、使用示例

这里演示下drouting模块的加载,及使用该模块实现话务路由的功能。

机器列表:

freeswitchA :192.168.137.31:5080

opensips :192.168.137.33:5060

freeswitchB :192.168.137.32:5080

测试目标:将freeeswitchA呼叫opensips的通话路由到freeswitchB机器。

1、数据库配置

数据表:dr_gateways

添加freeswitch网关信息,网关的id分别是1、2:

INSERT INTO `opensips`.`dr_gateways` (`id`, `gwid`, `address`, `socket`, `description`) VALUES (1, '1', 'sip:192.168.137.31:5080', 'udp:192.168.137.33:5060', 'freeswitchA');
INSERT INTO `opensips`.`dr_gateways` (`id`, `gwid`, `address`, `socket`, `description`) VALUES (2, '2', 'sip:192.168.137.32:5080', 'udp:192.168.137.33:5060', 'freeswitchB');

 数据表:dr_groups

添加号码路由,groupid使用200010:

INSERT INTO `opensips`.`dr_groups` (`id`, `username`, `domain`, `groupid`, `description`) VALUES (1, '02187654321', '0.0.0.0', 200010, 'fs test');
INSERT INTO `opensips`.`dr_groups` (`id`, `username`, `domain`, `groupid`, `description`) VALUES (2, '02187654322', '0.0.0.0', 200010, 'fs test');

 数据表:dr_rules添加路由规则,groupid为200010时路由到网关2:

INSERT INTO `opensips`.`dr_rules` (`ruleid`, `groupid`, `prefix`, `routeid`, `gwlist`, `description`) VALUES (1, '200010', '021', '0', '2', 'call out test1');

 2、配置opensips.cfg文件

内容如下:

#### drouting module
loadmodule "drouting.so"
modparam("drouting", "db_url", "mysql://root:[email protected]/opensips")
modparam("drouting", "probing_interval", 30)
modparam("drouting", "probing_method", "OPTIONS")
modparam("drouting", "probing_from", "sip:[email protected]")

####### Routing Logic ########
# main request routing logic

route{
    $var(grpid)=200010;
    if(do_routing("$var(grpid)")) {
        xlog("drouting ok , newru $ru, local port: $Rp, callid: [$ci] ");
        route(relay);
    }else{
        send_reply("404","No destination");
    }
    exit;

需要重启opensips:

opensipsctl restart

3、呼叫测试

在freeswitchB机器上添加如下拨号方案(public.xml):

<extension name="dp_testOP">
  <condition field="destination_number" expression="^0218765432[12]$">
    <action application="answer"/>
    <action application="playback" data="$${hold_music}"/>
  </condition>
</extension>

 在freeswitchA机器上注册分机1001,然后执行如下呼叫:

originate user/1001 &bridge({a=1}sofia/external/[email protected]:5060)

 抓包效果如下:

 运行效果视频可从如下渠道获取:

关注微信公众号(聊聊博文,文末可扫码)后回复 2024042101 获取。

五、资源下载

本文涉及资源,可从如下途径获取:

关注微信公众号(聊聊博文,文末可扫码)后回复 20240421 获取。

好,就这么多了,别忘了点赞哈!

标签:网关,drouting,opensips,dr,id,路由
From: https://www.cnblogs.com/MikeZhang/p/18149669/opdr20240421

相关文章

  • DRF之路由组件
    一、路由的写法1、原始写法(1)介绍是指手动编写路由规则的方式。使用path()函数或re_path()函数来定义路由规则,并将其与对应的视图函数或类关联起来。(2)示例假设有一个名为book的应用,它包含了一个处理图书列表的视图函数book_list,以及一个处理单个图书详情的视图函数book_de......
  • 路由组件
    Routers​ 对于视图集ViewSet,我们除了可以自己手动指明请求方式与动作action之间的对应关系,还可以使用Routers类来快速实现路由的创建SimpleRouter(常用)DefaultRouter(用的少)#方式一#1.导入Routers类fromrest_framework.routersimportDefaultRouter#2.实例化对......
  • 第27天:安全开发-PHP应用&TP框架&路由访问&对象操作&内置过滤绕过&核心漏洞 - Shortcut
     https://www.kancloud.cn/manual/thinkphp5_1/354000ThinkPHP-Vuln-master ......
  • Flask路由和蓝图
    Flask路由和蓝图目录Flask路由和蓝图路由定义查看路由信息url_map对象路径参数设置和获取add_url_rule的参数执行流程分析重定向蓝图概述基本使用内部静态文件内部模板目录参考资料路由定义在Flask中,路由用于将HTTP请求与特定的Python函数相匹配。通过定义路由,Flask应用程序可......
  • webapi路由
    ShopController.cspublicclassShopController:ApiControllerBase{[Route("api/v1/shop/watermark")][HttpPost]publicApiResultwatermark(dynamicvalue){//watermark/shopname.txtA......
  • 在Linux中,如何使用MTR进行网络诊断和路由跟踪?
    mtr(MyTraceroute)是一个结合了traceroute和ping功能的网络诊断工具。它可以显示到目的主机的数据包传输路径,并持续监测每个路径点的丢包率和延迟。以下是使用mtr进行网络诊断和路由跟踪的详细步骤:1.安装mtr首先,你需要确保你的Linux系统上已经安装了mtr。你可以使用包管理器来......
  • NGINX Ingress Controller 设置未配置过的域名增加默认路由
    背景k8s集群对应的公网slbip经常被人绑定域名,监控侧经常会收集到502相关状态码的异常告警,着手处理这种badcase策略1.所有没有在ingress配置过的域名要进行处理,即不是公司的、非法绑定到slb上的域名要加上一条策略2.NGINXIngressController设置未配置过的域名......
  • 跨网段通信实战(支持静态路由表的家用路由)
    具体情况如下:光猫:拨号上网和分配ip,4个lan口相当于最顶层的入户设备,192.168.1.0/24接光猫的路由器A:WAN口192.168.1.18,LAN口192.168.0.0/24接光猫的路由器B:WAN口192.168.1.19,LAN口192.168.6.0/24接路由器A的路由器C:连接在路由器A的LAN口下,DHCP池为192.168.2.0/24接路由器C的......
  • Yii2-url路由配置
    Yii2-url路由配置没做任何处理的情况下,url地址如下http://www.yii2-basic.com/index.php?r=site/about去掉index.php和开启url美化/web/目录下添加.htaccess文件RewriteEngineon#如果是一个目录或者文件,就访问目录或文件RewriteCond%{REQUEST_FILENAME}!-d......
  • 03 Vue3路由
    Vue3的路由与Vue2相似,关于Vue2的路由器相关可以参考Vue2vue-router下面是一些补充路由器工作模式history模式优点:URL更加美观,不带有#,更接近传统的网站URL。缺点:后期项目上线,需要服务端配合处理路径问题,否则刷新会有404错误。constrouter=createRouter({ history:c......