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