ubuntu上kamailio+rtpproxy+mediaproxy環(huán)境搭建

前言

最近項(xiàng)目中需要用SIP協(xié)議棧實(shí)現(xiàn)實(shí)時(shí)音視頻通信。因?yàn)榉?wù)器段暫時(shí)沒人做,所以就用kamailio搭建了一個(gè)SIP服務(wù)器做開發(fā)測試使用。安裝配置過程中踩了不少坑,現(xiàn)在講整個(gè)過程總結(jié)一下。

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的選項(xiàng),不然kamailio不會(huì)安裝mysql模塊

make include_modules="db_mysql dialplan" cfg

編譯安裝

make all && make install

安裝mysql

  • 安裝,安裝過程中會(huì)要求輸入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賬號(hào),aaaaaa是密碼

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

由于我的服務(wù)器沒有直接綁定公網(wǎng)IP,是將一個(gè)公網(wǎng)IP進(jìn)行端口映射到這臺(tái)服務(wù)器的,需要修改下面的配置選項(xiàng)

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,運(yùn)行命令:

vi /usr/local/etc/kamailio/kamctlrc

修改下面的選項(xiàng)

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

至此kamailio配置結(jié)束

生成kamailio數(shù)據(jù)庫

在終端里輸入

/usr/local/sbin/kamdbctl  create

可能會(huì)遇到需要授權(quán)的問題,需執(zhí)行如下指令進(jìn)行解決:

執(zhí)行“mysql -u用戶名 -p密碼”,進(jìn)入數(shù)據(jù)庫,然后執(zhí)行下面的語句來為用戶授權(quán)

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

啟動(dòng)kamailio服務(wù)

輸入下面的命令啟動(dòng)kamailio

/usr/local/sbin/kamctl  start

可能會(huì)出現(xiàn):

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

需要檢查如下內(nèi)容

  • kamdbctlrc這個(gè)配置文件中的DBHOST處是否是127.0.0.1或者localhost,如果不是請(qǐng)將其修改成127.0.0.1或者localhost試試。
  • 執(zhí)行“kamailio -c”來檢測配置文件是否有錯(cuò)誤,如果有報(bào)錯(cuò),請(qǐng)根據(jù)具體報(bào)錯(cuò)信息解決問題。如果出現(xiàn)“config file ok,exiting......”,說明配置文件沒有問題了。
  • 執(zhí)行“kamailio -dddd”,看是否有ERROR輸出,若有,請(qǐng)依據(jù)錯(cuò)誤提示進(jìn)行修改
  • 執(zhí)行“kamailio -M 8 -E -e -dd”,查看具體錯(cuò)誤信息

添加賬號(hào)

執(zhí)行如下命令,添加用戶賬號(hào)

kamctl  add  test1  123456

測試kamailio及常用命令

kamctl stop  //停止服務(wù)
kamctl restart //重啟服務(wù)
kamctl ps //查看運(yùn)行狀態(tài)
tail /var/log/syslog //查看運(yùn)行日志,例如啟動(dòng)失敗日志

RTPProxy安裝配置

下載

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

配置修改

由于服務(wù)器的端口是映射的,默認(rèn)kamailio的sip sdp信息里面帶的中轉(zhuǎn)服務(wù)器地址是服務(wù)器的內(nèi)網(wǎng)IP,而不是公網(wǎng)IP,會(huì)造成中轉(zhuǎn)失敗。所以需要進(jìn)行下面的修改。如果服務(wù)器有公網(wǎng)IP則不需要進(jìn)行下面的修改。

下面的修改的實(shí)質(zhì)是給rtpproxy命令加上一個(gè) -A的參數(shù),用來標(biāo)識(shí)rtpproxy的公網(wǎng)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;

保存退出

編譯安裝

運(yùn)行下面的命令編譯安裝

./configure && make && make install

啟動(dòng)

執(zhí)行下面的命令啟動(dòng)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 服務(wù)器的外網(wǎng)IP
-s rtpproxy的本地端口,要和kamailio里面的配置相對(duì)應(yīng)
-m rtpproxy端口號(hào)最小值
-M rtpproxy端口號(hào)最大值

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")

里面的第三個(gè)參數(shù)要跟啟動(dòng)rtpproxy的參數(shù)相對(duì)應(yīng)

接下來重新啟動(dòng)kamailio

kamctl restart

至此rtpproxy安裝結(jié)束

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

拷貝認(rèn)證文件

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/

啟動(dòng)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配置完成

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,677評(píng)論 19 139
  • feisky云計(jì)算、虛擬化與Linux技術(shù)筆記posts - 1014, comments - 298, trac...
    不排版閱讀 4,368評(píng)論 0 5
  • Ubuntu的發(fā)音 Ubuntu,源于非洲祖魯人和科薩人的語言,發(fā)作 oo-boon-too 的音。了解發(fā)音是有意...
    螢火蟲de夢(mèng)閱讀 100,795評(píng)論 9 468
  • 2017.03.02 周四 2004年我在江北商大附近買了一處70多平明廳房子(現(xiàn)在格局都不落伍)。那時(shí)打算買二套...
    魅力春天閱讀 178評(píng)論 0 1
  • 憤怒! 今日記事:下午去圖書館借書,一進(jìn)門口有個(gè)約摸十一二歲的小朋友甜甜地叫了我一聲姐姐。那時(shí)候還...
    00呀閱讀 278評(píng)論 0 0

友情鏈接更多精彩內(nèi)容