Kamailio rtpproxy - housekeeper-software/tech GitHub Wiki

简介

Kamailio和opensips 出自同门(SER),功能和配置基本类似,但在modules和数据库略有不同。
二者都支持MeidaProxy,RtpProxy,Rtpengine三个媒体中转模块。
Kamailio最新稳定版是 5.8, opensips最新稳定版是3.4.4,我们这里使用的是 kamailio 5.8的版本。
媒体中转选择的是 [RTPProxy 3.0.1](https://github.com/sippy/rtpproxy/releases/tag/v3.0.1) 
也是最新版
安装脚本在 [安装脚本](https://github.com/housekeeper-software/tech/blob/main/kamailio-github.tar.gz) 
由于github单文件大小限制为25M,因而压缩包不包含 docker-compose,请在这里
[下载Docker-compose2.27(或者自行选择最新稳定版)](https://github.com/docker/compose/releases/download/v2.27.0/docker-compose-linux-x86_64)

mediaproxy与rtpproxy功能类似,但mediaproxy是通过linux内核实现rtp数据包中转,但linphone再次模式下有问题,
会出现conntrack timeout,因而其中一条媒体没有中转
成功,但rtpproxy是应用层中转,测试没有发现上述问题。所以,我们用rtpproxy替代mediaproxy。rtpproxy因为在应用层中转,比较消耗资源。
我们使用kamailio替代opensips,是因为opensips对 rtpproxy的支持有限,不能实现ICE。而kamailio+rtpproxy却可以支持ICE协议。

准备环境

服务器安装的是 Debian 10.9 X64,一个内网IP和一个公网IP
将kamailio.tar.gz 解压到 /build目录,目录结构如下:
/build/docker-compose-v2.27.0
/build/init
/build/kamailio
/build/mysql
/build/rtpproxy

将下载的docker-compose-linux-x86_64放在 /build/docker-compose-v2.27.0目录下即可,
cd /build/init
chmod +x *.sh

变量设置

记事本打开 /build/init/m.m4,将其中的变量替换为本机的真实数据。

divert(-1)dnl
define(`VAR_ADVERTISED_IP', `公网ip')dnl
define(`VAR_LOCAL_IP', `内网ip')dnl
define(`VAR_MYSQL_PASSWORD',`数据库密码')dnl
define(`VAR_SIP_DOMAIN',`可以是公网IP,或者主机域名')dnl
define(`VAR_TCP_MAX_CONNECTIONS',`最大TCP连接数,可以是102400,表示最大可以登录的客户端')dnl
define(`VAR_TCP_MAX_CONNECTIONS',`2048,我们目前不用tls登录,给一个很小的数值')dnl
define(`VAR_WITH_TLS',`#!define WITH_TLS')dnl #如果不想启动tls,则 define(`VAR_WITH_TLS',`')dnl
divert(0)dnl

部署基础环境

cd /build/init
./init.sh
这将安装常用的软件,包括 gcc编译环境,后面要用来编译rtpproxy
从阿里云镜像安装docker,以及docker-compose
下载 mysql数据库镜像和kamailio:5.8镜像
kamailio镜像已经上传到阿里云,由 /build/kamailio/docker下的 Dockerfile制作生成
init.sh还处理了m4的宏替换,替换的文件有:
rtpproxy.service.m4->rtpproxy.service
/build/mysql/docker-compose.yaml.m4 -> docker-compose.yaml
/build/kamailio/conf/kamctlrc.m4 -> kamctlrc
/build/kamailio/conf/kamailio.cfg.m4 -> kamailio.cfg

/build/kamailio/conf/kamdbctl.mysql 此文件不属于kamailio的配置,是用于创建mysql数据库的脚本,但脚本中有些变更
因而做了修改并保存此处,后面要用到。
kamdbctl.mysql主要的修改是让用户权限立即生效,以便后面手工创建测试账号。

编译和安装 rtpproxy

cd /build/init
./build_rtpproxy.sh
完成之后,检查 systemctl status rtpproxy,看看服务有没有成功运行。
因为github比较慢,因而我们把代码下载了放在 /build/rtpproxy/rtpproxy.tar.gz,只要解压即可编译

启动数据库

cd /build/mysql
docker-compose up -d

创建 kamailio mysql数据库

cd /build/init
./create_opensips_db.sh
此脚本创建kamailio容器,此容器只用于创建数据库,用完之后要删除
然后,按照如下的顺序执行:
docker exec -it kamailio /bin/bash
进入容器之后:执行:
1) 创建数据库: kamdbctl create
2) 创建测试账号: kamctl add 1001 123456
3)创建第二个测试账号: kamctl add 1002 123456
退出容器: exit
删除容器:
docker stop kamailio
docker rm kamailio

设置证书

如果:
define(`VAR_WITH_TLS',`#!define WITH_TLS')dnl 
则需要将证书放在 /build/kamailio/conf/certs目录下。
证书的名字统一为:
house-keeper.cn.key
house-keeper.cn.pem
脚本默认会生成一张10年有效期的自签证书。如果使用商业证书,将上述两个文件替换即可

最后一步,启动kamailio容器

cd /build/kamailio
docker-compose up -d
docker logs -f kamailio:看下容器是否成功运行

用linphone和Microsip测试

上述容器支持 ICE和 无ICE。可以分别测试。
ICE的stun地址就是 SIP服务器地址。
测试还包含,一方开启ICE,另外一方没有开启

其他

在社区内网部署,请设备端不要开启ICE。
在云端部署,各端都需要开启ICE

已知问题

如SDP中包含 ice candidate,则 rtpproxy会在其中插入 relay的 candidate。但relay后面不包含 raddr,rport,因而某些sdp parser会报错,
请检查。raddr,rport并没有实际意思,不影响ICE的穿透。

域名登录

https://blog.csdn.net/qq_41681715/article/details/107631929
kamailio.cfg中:
alias="yourname.net"  #比如 sipdev.xxx.cn
alias="xx.xx.xx.xx"
这里可以添加多个,可以确保ip和域名都可以注册

kamctlrc中:
SIP_DOMAIN=yourname.net #比如 sipdev.xxx.cn