Opensips安装配置(以下操作均已centOS 6.3系统为准)

  1. 安装依赖软件:

a) Yum update //更新系统到最新

b) 安装以下所需依赖软件

gcc

bison

flex

make

openssl

libmysqlclient-dev

mysql-server

c) 安装radiusclient:

  1. wget http://pkgs.repoforge.org/radiusclient-ng/radiusclient-ng-0.5.6-5.el6.rf.x86_64.rpm

  2. rpm -ivfradiusclient-ng-0.5.6-5.el6.rf.x86_64.rpm

  3. wget http://pkgs.repoforge.org/radiusclient-ng/radiusclient-ng-devel-0.5.6-5.el6.rf.x86_64.rpm

  4. rpm -ivfradiusclient-ng-devel-0.5.6-5.el6.rf.x86_64.rpm

  5. wget http://pkgs.repoforge.org/radiusclient-ng/radiusclient-ng-utils-0.5.6-5.el6.rf.x86_64.rpm

  6. rpm -ivfradiusclient-ng-utils-0.5.6-5.el6.rf.x86_64.rpm

d) 安装xmlrpc3-

yum --y install *xmlrpc3*

e) 安装perl:

  1. yum install *perl*MySQL*

  2. yum install *perl*Front*

  3. yum install *perl*Read*

f) 安装start-stop-daemon

  1. wget http://developer.axis.com/download/distribution/apps-sys-utils-start-stop-daemon-IR1_9_18-2.tar.gz

  2. tar zxf apps-sys-utils-start-stop-daemon-IR1_9_18-2.tar.gz

  3. mvapps/sys-utils/start-stop-daemon-IR1_9_18-2/ ./

  4. rm -rf apps

  5. cdstart-stop-daemon-IR1_9_18-2/

  6. cc start-stop-daemon.c -ostart-stop-daemon

  7. cp start-stop-daemon /usr/bin/start-stop-daemon

  8. 安装opensips

a) cd /usr/src

b) 下载opensips源码:

wget http://opensips.org/pub/opensips/1.6.0/src/opensips-1.6.0-tls_src.tar.gz

c) 解压缩源码:

tar -xf opensips-1.6.0-tls_src.tar.gz

d) cd opensips-1.6.0-tls

e) 编译并安装:

make prefix=/ all include_modules="db_mysql aaa_radius"

make prefix=/ install include_modules="db_mysql aaa_radius"

f) 创建运行目录

mkdir /var/run/opensips

  1. 配置系统运行环境

a) 添加opensips运行文件到linux启动项

i. cd/usr/src/opensips-1.6.0-tls/packaging/debian

ii. cp opensips.default/etc/default/opensips

iii. cp opensips.init /etc/init.d/opensips

b) 修改/etc/opensips/opensips.cfg

i. vim /etc/opensips/opensips.cfg

ii. 删掉fork=no行,即便有注释也删掉

c) 赋予opensips.init文件正确权限

i. cd /etc/init.d

ii. chmod 755 opensips

d) 编辑/etc/default/opensips

i. vim /etc/default/opensips

ii. 修改如下(红色字体):

Set to yes to enable opensips, once configured properly.

RUN_OPENSIPS=yes

User to run as

USER=root

Group to run as

GROUP=root

Amount of memory to allocate for the running OpenSIPS server (in Mb)

MEMORY=128

e) 编辑/etc/init.d/opensips,配置正确的opensips路径

i. vim /etc/init.d/opensips

ii. 修改如下(红色字体)

PATH=/sbin:/bin:/usr/sbin:/usr/bin
DAEMON=/sbin/opensips

NAME=opensips

DESC=opensips

HOMEDIR=/var/run/opensips

PIDFILE=HOMEDIR/NAME.pid

  1. 独立Log文件

a) 修改/etc/rsyslog.conf

i. vim /etc/rsyslog.conf

ii. 在文件最后添加一条:
local0.* /var/log/opensips.log

b) 重启rsyslog服务:

service rsyslog restart

  1. 启动opensips

a) 启动opensips服务:

/etc/init.d/opensips start|stop|restart

  1. 配置mysql认证支持

a) 确认db_mysql.so正常存在

ls /lib/opensips/modules/db_mysql.so

b) 修改/etc/opensips/opensipsctlrc文件,去掉如下内容的注释:

SIp_DoMAIN=115.28.38.216

DBENGINE=MYSQL

DBHoST=localhost

DBNAME=opensips

DBRWUSER=opensips

DBRWpW="opensipsrw"

DBRoUSER=opensipsro

DBRopW=opensipsro

ALIASES_TYPE="DB"

oSIpS_FIFo="/tmp/opensips_fifo"

c) 创建opensips的数据库

opensipsdbctl create

输入如下(注意红色字,一律选y):

Opensips:~# opensipsdbctl create

MySqL password for root:

INFO: test server charset

INFO: creating database opensips ...

INFO: Core Opensips tables successfully created.
Install presence related tables?(y/n): y

INFO: creatingpresence tables into opensips ...

INFO: Presence tables successfully created.
Install tables for imc cpl siptracedomainpolicy carrierroute? (y/n): y

d) 编辑/etc/opensips/opensips.cfg

修改如下(去掉如下代码的注释)
#loadmodule "db_mysql.so"
#loadmodule "auth.so"
#loadmodule "auth_db.so"
#modparam("usrloc", "db_mode", 2)
#modparam("usrloc", "db_url",

"mysql://opensips:opensipsrw@localhost/opensips")

#modparam("auth_db", "calculate_ha1", yes)
#modparam("auth_db", "password_column","password")
#modparam("auth_db", "db_url",

"mysql://opensips:opensipsrw@localhost/opensips")

#modparam("auth_db", "load_credentials", "")
##if (!(method=="REGISTER") && from_uri==myself) /*nomultidomain version*/
##{

if (!proxy_authorize("", "subscriber")) {

proxy_challenge("", "0");

exit;

}

if (!db_check_from()) {

sl_send_reply("403","Forbidden auth ID");

exit;

}

consume_credentials();

# caller authenticated

##}
#authenticate the REGISTER requests
(uncomment to enable auth)
##if (!www_authorize("", "subscriber"))
##{

www_challenge("", "0");

exit;

##}

##if (!db_check_to())
##{

sl_send_reply("403","Forbidden auth ID");

exit;

##}

e) 重启opensips服务

/etc/init.d/opensips restart

f) 添加两个用户

opensipsctl add 1000 1000

opensipsctl add 1001 1001

g) 客户端可进行登录验证

  1. 配置RTPProxy处理NAT

a) 下载并安装RTPProxy

  1. cd /usr/src

  2. wgethttp://b2bua.org/chrome/site/rtpproxy-1.2.0.tar.gz

  3. tar --xzvf rtpproxy-1.2.0.tar.gz

  4. cd rtpproxy-1.2.0

  5. ./configure

  6. make

  7. make install

b) 运行RTPProxy

rtpproxy -l 115.28.38.216 -a 10.144.59.80 -s udp:localhost:7890 -F -d INFOLOG_LOCAL1

c) 修改/etc/opensips/opensips.cfg文件

修改如下:

在#loadmodule "presence_xml.so"下面添加
loadmodule "nathelper.so"

在" #modparam("presence", "server_address","sip:192.168.1.2:5060")"下面添加:
modparam("nathelper","rtpproxy_sock", "udp:127.0.0.1:7890")
modparam("nathelper", "natping_interval", 30)
modparam("nathelper", "ping_nated_only", 0)
modparam("nathelper", "sipping_bflag", 7)
modparam("nathelper", "sipping_from","sip:pinger@127.0.0.1")
modparam("registrar","received_avp","avp(i:42)") modparam("nathelper","received_avp","avp(i:42)")

在# main request routing logic下面的代码中添加如下红色字:

main request routing logic

route{

if(!mf_process_maxfwd_header("10")) {

sl_send_reply("483","TooMany Hops");

exit;

}

#---- NAT Detection ----#

force_rport();

if (nat_uac_test("18")) {

if (is_method("REGISTER")) {

fix_nated_register();

}

else {

fix_nated_contact();

}

setflag(5);

}

if (has_totag()) {

sequentialrequest withing a dialog should

take thepath determined by record-routing

if(loose_route()) {

if(is_method("BYE")) {

setflag(1);# do accounting ...

setflag(3);# ... even if the transaction fails

}else if (is_method("INVITE")) {

#even if in most of the cases is useless, do RR for

#re-INVITEs alos, as some buggy clients do change route set

#during the dialog.

record_route();

}

#route it out to whatever destination was set by loose_route()

#in $du (destination URI).

route(1);

} else {

/*uncomment the following lines if you want to enable presence */

##if(is_method("SUBSCRIBE") && $rd =="your.server.ip.address") {

# in-dialog subscribe requests

route(2);

exit;

##}

if( is_method("ACK") ) {

if( t_check_trans() ) {

#non loose-route, but stateful ACK; must be an ACK after

#a 487 or e.g. 404 from upstream server

t_relay();

exit;

}else {

#ACK without matching transaction ->

#ignore and discard

exit;

}

}

sl_send_reply("404","Nothere");

}

exit;

}

#initial requests

CANCEL processing

if(is_method("CANCEL"))

{

if(t_check_trans())

t_relay();

exit;

}

t_check_trans();

authenticate if fromlocal subscriber (uncomment to enable auth)

authenticate allinitial non-REGISTER request that pretend to be

generated by localsubscriber (domain from FROM URI is local)

#if(!(method=="REGISTER") && from_uri==myself) /*no multidomainversion*/

##if(!(method=="REGISTER") && is_from_local()) /*multidomain version*/

#{

if (!proxy_authorize("","subscriber")) {

proxy_challenge("","0");

exit;

}

if (!db_check_from()) {

sl_send_reply("403","Forbiddenauth ID");

exit;

}

consume_credentials();

# caller authenticated

#}

preloaded routechecking

if (loose_route()) {

xlog("L_ERR",

"Attemptto route with preloaded Route's [fu/tu/ru/ci]");

if(!is_method("ACK"))

sl_send_reply("403","PreloadRoute denied");

exit;

}

record routing

if(!is_method("REGISTER|MESSAGE"))

record_route();

account only INVITEs

if(is_method("INVITE")) {

setflag(1);# do accounting

}

if (!uri==myself)

replace withfollowing line if multi-domain support is used

##if(!is_uri_host_local())

{

append_hf("P-hint:outbound\r\n");

if youhave some interdomain connections via TLS

##if($rd=="tls_domain1.net"){

t_relay("tls:domain1.net");

exit;

##} elseif($rd=="tls_domain2.net") {

t_relay("tls:domain2.net");

exit;

##}

route(1);

}

requests for mydomain

uncomment this ifyou want to enable presence server

and comment the next 'if' block

NOTE: uncomment also the definition ofroute[2] from below

##if( is_method("PUBLISH|SUBSCRIBE"))

route(2);

if(is_method("PUBLISH"))

{

sl_send_reply("503","Service Unavailable");

exit;

}

if(is_method("REGISTER"))

{

#authenticate the REGISTER requests (uncomment to enable auth)

if(!www_authorize("", "subscriber"))

{

www_challenge("","0");

exit;

}

if(!db_check_to())

{

sl_send_reply("403","Forbiddenauth ID");

exit;

}

#--Request is behind NAT(flag5) save with bflag 6 -#

#----Use bflag 7 to start SIP pinging (Options) ---#

if(isflagset(5)) {

setbflag(6);

setbflag(7);

};

if(!save("location"))

sl_reply_error();

exit;

}

if ($rU==NULL) {

requestwith no Username in RURI

sl_send_reply("484","AddressIncomplete");

exit;

}

apply DB basedaliases (uncomment to enable)

##alias_db_lookup("dbaliases");

do lookup withmethod filtering

if(!lookup("location","m")) {

switch($retcode) {

case-1:

case-3:

t_newtran();

t_reply("404","Not Found");

exit;

case -2:

sl_send_reply("405","Method Not Allowed");

exit;

}

}

when routing viausrloc, log the missed calls also

setflag(2);

route(1);

}

route[1] {

for INVITEs enablesome additional helper routes

#---- Helper route, if nat=yes in the R-URI setflag 6 ----#

#---- This is used to Process REINVITES ----#

if (subst_uri('/(sip:.*);nat=yes/\1/')){

setbflag(6);

};

#-- If caller(flag 5) or callee(flag 6) are behindNAT --#

#-- Call the route(6) to force the use of the RTPProxy --#

if (isflagset(5)||isbflagset(6)) {

route(6);

};

if (isflagset(5)){

search_append('Contact:.*sip:[^>[:cntrl:]]*',';nat=yes');

}

if(is_method("INVITE")) {

t_on_branch("2");

t_on_reply("2");

t_on_failure("1");

}

if (!t_relay()) {

sl_reply_error();

};

exit;

}

Presence route

/* uncomment the whole following route for enabling presence

NOTE: do not forget toenable the call of this route from the main

route */

##route[2]

##{

if (!t_newtran())

{

sl_reply_error();

exit;

};

if(is_method("PUBLISH"))

{

handle_publish();

t_release();

}

else

if(is_method("SUBSCRIBE"))

{

handle_subscribe();

t_release();

}

exit;

##}

route[6] {

#---- RTP Proxy handling ---#

if (is_method("BYE|CANCEL")) {

unforce_rtp_proxy();

}

else if (is_method("INVITE")){

#---- Activates the RTP Proxy for the CALLEE ---#

force_rtp_proxy();

t_on_failure("1");

};

}

branch_route[2] {

xlog("new branchat $ru\n");

}

onreply_route[2] {

xlog("incomingreply\n");

#---- Handling of the SDP for the 200 or 183 reply----#

#---- If behind nat (flags 5 or 6) start RTP Proxy----#

#---- Activates the RTP Proxy for the CALLER ----#

if ((isflagset(5) || isbflagset(6)) && status=~"(183)|(2[0-9][0-9])"){

force_rtp_proxy();

append_hf("P-hint:onreply_route|force_rtp_proxy \r\n");

}

#---- If the CALLEE is behind NAT, fix the CONTACTHF ----#

if (isbflagset(6)) {

#-- Insert nat=yes at the end of the Contactheader --#

#-- This helps with REINVITEs, --#

#- nat=yes will be included in the R-URI forseq.requests-#

search_append('Contact:.*sip:[^>[:cntrl:]]*',';nat=yes');

append_hf("P-hint: Onreply-route - fixcontact\r\n");

fix_nated_contact();

}

exit;

}

failure_route[1] {

#---- If a failure has ocurred, deactivate the RTpproxy ----#

if (isflagset(5) || isbflagset(6)){

unforce_rtp_proxy();

}

if (t_was_cancelled()){

exit;

}

uncomment thefollowing lines if you want to block client

redirect based on3xx replies.

##if(t_check_status("3[0-9][0-9]")) {

##t_reply("404","Notfound");

exit;

##}

uncomment thefollowing lines if you want to redirect the failed

calls to a differentnew destination

##if(t_check_status("486|408")) {

sethostport("192.168.2.100:5060");

# do not set the missed call flag again

t_relay();

##}

}

d) 重启opensips服务

/etc/init.d/opensips restart

相关推荐
叫我龙翔31 分钟前
【Linux】进程间关系与守护进程
linux·运维·服务器·计算机网络
小诸葛的博客32 分钟前
Ubuntu如何如何安装tcpdump
linux·ubuntu·tcpdump
S hh1 小时前
【Linux】进程地址空间
java·linux·运维·服务器·学习
wusam1 小时前
螺蛳壳里做道场:老破机搭建的私人数据中心---Centos下Docker学习04(环境准备)
学习·docker·centos
苹果醋32 小时前
大模型实战--FastChat一行代码实现部署和各个组件详解
java·运维·spring boot·mysql·nginx
梁诚斌2 小时前
VSOMEIP代码阅读整理(1) - 网卡状态监听
运维·服务器·网络
深情废杨杨3 小时前
服务器几核几G几M是什么意思?如何选择?
运维·服务器
康熙38bdc3 小时前
Linux 进程优先级
linux·运维·服务器
Web极客码3 小时前
常见的VPS或者独立服务器的控制面板推荐
运维·服务器·控制面板
hhzz3 小时前
Linux Shell编程快速入门以及案例(Linux一键批量启动、停止、重启Jar包Shell脚本)
android·linux·jar