分享

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

 free_light 2014-03-17
分类: 2012 Android VoIP 软电话 2012-03-20 23:55 6384人阅读 评论(4) 收藏 举报

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
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   ,就会打印出所有的命令帮助


   附表

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

5 配置opensips的模块
   vi /usr/local/etc/opensips/opensips.cfg
  1. #  
  2. # $Id: opensips.cfg 8591 2011-11-26 08:27:25Z bogdan_iancu $  
  3. #  
  4. # OpenSIPS basic configuration script  
  5. #     by Anca Vamanu <anca@voice-system.ro>  
  6. #  
  7. # Please refer to the Core CookBook at:  
  8. #      http://www./Resources/DocsCookbooks  
  9. # for a explanation of possible statements, functions and parameters.  
  10. #  
  11.   
  12.   
  13. ####### Global Parameters #########  
  14.   
  15. debug=3  
  16. log_stderror=no  
  17. log_facility=LOG_LOCAL0  
  18.   
  19. fork=yes  
  20. children=4  
  21.   
  22. /* uncomment the following lines to enable debugging */  
  23. #debug=6  
  24. #fork=no  
  25. #log_stderror=yes  
  26.   
  27. /* uncomment the next line to disable TCP (default on) */  
  28. disable_tcp=yes  
  29.   
  30. /* uncomment the next line to enable the auto temporary blacklisting of   
  31.    not available destinations (default disabled) */  
  32. #disable_dns_blacklist=no  
  33.   
  34. /* uncomment the next line to enable IPv6 lookup after IPv4 dns   
  35.    lookup failures (default disabled) */  
  36. #dns_try_ipv6=yes  
  37.   
  38. /* uncomment the next line to disable the auto discovery of local aliases  
  39.    based on revers DNS on IPs (default on) */  
  40. #auto_aliases=no  
  41.   
  42. /* uncomment the following lines to enable TLS support  (default off) */  
  43. #disable_tls = no  
  44. #listen = tls:your_IP:5061  
  45. #tls_verify_server = 1  
  46. #tls_verify_client = 1  
  47. #tls_require_client_certificate = 0  
  48. #tls_method = TLSv1  
  49. #tls_certificate = "/usr/local/etc/opensips/tls/user/user-cert.pem"  
  50. #tls_private_key = "/usr/local/etc/opensips/tls/user/user-privkey.pem"  
  51. #tls_ca_list = "/usr/local/etc/opensips/tls/user/user-calist.pem"  
  52.   
  53. /* default db_url to be used by modules requiring DB connection;  
  54.    uncomment it if you use any module requiring DB connectivity */  
  55. db_default_url="mysql://opensips:opensipsrw@localhost/opensips"  
  56.   
  57.   
  58. port=5060  
  59.   
  60. /* uncomment and configure the following line if you want opensips to   
  61.    bind on a specific interface/port/proto (default bind on all available) */  
  62. #listen=udp:192.168.1.2:5060  
  63.   
  64.   
  65. ####### Modules Section ########  
  66.   
  67. #set module path  
  68. mpath="/usr/local/lib/opensips/modules/"  
  69.   
  70. /* uncomment next line for MySQL DB support */  
  71. loadmodule "db_mysql.so"  
  72. loadmodule "signaling.so"  
  73. loadmodule "sl.so"  
  74. loadmodule "tm.so"  
  75. loadmodule "rr.so"  
  76. loadmodule "maxfwd.so"  
  77. loadmodule "usrloc.so"  
  78. loadmodule "registrar.so"  
  79. loadmodule "textops.so"  
  80. loadmodule "mi_fifo.so"  
  81. loadmodule "uri.so"  
  82. loadmodule "acc.so"  
  83. /* uncomment next lines for MySQL based authentication support   
  84.    NOTE: a DB (like db_mysql) module must be also loaded */  
  85. loadmodule "auth.so"  
  86. loadmodule "auth_db.so"  
  87. /* uncomment next line for aliases support  
  88.    NOTE: a DB (like db_mysql) module must be also loaded */  
  89. loadmodule "alias_db.so"  
  90. /* uncomment next line for multi-domain support  
  91.    NOTE: a DB (like db_mysql) module must be also loaded  
  92.    NOTE: be sure and enable multi-domain support in all used modules  
  93.          (see "multi-module params" section ) */  
  94. #loadmodule "domain.so"  
  95. /* uncomment the next two lines for presence server support  
  96.    NOTE: a DB (like db_mysql) module must be also loaded */  
  97. #loadmodule "presence.so"  
  98. #loadmodule "presence_xml.so"  
  99.   
  100.   
  101. # ----------------- setting module-specific parameters ---------------  
  102.   
  103.   
  104. # ----- mi_fifo params -----  
  105. modparam("mi_fifo", "fifo_name", "/tmp/opensips_fifo")  
  106.   
  107.   
  108. # ----- rr params -----  
  109. # do not append from tag to the RR (no need for this script)  
  110. modparam("rr", "append_fromtag", 0)  
  111.   
  112.   
  113. # ----- registrar params -----  
  114. /* uncomment the next line not to allow more than 10 contacts per AOR */  
  115. #modparam("registrar", "max_contacts", 10)  
  116.   
  117.   
  118. # ----- usrloc params -----  
  119. #modparam("usrloc", "db_mode",   0)  
  120. /* uncomment the following lines if you want to enable DB persistency  
  121.    for location entries */  
  122. modparam("usrloc", "db_mode",   2)  
  123. modparam("usrloc", "db_url",  
  124.     "mysql://opensips:opensipsrw@localhost/opensips")  
  125.   
  126.   
  127. # ----- uri params -----  
  128. modparam("uri", "use_uri_table", 0)  
  129.   
  130.   
  131. # ----- acc params -----  
  132. /* what sepcial events should be accounted ? */  
  133. modparam("acc", "early_media", 1)  
  134. modparam("acc", "report_cancels", 1)  
  135. /* by default ww do not adjust the direct of the sequential requests.  
  136.    if you enable this parameter, be sure the enable "append_fromtag"  
  137.    in "rr" module */  
  138. modparam("acc", "detect_direction", 0)  
  139. /* account triggers (flags) */  
  140. modparam("acc", "failed_transaction_flag", 3)  
  141. modparam("acc", "log_flag", 1)  
  142. modparam("acc", "log_missed_flag", 2)  
  143. /* uncomment the following lines to enable DB accounting also */  
  144. modparam("acc", "db_flag", 1)  
  145. modparam("acc", "db_missed_flag", 2)  
  146.   
  147.   
  148. # ----- auth_db params -----  
  149. /* uncomment the following lines if you want to enable the DB based  
  150.    authentication */  
  151. modparam("auth_db", "calculate_ha1", yes)  
  152. modparam("auth_db", "password_column", "password")  
  153. #modparam("auth_db", "db_url","mysql://opensips:opensipsrw@localhost/opensips")  
  154. #modparam("auth_db", "load_credentials", "")  
  155.   
  156.   
  157. # ----- alias_db params -----  
  158. /* uncomment the following lines if you want to enable the DB based  
  159.    aliases */  
  160. #modparam("alias_db", "db_url",  
  161. #   "mysql://opensips:opensipsrw@localhost/opensips")  
  162.   
  163.   
  164. # ----- domain params -----  
  165. /* uncomment the following lines to enable multi-domain detection  
  166.    support */  
  167. #modparam("domain", "db_url",  
  168. #   "mysql://opensips:opensipsrw@localhost/opensips")  
  169. #modparam("domain", "db_mode", 1)   # Use caching  
  170.   
  171.   
  172. # ----- multi-module params -----  
  173. /* uncomment the following line if you want to enable multi-domain support  
  174.    in the modules (dafault off) */  
  175. #modparam("auth_db|usrloc|uri", "use_domain", 1)  
  176.   
  177.   
  178. # ----- presence params -----  
  179. /* uncomment the following lines if you want to enable presence */  
  180. #modparam("presence|presence_xml", "db_url",  
  181. #   "mysql://opensips:opensipsrw@localhost/opensips")  
  182. #modparam("presence_xml", "force_active", 1)  
  183. #modparam("presence", "server_address", "sip:192.168.1.2:5060")  
  184.   
  185.   
  186. ####### Routing Logic ########  
  187.   
  188.   
  189. # main request routing logic  
  190.   
  191. route{  
  192.   
  193.     if (!mf_process_maxfwd_header("10")) {  
  194.         sl_send_reply("483","Too Many Hops");  
  195.         exit;  
  196.     }  
  197.   
  198.     if (has_totag()) {  
  199.         # sequential request withing a dialog should  
  200.         # take the path determined by record-routing  
  201.         if (loose_route()) {  
  202.             if (is_method("BYE")) {  
  203.                 setflag(1); # do accounting ...  
  204.                 setflag(3); # ... even if the transaction fails  
  205.             } else if (is_method("INVITE")) {  
  206.                 # even if in most of the cases is useless, do RR for  
  207.                 # re-INVITEs alos, as some buggy clients do change route set  
  208.                 # during the dialog.  
  209.                 record_route();  
  210.             }  
  211.             # route it out to whatever destination was set by loose_route()  
  212.             # in $du (destination URI).  
  213.             route(1);  
  214.         } else {  
  215.             /* uncomment the following lines if you want to enable presence */  
  216.             ##if (is_method("SUBSCRIBE") && $rd == "your.server.ip.address") {  
  217.             ##  # in-dialog subscribe requests  
  218.             ##  route(2);  
  219.             ##  exit;  
  220.             ##}  
  221.             if ( is_method("ACK") ) {  
  222.                 if ( t_check_trans() ) {  
  223.                     # non loose-route, but stateful ACK; must be an ACK after   
  224.                     # a 487 or e.g. 404 from upstream server  
  225.                     t_relay();  
  226.                     exit;  
  227.                 } else {  
  228.                     # ACK without matching transaction ->  
  229.                     # ignore and discard  
  230.                     exit;  
  231.                 }  
  232.             }  
  233.             sl_send_reply("404","Not here");  
  234.         }  
  235.         exit;  
  236.     }  
  237.   
  238.     #initial requests  
  239.   
  240.     # CANCEL processing  
  241.     if (is_method("CANCEL"))  
  242.     {  
  243.         if (t_check_trans())  
  244.             t_relay();  
  245.         exit;  
  246.     }  
  247.   
  248.     t_check_trans();  
  249.   
  250.     # authenticate if from local subscriber (uncomment to enable auth)  
  251.     # authenticate all initial non-REGISTER request that pretend to be  
  252.     # generated by local subscriber (domain from FROM URI is local)  
  253.     ##if (!(method=="REGISTER") && from_uri==myself) /*no multidomain version*/  
  254.     ##if (!(method=="REGISTER") && is_from_local())  /*multidomain version*/  
  255.     ##{  
  256.     ##  if (!proxy_authorize("", "subscriber")) {  
  257.     ##      proxy_challenge("", "0");  
  258.     ##      exit;  
  259.     ##  }  
  260.     ##  if (!db_check_from()) {  
  261.     ##      sl_send_reply("403","Forbidden auth ID");  
  262.     ##      exit;  
  263.     ##  }  
  264.     ##  
  265.     ##  consume_credentials();  
  266.     ##  # caller authenticated  
  267.     ##}  
  268.   
  269.     # preloaded route checking  
  270.     if (loose_route()) {  
  271.         xlog("L_ERR",  
  272.         "Attempt to route with preloaded Route's [$fu/$tu/$ru/$ci]");  
  273.         if (!is_method("ACK"))  
  274.             sl_send_reply("403","Preload Route denied");  
  275.         exit;  
  276.     }  
  277.   
  278.     # record routing  
  279.     if (!is_method("REGISTER|MESSAGE"))  
  280.         record_route();  
  281.   
  282.     # account only INVITEs  
  283.     if (is_method("INVITE")) {  
  284.         setflag(1); # do accounting  
  285.     }  
  286.     if (!uri==myself)  
  287.     ## replace with following line if multi-domain support is used  
  288.     ##if (!is_uri_host_local())  
  289.     {  
  290.         append_hf("P-hint: outbound\r\n");   
  291.         # if you have some interdomain connections via TLS  
  292.         ##if($rd=="tls_domain1.net") {  
  293.         ##  t_relay("tls:domain1.net");  
  294.         ##  exit;  
  295.         ##} else if($rd=="tls_domain2.net") {  
  296.         ##  t_relay("tls:domain2.net");  
  297.         ##  exit;  
  298.         ##}  
  299.         route(1);  
  300.     }  
  301.   
  302.     # requests for my domain  
  303.   
  304.     ## uncomment this if you want to enable presence server   
  305.     ##   and comment the next 'if' block  
  306.     ##   NOTE: uncomment also the definition of route[2] from  below  
  307.     ##if( is_method("PUBLISH|SUBSCRIBE"))  
  308.     ##      route(2);  
  309.   
  310.     if (is_method("PUBLISH"))  
  311.     {  
  312.         sl_send_reply("503", "Service Unavailable");  
  313.         exit;  
  314.     }  
  315.       
  316.   
  317.     if (is_method("REGISTER"))  
  318.     {  
  319.         # authenticate the REGISTER requests (uncomment to enable auth)  
  320.         #if (!www_authorize("", "subscriber"))  
  321.         #{  
  322.         #   www_challenge("", "0");  
  323.         #   exit;  
  324.         #}  
  325.         ##  
  326.         ##if (!db_check_to())   
  327.         ##{  
  328.         ##  sl_send_reply("403","Forbidden auth ID");  
  329.         ##  exit;  
  330.         ##}  
  331.   
  332.         if (!save("location"))  
  333.             sl_reply_error();  
  334.   
  335.         exit;  
  336.     }  
  337.   
  338.     if ($rU==NULL) {  
  339.         # request with no Username in RURI  
  340.         sl_send_reply("484","Address Incomplete");  
  341.         exit;  
  342.     }  
  343.   
  344.     # apply DB based aliases (uncomment to enable)  
  345.     ##alias_db_lookup("dbaliases");  
  346.   
  347.     # do lookup with method filtering  
  348.     if (!lookup("location","m")) {  
  349.         switch ($retcode) {  
  350.             case -1:  
  351.             case -3:  
  352.                 t_newtran();  
  353.                 t_reply("404", "Not Found");  
  354.                 exit;  
  355.             case -2:  
  356.                 sl_send_reply("405", "Method Not Allowed");  
  357.                 exit;  
  358.         }  
  359.     }  
  360.   
  361.     # when routing via usrloc, log the missed calls also  
  362.     setflag(2);  
  363.   
  364.     route(1);  
  365. }  
  366.   
  367.   
  368. route[1] {  
  369.     # for INVITEs enable some additional helper routes  
  370.     if (is_method("INVITE")) {  
  371.         t_on_branch("2");  
  372.         t_on_reply("2");  
  373.         t_on_failure("1");  
  374.     }  
  375.   
  376.     if (!t_relay()) {  
  377.         sl_reply_error();  
  378.     };  
  379.     exit;  
  380. }  
  381.   
  382.   
  383. # Presence route  
  384. /* uncomment the whole following route for enabling presence  
  385.    NOTE: do not forget to enable the call of this route from the main  
  386.      route */  
  387. ##route[2]  
  388. ##{  
  389. ##  if (!t_newtran())  
  390. ##  {  
  391. ##      sl_reply_error();  
  392. ##      exit;  
  393. ##  };  
  394. ##  
  395. ##  if(is_method("PUBLISH"))  
  396. ##  {  
  397. ##      handle_publish();  
  398. ##  }  
  399. ##  else  
  400. ##  if( is_method("SUBSCRIBE"))  
  401. ##  {  
  402. ##      handle_subscribe();  
  403. ##  }  
  404. ##  
  405. ##  exit;  
  406. ##}  
  407.   
  408.   
  409. branch_route[2] {  
  410.     xlog("new branch at $ru\n");  
  411. }  
  412.   
  413.   
  414. onreply_route[2] {  
  415.     xlog("incoming reply\n");  
  416. }  
  417.   
  418.   
  419. failure_route[1] {  
  420.     if (t_was_cancelled()) {  
  421.         exit;  
  422.     }  
  423.   
  424.     # uncomment the following lines if you want to block client   
  425.     # redirect based on 3xx replies.  
  426.     ##if (t_check_status("3[0-9][0-9]")) {  
  427.     ##t_reply("404","Not found");  
  428.     ##  exit;  
  429.     ##}  
  430.   
  431.     # uncomment the following lines if you want to redirect the failed   
  432.     # calls to a different new destination  
  433.     ##if (t_check_status("486|408")) {  
  434.     ##  sethostport("192.168.2.100:5060");  
  435.     ##  # do not set the missed call flag again  
  436.     ##  t_relay();  
  437.     ##}  
  438. }  


    

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多