linux下开源sip server : opensips 的安装+配置 +使用

来源:互联网 发布:数据的最小单位是( ) 编辑:程序博客网 时间:2024/05/23 12:17

linux下开源sip server : opensips 的安装 ,配置 与使用

update 4/12/2012:
新的版本1.8中,会有几根问题:
1 如果你的ubuntu版本是11.10,那么gcc可能是最新的版本,会有curses.h的错误,这个时候去svn下载最新的版本,在branch的版本,作者做了一个修补版本,这个版本修补了这个错误。
2 新的版本中opensipsctlrc中已经不和原来的配置文件一样了,关于db_mysql.so的配置必须要 make menuconfig 中启用,然后再make install
3 如果发现有module db_mysql does not export db_use_table function这个错误,那么确认/usr/local/opensips/modules里面有db_mysql.so,如无的话,要在menuconfig中启用,并且重新install,如果还是有问题,那么检查opensips.cfg,是否load db_mysql.so,如无则添加
4 如果发现 error 1045 ,这个是因为你的opensipsctlrc中的密码没有设置正确,请比对下文中的opensipsrw的密码,然后重启opensipsdbctl


这几天一直尝试在Linux下搭建一个Sip服务器,以便防止到了学校没有设备了,之前也在windows下找到了一个不错的Sip服务器:MiniSipServer(MSS),可见这篇文章,但是可惜的是MSS要求本地的所有PHONE都必须发送Authentication也就是授权消息,我还没做这个,所以只能留在以后使用了。因此就找到了这个在linux平台下的OpenSips,开放了源代码,配置自由的工具

安装:
1 安装Mysql,如果后面编译的时候提示没有mysql.h 可以参照这片文章  ,找不到curses.h,安装sudo apt-get install libncurses5-dev
2 下载 opensips
    http://www.opensips.org/Resources/Downloads
3 解压后,进入opensips目录
    make all  ,如果出错,一般是缺少一些编译工具,直接apt-get install xxx(相应的工具),或者是      关于mysql的,参照1的文章 。
    make install ,注意权限,这里我做了很多操作,各种chmod
配置
1 opensips数据库
   vi /usr/local/etc/opensips/opensipsctlrc  见最后附表
2 开启数据库
   /usr/local/sbin/opensipsdbctl create 
   如果出现以下错误
    “ERROR: could not load the script in /usr/local/lib/opensips/opensipsctl/opensipsdbctl.mysql for database engine MYSQL
     ERROR: database engine not loaded - tried 'MYSQL'”
     则,
     cd /usr/local/lib/opensips/opensipsctl/
     cp $(你的opensips目录)/scrips/opensipsdbctrl.mysql  ./
     mkdir mysql
     cp  $(你的opensips目录)/scrips/mysql/*.sql ./
     
    成功后,会有两个选项,全选y
3 察看设置是否正确
   /usr/local/sbin/opensipsctl -c
使用
1 开启opensips服务
   /usr/local/sbin/opensipsctl start
   关闭stop 重启restart
    这里我遇到了
     i. ERROR: PID file/var/run/opensips.pid does not exist -- OpenSIPS start failed. 的问题
     一般很多问题都会导致线程启动失败,在这里,vi /var/log/syslog,察看错误究竟出在哪里。
     我的问题是db_url没有定义,所以在opensips.cfg里面,找到了default_db_ctl,去掉注释,果然就可以运行了
     当然也有一些是权限问题。
     ii.可以手动创建mkdir /var/run/opensips/
2   添加sip用户
     opensipsctl add username password   如:opensipsctl add 100 100
     使用软电话登陆如3cx ,x-lite等,成功登陆
3   察看注册的sip用户
      opensipsctl ul show
4 是否在线
    opensipsctl online
当然,更多的命令还可以使用opensipsctl   ,就会打印出所有的命令帮助


   附表

## database type: MYSQL, PGSQL, ORACLE, DB_BERKELEY, or DBTEXT, by default none is loaded# If you want to setup a database with opensipsdbctl, you must at least specify# this parameter.
 SIP_DOMAIN= YOUR_PC_IP   //这个是你的sip proxy 地址 DBENGINE=MYSQL## database host DBHOST=localhost## database name (for ORACLE this is TNS name) DBNAME=opensips# database path used by dbtext or db_berkeley DB_PATH="/usr/local/etc/opensips/dbtext"## database read/write user DBRWUSER=opensips## password for database read/write user DBRWPW="opensipsrw"## database read only user DBROUSER=opensipsro## password for database read only user DBROPW=opensipsro## database super user (for ORACLE this is 'scheme-creator' user) DBROOTUSER="root"# user name column USERCOL="username"

5 配置opensips的模块
   vi /usr/local/etc/opensips/opensips.cfg
## $Id: opensips.cfg 8591 2011-11-26 08:27:25Z bogdan_iancu $## OpenSIPS basic configuration script#     by Anca Vamanu <anca@voice-system.ro>## Please refer to the Core CookBook at:#      http://www.opensips.org/Resources/DocsCookbooks# for a explanation of possible statements, functions and parameters.######## Global Parameters #########debug=3log_stderror=nolog_facility=LOG_LOCAL0fork=yeschildren=4/* uncomment the following lines to enable debugging */#debug=6#fork=no#log_stderror=yes/* uncomment the next line to disable TCP (default on) */disable_tcp=yes/* uncomment the next line to enable the auto temporary blacklisting of    not available destinations (default disabled) */#disable_dns_blacklist=no/* uncomment the next line to enable IPv6 lookup after IPv4 dns    lookup failures (default disabled) */#dns_try_ipv6=yes/* uncomment the next line to disable the auto discovery of local aliases   based on revers DNS on IPs (default on) */#auto_aliases=no/* uncomment the following lines to enable TLS support  (default off) */#disable_tls = no#listen = tls:your_IP:5061#tls_verify_server = 1#tls_verify_client = 1#tls_require_client_certificate = 0#tls_method = TLSv1#tls_certificate = "/usr/local/etc/opensips/tls/user/user-cert.pem"#tls_private_key = "/usr/local/etc/opensips/tls/user/user-privkey.pem"#tls_ca_list = "/usr/local/etc/opensips/tls/user/user-calist.pem"/* default db_url to be used by modules requiring DB connection;   uncomment it if you use any module requiring DB connectivity */db_default_url="mysql://opensips:opensipsrw@localhost/opensips"port=5060/* uncomment and configure the following line if you want opensips to    bind on a specific interface/port/proto (default bind on all available) */#listen=udp:192.168.1.2:5060####### Modules Section #########set module pathmpath="/usr/local/lib/opensips/modules/"/* uncomment next line for MySQL DB support */loadmodule "db_mysql.so"loadmodule "signaling.so"loadmodule "sl.so"loadmodule "tm.so"loadmodule "rr.so"loadmodule "maxfwd.so"loadmodule "usrloc.so"loadmodule "registrar.so"loadmodule "textops.so"loadmodule "mi_fifo.so"loadmodule "uri.so"loadmodule "acc.so"/* uncomment next lines for MySQL based authentication support    NOTE: a DB (like db_mysql) module must be also loaded */loadmodule "auth.so"loadmodule "auth_db.so"/* uncomment next line for aliases support   NOTE: a DB (like db_mysql) module must be also loaded */loadmodule "alias_db.so"/* uncomment next line for multi-domain support   NOTE: a DB (like db_mysql) module must be also loaded   NOTE: be sure and enable multi-domain support in all used modules         (see "multi-module params" section ) */#loadmodule "domain.so"/* uncomment the next two lines for presence server support   NOTE: a DB (like db_mysql) module must be also loaded */#loadmodule "presence.so"#loadmodule "presence_xml.so"# ----------------- setting module-specific parameters ---------------# ----- mi_fifo params -----modparam("mi_fifo", "fifo_name", "/tmp/opensips_fifo")# ----- rr params -----# do not append from tag to the RR (no need for this script)modparam("rr", "append_fromtag", 0)# ----- registrar params -----/* uncomment the next line not to allow more than 10 contacts per AOR */#modparam("registrar", "max_contacts", 10)# ----- usrloc params -----#modparam("usrloc", "db_mode",   0)/* uncomment the following lines if you want to enable DB persistency   for location entries */modparam("usrloc", "db_mode",   2)modparam("usrloc", "db_url","mysql://opensips:opensipsrw@localhost/opensips")# ----- uri params -----modparam("uri", "use_uri_table", 0)# ----- acc params -----/* what sepcial events should be accounted ? */modparam("acc", "early_media", 1)modparam("acc", "report_cancels", 1)/* by default ww do not adjust the direct of the sequential requests.   if you enable this parameter, be sure the enable "append_fromtag"   in "rr" module */modparam("acc", "detect_direction", 0)/* account triggers (flags) */modparam("acc", "failed_transaction_flag", 3)modparam("acc", "log_flag", 1)modparam("acc", "log_missed_flag", 2)/* uncomment the following lines to enable DB accounting also */modparam("acc", "db_flag", 1)modparam("acc", "db_missed_flag", 2)# ----- auth_db params -----/* uncomment the following lines if you want to enable the DB based   authentication */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", "")# ----- alias_db params -----/* uncomment the following lines if you want to enable the DB based   aliases */#modparam("alias_db", "db_url",#"mysql://opensips:opensipsrw@localhost/opensips")# ----- domain params -----/* uncomment the following lines to enable multi-domain detection   support */#modparam("domain", "db_url",#"mysql://opensips:opensipsrw@localhost/opensips")#modparam("domain", "db_mode", 1)   # Use caching# ----- multi-module params -----/* uncomment the following line if you want to enable multi-domain support   in the modules (dafault off) */#modparam("auth_db|usrloc|uri", "use_domain", 1)# ----- presence params -----/* uncomment the following lines if you want to enable presence */#modparam("presence|presence_xml", "db_url",#"mysql://opensips:opensipsrw@localhost/opensips")#modparam("presence_xml", "force_active", 1)#modparam("presence", "server_address", "sip:192.168.1.2:5060")####### Routing Logic ######### main request routing logicroute{if (!mf_process_maxfwd_header("10")) {sl_send_reply("483","Too Many Hops");exit;}if (has_totag()) {# sequential request withing a dialog should# take the path determined by record-routingif (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 servert_relay();exit;} else {# ACK without matching transaction -># ignore and discardexit;}}sl_send_reply("404","Not here");}exit;}#initial requests# CANCEL processingif (is_method("CANCEL")){if (t_check_trans())t_relay();exit;}t_check_trans();# authenticate if from local subscriber (uncomment to enable auth)# authenticate all initial non-REGISTER request that pretend to be# generated by local subscriber (domain from FROM URI is local)##if (!(method=="REGISTER") && from_uri==myself) /*no multidomain version*/##if (!(method=="REGISTER") && is_from_local())  /*multidomain 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##}# preloaded route checkingif (loose_route()) {xlog("L_ERR","Attempt to route with preloaded Route's [$fu/$tu/$ru/$ci]");if (!is_method("ACK"))sl_send_reply("403","Preload Route denied");exit;}# record routingif (!is_method("REGISTER|MESSAGE"))record_route();# account only INVITEsif (is_method("INVITE")) {setflag(1); # do accounting}if (!uri==myself)## replace with following line if multi-domain support is used##if (!is_uri_host_local()){append_hf("P-hint: outbound\r\n"); # if you have some interdomain connections via TLS##if($rd=="tls_domain1.net") {##t_relay("tls:domain1.net");##exit;##} else if($rd=="tls_domain2.net") {##t_relay("tls:domain2.net");##exit;##}route(1);}# requests for my domain## uncomment this if you want to enable presence server ##   and comment the next 'if' block##   NOTE: uncomment also the definition of route[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","Forbidden auth ID");##exit;##}if (!save("location"))sl_reply_error();exit;}if ($rU==NULL) {# request with no Username in RURIsl_send_reply("484","Address Incomplete");exit;}# apply DB based aliases (uncomment to enable)##alias_db_lookup("dbaliases");# do lookup with method filteringif (!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 via usrloc, log the missed calls alsosetflag(2);route(1);}route[1] {# for INVITEs enable some additional helper routesif (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 to enable the call of this route from the main     route */##route[2]##{##if (!t_newtran())##{##sl_reply_error();##exit;##};####if(is_method("PUBLISH"))##{##handle_publish();##}##else##if( is_method("SUBSCRIBE"))##{##handle_subscribe();##}####exit;##}branch_route[2] {xlog("new branch at $ru\n");}onreply_route[2] {xlog("incoming reply\n");}failure_route[1] {if (t_was_cancelled()) {exit;}# uncomment the following lines if you want to block client # redirect based on 3xx replies.##if (t_check_status("3[0-9][0-9]")) {##t_reply("404","Not found");##exit;##}# uncomment the following lines if you want to redirect the failed # calls to a different new destination##if (t_check_status("486|408")) {##sethostport("192.168.2.100:5060");### do not set the missed call flag again##t_relay();##}}


    
原创粉丝点击