美文网首页
ubuntu上kamailio+rtpproxy+mediapr

ubuntu上kamailio+rtpproxy+mediapr

作者: Bluekkk | 来源:发表于2018-06-13 15:53 被阅读0次

    前言

    最近项目中需要用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+mediapr

          本文链接:https://www.haomeiwen.com/subject/gdgjeftx.html