前言
最近項(xiàng)目中需要用SIP協(xié)議棧實(shí)現(xiàn)實(shí)時(shí)音視頻通信塑悼。因?yàn)榉?wù)器段暫時(shí)沒人做,所以就用kamailio搭建了一個(gè)SIP服務(wù)器做開發(fā)測(cè)試使用是整。安裝配置過程中踩了不少坑铡羡,現(xiàn)在講整個(gè)過程總結(jié)一下墅垮。
kamailio安裝配置
官方安裝文檔地址:
下載源碼
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”來檢測(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
測(cè)試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配置完成