操作系统版本: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的安装可参考这篇文章:

kamailio5.8安装及配置

二、添加分机

命令格式如下:

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

也可通过源码安装,具体参考:

debian10环境安装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 获取。

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

使用kamailio进行分机注册及互拨的更多相关文章

  1. 基于OpenSIPS 实现分机注册服务服务器

    呼叫中心平台中坐席是不可或缺的一环,而坐席打电话自然需要使用办公分机.通常情况下我们通过软交换平台FreeSWITCH.Asterisk即可搭建分机注册服务. 但单台FreeSWITCH或Asteri ...

  2. apply-register-acl 参数允许FreeSWITCH分机注册/拨打不验证密码

    今天调试 发现 注册的分机 的 `Auth-User` 居然是 `unknown` !!! 怎么回事? 仔细对比检查 发现, internal profile 指定了 `apply-register- ...

  3. js两个数组去重后,绑定控件,并支持模糊搜索数组项以及数组互移

    设计大概是这个样子的,很简单,两个div,两个互移按钮,一个搜索框,要求搜索框输入时,触发待选框的搜索项 <input class="form-control" placeh ...

  4. miniSipServer简单而不简单,轻松落地,实现电脑对固话、手机通讯

    最近沉迷于SIP通讯,网内通讯全免费,落地也就几分钱,而且无漫游全国拨打,想想真是心动呢,只要有网落就ok!. 对于sipserver,现在的市场上软件很多,免费的.收费的应有尽有,这里不一一例举.综 ...

  5. FreeSWITCH 学习笔记

    [1]FreeSWITCH学习笔记 1.Windows安装包下载地址:http://files.freeswitch.org/windows/installer/ 2.源码下载地址:http://fi ...

  6. 基站搭建与IMSI捕获

     写在前面 : 实验目的是为了教学交流,坚决抵制违法行为. 一.实验目的 搭建基于OpenBTS的基站,手机接入该基站,进行短信.语音等测试. 二.所用仪器 USRP B210 1台,天线2根,PC机 ...

  7. freeswitch简介

    freeswitch简介 freeswitch是开源的,免费的. freeswitch是一款非常好用的电话软交换框架,支持跨平台,扩展性良好,配置灵活. freeswitch可以在很多平台上运行,包括 ...

  8. 如何传递大文件(GB级别)

    一.拆分:压缩工具,压缩并拆分为多个小文件. 二.QQ离线传输 QQ离线文件有限制条件: 1.离线传送的文件,为用户保存7天,逾期接收方不接收文件,系统将自动删除该文件: 2. 离线传送的文件,单个文 ...

  9. FreeSWITCH 处理Refer盲转时,UUI传递不对(没有将SIP 消息头Refer-To中的User-to-User传递给B-Leg)

    运行环境:     CentOS 7.6     FreeSWICH 1.6.18   一.问题场景:     FreeSWITCH收到REFER命令后,重新发起的INVITE消息中的 "U ...

  10. GIF Movie Gear逆向实战+注册代码+补丁

    GIF Movie Gear逆向实战+注册代码+补丁 准备 我是在windows 8.1 x64上进行的操作.有不足之处,还望大虾指出. 获取资源 网站下载:http://www.gamani.com ...

随机推荐

  1. VulnHub_DC-5渗透流程

    DC-5 主机探测 nmap 192.168.157.0/24 访问网站 探测网站得知是Nginx 目录扫描 在Contact处可以提交东西,抓个包,发现在thankyou.php界面时间年份会变,应 ...

  2. 深耕分析型数据库领域,火山引擎ByteHouse入围《2024爱分析数据库厂商全景报告》

    更多技术交流.求职机会,欢迎关注字节跳动数据平台微信公众号,回复[1]进入官方交流群. 近日,爱分析发布<2024爱分析·数据库厂商全景报告>,报告中爱分析将数据市场从上至下划分为数据库服 ...

  3. Java-MVC开发模式

    MVC开发模式 1. jsp演变历史 1. 早期只有Servlet,只能使用response输出标签数据,非常麻烦 2. 后来又jsp,简化了Servlet的开发,如果过度使用jsp,在jsp中即写大 ...

  4. [oeasy]python0016_在vim中直接运行python程序

    回忆上次内容 上次 置换 esc 和 caps lock 任何操作 都可以在 不移动 手腕的状态下完成了 每次都要 退出vim编辑器 才能 在shell中 运行python程序 有点麻烦 想要 不退出 ...

  5. [rCore学习笔记 04]安装SSH

    因为每一个老嵌入式都喜欢使用他的老windows进行开发,因此我决定使用SSH来开发rust,这样也不用在虚拟机里边再装一个vscode. 参考博客 如何在windows下使用vscode连接linu ...

  6. 字符—字符与整数的关系&&常用的库函数_C

    // Code file created by C Code Develop #include "ccd.h" #include "stdio.h" #incl ...

  7. 用jacoco统计JAVA项目测试代码覆盖率

    一.概述 Jacoco 统计的是全量代码覆盖率.它不仅支持生成单元测试的覆盖率,也支持监控生成接口测试,功能测试的覆盖率. 在新一代精准测试技术流的影响中,各大型单位对覆盖率的追求越来越迫切.作为一款 ...

  8. cpu亲和性相关函数和宏 基础讲解[cpu_set_t]

    cpu亲和性相关函数和宏讲解: 写在前面: 我在查找关于linux cpu宏函数没看到有对宏函数基础的.详细的讲解,笔者便通过官方文档入手,对次进行的翻译和理解希望能帮到对这方面宏有疑惑的读者 exp ...

  9. 【C】Re01

    一.GCC分步编译 xxx.c文件经历的一系列编译过程: #include <stdio.h> int main() { printf("Hello, World!\n" ...

  10. 如何在jax框架的jit中快速的实现循环结构 —— Jax框架的jit编译是否可以使用循环结构

    相关: Jax框架的jit编译是否可以使用循环结构,如果使用循环结构需要注意什么 前文中给出了jit下使用python做循环结构的代码,下面再次给出这个代码,这个代码为jupyter-notebook ...