Featured image of post opensips drouting 模块

opensips drouting 模块

背景

动态路由可以根据前缀,被叫/组,时间,权重等因素来选择最优的路由路径。

官方文档:drouting

本次测试的opensips版本为:

version: opensips 3.5.5 (x86_64/linux)

配置解析

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
数据库地址
modparam("drouting", "db_url","DBURL")
# gateway表
modparam("drouting", "drd_table", "dr_gateways")
# 路由表
modparam("drouting", "drr_table", "dr_rules")
# 路由组表
modparam("drouting", "drg_table", "dr_groups")
# carriers表
modparam("drouting", "drc_table", "dr_carriers")
# 黑名单表
modparam("drouting", "define_blacklist", 'bl_name= 3,5,25,23')
# 强制dns解析
modparam("drouting", "force_dns", 0)
# 持久化状态
modparam("drouting", "persistent_state", 0)
# 如果为1,则不允许并发重新加载配置,当有大量路由时,能避免内存暴增。
modparam("drouting", "no_concurrent_reload", 1)
# 路由探测时间间隔
modparam("drouting", "probing_interval", 60)
# 路由探测方法
modparam("drouting", "probing_method", "INFO")
# 路由探测来源
modparam("drouting", "probing_from", "sip:pinger@192.168.2.10")
# 路由探测回复码
modparam("drouting", "probing_reply_codes", "501, 403")
# 路由探测socket
modparam("drouting", "probing_socket", "udp:192.168.1.100:5060")
# 当从数据库获取网关时,网关加载的过滤条件, "all": 所有网关加载到内存.
# "matched-only": 只加载socket匹配的网关.
# "ignore": 忽略配置网关的socket值。
modparam("drouting", "gw_socket_filter_mode", "matched-only")

该模块总共使用dr_rules,dr_gateways,dr_carriers,dr_groups,dr_partitions五张表。

重要函数

do_routing([groupID], [flags], [gw_whitelist], [rule_attrs_pvar], [gw_attrs_pvar], [carrier_attrs_pvar], [partition])

根据规则路由

route_to_carrier( carriers, [gw_attrs_pvar], [carrier_attrs_pvar], [partition])

路由到carriers表

route_to_gw(gw_id, [gw_attrs_var], [carrier_attrs_var], [partition])

路由到gw_id网关

use_next_gw( [rule_attrs_pvar], [gw_attrs_pvar], [carrier_attrs_pvar], [partition])

使用下一个网关

goes_to_gw( [type], [flags], [gw_attrs_pvar], [carrier_attrs_pvar], [partition])

判断当前的请求URI是否路由到网关

is_from_gw([type], [flags], [gw_attrs_pvar], [carrier_attrs_pvar], [partition])

判断当前的发送信息(source IP + source port)是否路由到网关

dr_is_gw( sip_uri, [type], [flags], [gw_attrs_pvar], [carrier_attrs_pvar], [partition])

判断sip_uri是否路由到网关

dr_disable([partition])

设置路由禁用

dr_match(groupID, [flags], number, [rule_attrs_pvar], [partition])

number 和 groupID 匹配

实战

配置示例

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
socket=udp:172.16.4.111:5260
socket=udp:172.16.4.111:5261

...
loadmodule "drouting.so"
modparam("drouting", "db_url","mysql://opensips:opensipsrw@172.16.4.111/opensips_3_5")

...

route{
    ...
    route_to_gw("1");
#    if (!lookup("location","method-filtering")) {
#               t_newtran();
#               t_reply(404, "Not Found");
#               exit;
#       }
#
    route(relay);
}
  1. dr_gateways表插入数据:
1
2
3
4
INSERT INTO opensips_3_5.dr_gateways
  (`gwid`, `type`, `address`, `pri_prefix`, `attrs`, `probe_mode`, `socket`, `description`)
VALUES
  ('1', 0, '172.16.4.114:5060', '10', 'ping fs', 2, 'udp:172.16.4.111:5260', 'test');
  1. dr_groups表插入数据:
1
2
3
4
INSERT INTO opensips_3_5.dr_groups
  (`username`, `domain`, `groupid`, `description`)
VALUES
  ('1004','172.16.4.111', 2, 'test');
  1. dr_rules表插入数据:
1
2
3
4
INSERT INTO opensips_3_5.dr_rules
  (`groupid`,`prefix`,`timerec`, `priority`, `routeid`,`gwlist`,`sort_profile`,`attrs`,`description`)
VALUES
  ('2','1','1753084591', 1, '3','GW-1', 0,'test-rules','test description');
  1. dr_carriers表插入数据:
1
2
3
4
INSERT INTO opensips_3_5.dr_carriers
  (`carrierid`,`gwlist`,`flags`, `sort_alg`, `attrs`,`description`)
VALUES
  ('3','GW-1',0, 'N','test-carriers','carriers description');

测试

使用软电话1004拨打1008, 可以看到的信令图: sip

目前只成功使用route_to_gw, 其他的do_routing,route_to_carrier没使用成功。

本博客已稳定运行
发表了57篇文章 · 总计94.35k字
本站总访问量 次 · 您是本站第 位访问者
粤ICP备2025368587号-1| 使用 Hugo 构建
主题 StackJimmy 设计