美文网首页
opensips转发sip信令部署

opensips转发sip信令部署

作者: 平凡的运维之路 | 来源:发表于2023-03-01 17:08 被阅读0次

源码包下载并编译安装

  • 浏览器下载
wget  http://10.130.36.117/Deploymentpackage/opensips-1.8.2_src.tar.gz
wget  http://10.130.36.117/Deploymentpackage/opensips.cfg 配置文件
  • 环境准备
#前提:
    1、需要本地部署mysql服务,并启动成功,切需要mysql root用户密码
[root@my-dev ~]# yum install gcc make -y
[root@my-dev ~]# yum install flex bison ncurses libncurses-dev ncurses-devel -y
[root@my-dev ~]# yum install openssl openssl-devel mysql-devel -y
  • 编译安装
[root@my-dev ~]# tar xvf opensips-1.8.2_src.tar.gz
[root@my-dev ~]# cd opensips-1.8.2-tls/
[root@my-dev opensips-1.8.2-tls]# make all include_modules="db_mysql"  
[root@my-dev opensips-1.8.2-tls]# make install include_modules="db_mysql"   
[root@my-dev opensips-1.8.2-tls]# vim /usr/local/etc/opensips/opensipsctlrc  #把和mysql有关的注释去掉,其中DB_PATH和USERCOL保留注释
## 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.
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 super user (for ORACLE this is 'scheme-creator' user)
DBROOTUSER="root"

# user name column
#USERCOL="username"
  • 创建opensips数据库
[root@my-dev opensips]# /usr/local/sbin/opensipsdbctl create
MySQL password for root: <---- 输入mysql root用户的密码
INFO: test server charset
INFO: creating database opensips ...
INFO: Core OpenSIPS tables succesfully created.
Install presence related tables? (y/n): y
INFO: creating presence tables into opensips ...
INFO: Presence tables succesfully created.
Install tables for imc cpl siptrace domainpolicy carrierroute userblacklist? (y/n): y
INFO: creating extra tables into opensips ...
INFO: Extra tables succesfully created.
  • 在登录数据查询是否库和表已经创建成功
[root@my-dev opensips]# mysql -uopensips -popensipsrw -h 10.0.16.16 
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 42
Server version: 5.5.68-MariaDB MariaDB Server

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]> use opensips;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
MariaDB [opensips]> show tables;
+---------------------+
| Tables_in_opensips  |
+---------------------+
| acc                 |
| active_watchers     |
| address             |
| aliases             |
| carrierfailureroute |
| carrierroute        |
| cpl                 |
| dbaliases           |
| dialog              |
| dialplan            |
| dispatcher          |
| domain              |
| domainpolicy        |
| dr_carriers         |
| dr_gateways         |
| dr_groups           |
| dr_rules            |
| globalblacklist     |
| grp                 |
| imc_members         |
| imc_rooms           |
| load_balancer       |
| location            |
| missed_calls        |
| nh_sockets          |
| pdt                 |
| presentity          |
| pua                 |
| re_grp              |
| rls_presentity      |
| rls_watchers        |
| route_tree          |
| silo                |
| sip_trace           |
| speed_dial          |
| subscriber          |
| uri                 |
| userblacklist       |
| usr_preferences     |
| version             |
| watchers            |
| xcap                |
+---------------------+
42 rows in set (0.00 sec)

opensips配置文件调整

  • opensips配置文件
    • 配置文件需要注意:mpath路径问题
    • modparam("dispatcher", "db_url" 数据库配置链接
    • route 匹配规则
[root@my-dev opensips]# vim  /usr/local/etc/opensips/opensips.cfg
#G
#$Id: dispatcher.cfg 8602 2011-12-01 16:56:59Z bogdan_iancu $
# sample config file for dispatcher module
#

debug=3         # debug level (cmd line: -dddddddddd)
fork=yes
log_stderror=no
log_facility=LOG_LOCAL0

children=4
check_via=no      # (cmd. line: -v)
dns=off           # (cmd. line: -r)
rev_dns=off       # (cmd. line: -R)
port=5060

listen=udp:0.0.0.0:5060  # CUSTOMIZE ME
# for more info: opensips -h

# ------------------ module loading ----------------------------------
mpath="/usr/local/lib64/opensips/modules/"   #该路径需要find / -name maxfwd.so 看下真实路径
loadmodule "maxfwd.so"
loadmodule "signaling.so"
loadmodule "sl.so"
loadmodule "tm.so"
loadmodule "db_mysql.so"
loadmodule "dispatcher.so"
loadmodule "rr.so"
loadmodule "sipmsgops.so"
#loadmodule "uri.so"
loadmodule "path.so"
loadmodule "uac_auth.so"
loadmodule "dialog.so"
loadmodule "uac.so"
loadmodule "mi_fifo.so"

# ----------------- setting module-specific parameters ---------------
# -- dispatcher params --

modparam("dispatcher", "db_url", "mysql://opensips:opensipsrw@10.0.16.16/opensips")
modparam("dispatcher", "flags", 2)
modparam("dispatcher", "force_dst", 1)
#modparam("rr","append_fromtag",0)
modparam("mi_fifo", "fifo_name", "/tmp/opensips_fifo")
modparam("mi_fifo", "fifo_mode", 0666)

route{
    if ( !mf_process_maxfwd_header("10") )
    {
        send_reply("483","To Many Hops");
             xlog("rU is $rU aaaaaaaaa\n");
        exit;
    }
    if(is_method("REGISTER"))
    {
         route(1);  #如果是注册消息就走route[1]的规则
    }
    else    #非注册消息就通过下面规则路由
    {
        xlog("rU is $rU bbbbbbb\n");
        if(is_method("ACK"))
        {
            if($tU=~"^1")
                {
                        if (!ds_select_domain("4", "8") )
                        {
                                send_reply("500","Unable to route");
                                exit;
                        }
                        forward();
                }
            else if($tU=~"^2")
                {
                        if (!ds_select_domain("4", "8") )
                        {
                                send_reply("500","Unable to route");
                                exit;
                        }
                        forward();
                }
        }
        else
        {
            if($tU=~"^1")
            {   
                if (!ds_select_domain("4", "8") ) 
                {
                    send_reply("500","Unable to route");
                    exit;
                }
                forward();
            }
            else if($tU=~"^88")
                        {
                                if (!ds_select_domain("1", "8") ) ##这是dispatcher模块的函数,第一个参数是路由到的setid,第二参数是路由模式,8为指定setid的第一个路由,也就是单数号码路由到setid为1的
                                {
                                        send_reply("500","Unable to route");
                                        exit;
                                }
                                forward();
                        }       
    
            else if($tU=~"^99")
                        {
                                if (!ds_select_domain("1", "8") )
                                {
                                        send_reply("500","Unable to route");
                                        exit;
                                }
                                forward();
                        }   
            else
            {
                if (!ds_select_domain("4","8"))
                {
                    send_reply("500","Unable to route");
                    exit;
                }
                forward();
            }

        }
    }  
}

route[1] {  #这就是上面注册消息要走的route[1]规则

    # if (!add_path_received())
    #    {
     #       sl_send_reply("503", "Internal path befuddlement"); 
    #       exit;
     #   }
    xlog("rU is $rU fu is $fu  register\n");
    if($fU=~"^88")
    {
        xlog("tn is $tn\n");
        rewriteuri("sip:10.99.150.111:5060");
        uac_replace_from("sip:$fU@10.99.150.111:5060");
        uac_replace_to("sip:$tU@10.99.150.111:5060");
        t_relay();
    }
    else if($fU=~"^99")
    {
        xlog("tn is $tn\n");
        rewriteuri("sip:10.99.150.222:5060");
        uac_replace_from("sip:$fU@10.99.150.222:5060");
        uac_replace_to("sip:$tU@10.99.150.222:5060");
        t_relay();
    }
}
  • 启动opensips 并添加
[root@my-dev opensips]# opensipsctl  start 
INFO: Starting OpenSIPS : 
INFO: started (pid: 16500)

[root@my-dev opensips]# opensipsctl dispatcher  addgw 1 sip:10.99.150.111:5060 1 'WGW-1'
[root@my-dev opensips]# opensipsctl dispatcher  addgw 2 sip:10.99.150.222:5060 1 'WGW-2'

[root@my-dev opensips]#   opensipsctl dispatcher show
dispatcher gateways #setid 也就是上面配置文件中指向的ds_select_domain。
+----+-------+------------------------+--------+-------+--------+-------+-------------+
| id | setid | destination            | socket | flags | weight | attrs | description |
+----+-------+------------------------+--------+-------+--------+-------+-------------+
|  1 |     1 | sip:10.99.150.111:5060 | NULL   |     1 |      1 |       | WGW-1       |
|  2 |     2 | sip:10.99.150.222:5060 | NULL   |     1 |      1 |       | WGW-2       |
+----+-------+------------------------+--------+-------+--------+-------+-------------+

[root@my-dev opensips]# opensipsctl  restart 

验证opensips

相关文章

网友评论

      本文标题:opensips转发sip信令部署

      本文链接:https://www.haomeiwen.com/subject/cbcdldtx.html