使用kamailio进行分机注册及互拨
操作系统版本:Debian 12.5_x64
kamailio版本:5.8.2
kamailio作为专业的SIP服务器,可承担注册服务器的角色。今天记录下kamailio作为注册服务器,承接分机注册,并实现相互拨打的过程。
我将从以下几个方面展开:
- 模块配置
- 分机账号添加
- 无rtp代理的分机互拨
- 带rtp代理的分机互拨
-
配套资源下载
一、模块加载
模块文档地址:
https://kamailio.org/docs/modules/5.8.x/modules/registrar.html
模块加载及配置(使用kamailio的默认配置即可):
loadmodule "registrar.so" # ----- registrar params ----- modparam("registrar", "method_filtering", 1) /* uncomment the next line to disable parallel forking via location */ # modparam("registrar", "append_branches", 0) /* uncomment the next line not to allow more than 10 contacts per AOR */ # modparam("registrar", "max_contacts", 10) /* max value for expires of registrations */ modparam("registrar", "max_expires", 3600) /* set it to 1 to enable GRUU */ modparam("registrar", "gruu_enabled", 0)
kamailio的安装可参考这篇文章:
二、添加分机
命令格式如下:
kamctl add <username> <password>
示例:
kamctl add 2001 123456
如果提示如下错误:
ERROR: domain unknown: use usernames with domain or set default domain in SIP_DOMAIN
则需要编辑kamctlrc文件,配置SIP_DOMAIN变量。
账号信息存储在subscriber表中,效果如下:
可使用软电话注册验证,效果如下:
可添加多个用户:
kamctl add 2001 123456 kamctl add 2002 123456
数据表效果如下:
三、分机互拨
这里以内网的场景进行模拟。
分机2001和分机2002注册地址:192.168.137.1
kamailio地址:192.168.137.71
呼叫模型如下:
1、存储注册信息
配置相关模块,示例如下:
loadmodule "db_mysql.so" loadmodule "usrloc.so" modparam("usrloc", "db_url", "mysql://root:test_123@192.168.137.1/kamailio71") modparam("usrloc", "db_mode", 1) modparam("usrloc", "use_domain", MULTIDOMAIN)
这里db_mode用1,直接写数据库,也可以用2,定时刷新到数据库。
2、添加分机路由
可以使用默认的LOCATION路由,也可以自定义路由,这里以自定义路由为例进行演示。
配置相关模块,示例如下:
loadmodule "sqlops.so" modparam("sqlops","sqlcon","db=>mysql://root:test_123@192.168.137.1/kamailio71")
sqlops是用于查询数据库的"db=>"是定义的标识,后续查询时用db标签。
添加路由,使用 sql_xquery 函数查询数据库;
route(EXTEN);
路由内容如下:
route[EXTEN] { if(!is_method("INVITE")) return; xlog("L_INFO","rU is $rU \n"); if (!registered("location")) { xlog("L_INFO","$rU not registered\n"); exit; } sql_xquery("db","SELECT contact FROM location WHERE username='$rU';","rb"); if ( $xavp(rb=>contact) == $null) { xlog("L_INFO","contact is null \n"); } else { xlog("L_INFO","contact is $xavp(rb=>contact) \n"); $du = $xavp(rb=>contact); } xlog("L_INFO","rU is $rU , du is $du\n"); route(RELAY); exit; }
配置截图如下:
3、呼叫测试
这里使用分机2002拨打分机2001,路由成功,效果如下:
配套配置文件可从如下渠道获取:
关注微信公众号(聊聊博文,文末可扫码)后回复 20240902 获取。
这里没有进行rtp代理,sdp里面写的是话机的ip地址:
配套的抓包文件可从如下渠道获取:
关注微信公众号(聊聊博文,文末可扫码)后回复 20240902 获取。
四、添加rtp代理
上述步骤中,实现了sip信令代理,如果要代理rtp数据,可以使用rtpproxy或rtpengine实现,这里以rtpengine为例进行示例。
呼叫模型如下:
1、安装rtpengine
可通过apt安装:
apt install rtpengine
也可通过源码安装,具体参考:
默认配置文件:
/etc/rtpengine/rtpengine.conf
启动rtpengine:
systemctl start rtpengine
效果如下:
2、配置kamailio
文件:kamailio.cfg
加载模块,并配置参数:
loadmodule "rtpengine.so" modparam("rtpengine", "rtpengine_sock", "udp:127.0.0.1:2223")
如果使用默认配置文件的规则(kamailio.cfg),需要先定义变量:
#!define WITH_NAT
#!define WITH_RTPENGINE
配置效果如下:
配置路由(在NATMANAGE中,默认配置):
if(nat_uac_test("8")) { rtpengine_manage("SIP-source-address replace-origin replace-session-connection"); } else { rtpengine_manage("replace-origin replace-session-connection"); }
也可使用自定义路由(在NATMANAGE中):
if (has_body("application/sdp")) { rtpengine_manage("trust-address replace-origin replace-session-connection"); }
这里以默认配置为例进行演示,配置如下:
重启kamailio服务生效:
systemctl restart kamailio
配套配置文件可从如下渠道获取:
关注微信公众号(聊聊博文,文末可扫码)后回复 20240902 获取。
3、使用rtpengine进行代理
使用2002呼叫2001,并在kamailio上进行抓包。
呼叫效果如下:
使用rtpengine进行rtp代理后,sdp里面写的是kamailio的ip地址:
可使用wireshark播放rtp音频流:
配套抓包文件可从文末提供的渠道获取。
五、资源下载
本文涉及源码及相关文件,可从如下途径获取:
关注微信公众号(聊聊博文,文末可扫码)后回复 20240902 获取。
好,就这么多了,别忘了点赞哈!