ubuntu上kamailio+rtpproxy+mediaproxy环境搭建

前言

最近项目中需要用SIP协议栈实现实时音视频通信。因为服务器段暂时没人做,所以就用kamailio搭建了一个SIP服务器做开发测试使用。安装配置过程中踩了不少坑,现在讲整个过程总结一下。

kamailio安装配置

官方安装文档地址:

https://www.kamailio.org/wiki/install/4.4.x/git

下载源码

mkdir -p /usr/local/src/kamailio
cd /usr/local/src/kamailio
git clone --depth 1 --no-single-branch https://github.com/kamailio/kamailio kamailio
cd kamailio
git checkout -b 4.4 origin/4.4

编译配置

make cfg
nano -w modules.lst

这里需要加入db_mysql的选项,不然kamailio不会安装mysql模块

make include_modules="db_mysql dialplan" cfg

编译安装

make all && make install

安装mysql

  • 安装,安装过程中会要求输入root密码

    apt-get install mysql-server mysql-client 
    

修改配置文件

输入下面的命令编辑配置文件

vi /usr/local/etc/kamailio/kamailio.cfg

在######### Defined Values ##########前添加

#!define WITH_MYSQL 
#!define WITH_AUTH 
#!define WITH_ALIASDB 
#!define WITH_USRLOCDB
#!define WITH_NAT

修改DBURL,其中root是mysql账号,aaaaaa是密码

#!ifndef DBURL
#!define DBURL "mysql://root:aaaaaa@localhost/kamailio"
#!endif

由于我的服务器没有直接绑定公网IP,是将一个公网IP进行端口映射到这台服务器的,需要修改下面的配置选项

advertised_address="xx.xx.xx.xx"
alias="xx.xx.xx.xx"

在Route中,替换record_route()为record_route_preset(“xx.xx.xx.xx”),例如:

if (is_method("INVITE|SUBSCRIBE"))
{
    #record_route();
    record_route_preset("xx.xx.xx.xx");
}

下面还需要修改kamctlrc,运行命令:

vi /usr/local/etc/kamailio/kamctlrc

修改下面的选项

SIP_DOMAIN="xx.xx.xx.xx"
DBRWUSER="root"
DBRWPW="aaaaaa"

至此kamailio配置结束

生成kamailio数据库

在终端里输入

/usr/local/sbin/kamdbctl  create

可能会遇到需要授权的问题,需执行如下指令进行解决:

执行“mysql -u用户名 -p密码”,进入数据库,然后执行下面的语句来为用户授权

grant all on *.* to 'root'@'localhost' identified by 'yourpassword';

启动kamailio服务

输入下面的命令启动kamailio

/usr/local/sbin/kamctl  start

可能会出现:

“ERROR:PID file /var/run/kamailio/kamaillio.pid does not exist---Kamailio start failed"

需要检查如下内容

  • kamdbctlrc这个配置文件中的DBHOST处是否是127.0.0.1或者localhost,如果不是请将其修改成127.0.0.1或者localhost试试。
  • 执行“kamailio -c”来检测配置文件是否有错误,如果有报错,请根据具体报错信息解决问题。如果出现“config file ok,exiting......”,说明配置文件没有问题了。
  • 执行“kamailio -dddd”,看是否有ERROR输出,若有,请依据错误提示进行修改
  • 执行“kamailio -M 8 -E -e -dd”,查看具体错误信息

添加账号

执行如下命令,添加用户账号

kamctl  add  test1  123456

测试kamailio及常用命令

kamctl stop  //停止服务
kamctl restart //重启服务
kamctl ps //查看运行状态
tail /var/log/syslog //查看运行日志,例如启动失败日志

RTPProxy安装配置

下载

git clone git://sippy.git.sourceforge.net/gitroot/sippy/rtpproxy

配置修改

由于服务器的端口是映射的,默认kamailio的sip sdp信息里面带的中转服务器地址是服务器的内网IP,而不是公网IP,会造成中转失败。所以需要进行下面的修改。如果服务器有公网IP则不需要进行下面的修改。

下面的修改的实质是给rtpproxy命令加上一个 -A的参数,用来标识rtpproxy的公网IP

cd rtpproxy
vi main.c

cf->stable.log_facility = -1;

下面加上

cf->stable.advertised = NULL;

while ((ch = getopt(argc, argv, "vf2Rl:6:s:S:t:r:p:T:L:m:M:u:Fin:Pad:")) != -1)

改为

while ((ch = getopt(argc, argv, "vf2Rl:6:s:S:t:r:p:T:L:m:M:u:Fin:Pad:A:")) != -1)

再将

case 'f':

前面加上

case 'A':
    cf->stable.advertised = strdup(optarg);
    break;

保存退出

vi rtpp_command.c

if (lia[0] == NULL || ishostnull(lia[0]))
      len += sprintf(cp, "%d\n", lport);
else {
      len += sprintf(cp, "%d %s%s\n", lport, addr2char(lia[0]),
          (lia[0]->sa_family == AF_INET) ? "" : " 6");
}

修改为

if(cf->advertised != NULL)
     len += sprintf(cp, "%d %s%s\n", lport, cf->advertised,
         (lia[0]->sa_family == AF_INET) ? "" : " 6");
else
     len += sprintf(cp, "%d %s%s\n", lport, addr2char(lia[0]),
          (lia[0]->sa_family == AF_INET) ? "" : " 6");

保存退出。

vi rtpp_defines.h

int controlfd;

下面加上

char *advertised;

保存退出

编译安装

运行下面的命令编译安装

./configure && make && make install

启动

执行下面的命令启动rtpproxy

rtpproxy -A xx.xx.xx.xx -l 0.0.0.0 -s udp:localhost:5083 -n -F -d DBUG -m 5701 -M 5799 -d

其中

-A 服务器的外网IP
-s rtpproxy的本地端口,要和kamailio里面的配置相对应
-m rtpproxy端口号最小值
-M rtpproxy端口号最大值

kamailio配置

确保kamailio加载了TLS模块和NAT模块

#!define WITH_TLS
#!define WITH_NAT

修改kamailio配置:

vi /usr/local/etc/kamailio/kamailio.cfg

#!ifdef WITH_NAT

下面加上

modparam("rtpproxy", "rtpproxy_sock", "udp:localhost:5083")

里面的第三个参数要跟启动rtpproxy的参数相对应

接下来重新启动kamailio

kamctl restart

至此rtpproxy安装结束

MediaProxy安装配置

MediaProxy安装采用源码安装

下载源码

darcs get http://devel.ag-projects.com/repositories/mediaproxy
cd mediaproxy
darcs pull -a

配置依赖

sudo apt-get install python-dev
sudo apt-get install libnetfilter-conntrack-dev
sudo apt-get install iptables-dev

编译安装

sudo python setup.py build
sudo python setup.py install

开启ip_forward

sed -i 's#net.ipv4.ip_forward = 0#net.ipv4.ip_forward = 1#g' /etc/sysctl.conf
sysctl -p

拷贝认证文件

cd /etc/mediaproxy/tls/
sudo cp /usr/share/doc/mediaproxy-common/tls/* ./

修改配置

打开/etc/mediaproxy/config.ini,修改下面的配置

dispatchers = xx.xx.xx.xx:port
relay_ip = xx.xx.xx.xx
port_range = xxxxx:xxxxx
listen = 0.0.0.0:port
listen_management = 0.0.0.0:port+1
management_use_tls = yes
[Kamailio]
socket_path = /var/run/kamailio/

启动mediaproxy

service mediaproxy-dispatcher start  
service mediaproxy-relay start 

配置kamailio

在dialog模块加载完成后,添加

loadmodule"mediaproxy.so"
modparam("mediaproxy","disable",0)
modparam("mediaproxy","mediaproxy_socket","/var/run/mediaproxy/dispatcher.sock")
modparam("mediaproxy","mediaproxy_timeout",1000)
modparam("mediaproxy","signaling_ip_avp","$avp(nat_ip)")
modparam("mediaproxy","media_relay_avp","$avp(media_relay)")
modparam("mediaproxy","ice_candidate","high-priority")
modparam("mediaproxy","ice_candidate_avp","$avp(s:ice_priority)")

重启kamailio

kamctl restart

至此,mediaproxy配置完成

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,293评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,604评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,958评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,729评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,719评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,630评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,000评论 3 397
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,665评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,909评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,646评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,726评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,400评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,986评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,959评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,197评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,996评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,481评论 2 342

推荐阅读更多精彩内容