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配置完成

你可能感兴趣的:(ubuntu上kamailio+rtpproxy+mediaproxy环境搭建)