技术支持

了解最新技术动态及行业资讯

当前位置:首页>技术支持
全部 135

Docker安装Opensips2.4实现内网sip,voip电话通信

时间:2025-06-09   访问量:1101

Docker安装Opensips2.4实现内网sip,voip电话通信

使用说明

这是基于官方opensips 2.4镜像添加了mysql模块以及rest_client模块制作的镜像,用此镜像可以连接mysql控制opensip注册用户、查看通话记录以及通话时对INVITE(邀请)、ACK(接通)、BYE(挂断)、CANCEL(取消)事件进行监听调用http接口访问外部业务

配置文件opensips.cfg 内容如下,请保存到ubuntu位置/docker/opensips/opensips.cfg,搜索标签CUSTOMIZE ME定位到需要配置的地方,根据实际情况修改

#

# OpenSIPS residential configuration script

#     by OpenSIPS Solutions <team@opensips-solutions.com>

#

# This script was generated via "make menuconfig", from

#   the "Residential" scenario.

# You can enable / disable more features / functionalities by

#   re-generating the scenario with different options.#

#

# Please refer to the Core CookBook at:

#      http://www.opensips.org/Resources/DocsCookbooks

# for a explanation of possible statements, functions and parameters.

#



####### Global Parameters #########


log_level=3

log_stderror=no

log_facility=LOG_LOCAL0


children=4


/* uncomment the following lines to enable debugging */

#debug_mode=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


/* comment the next line to enable the auto discovery of local aliases

   based on reverse DNS on IPs */

auto_aliases=no


advertised_address="192.168.3.119" # CUSTOMIZE ME ,set public ip

alias="192.168.3.119"  # CUSTOMIZE ME ,set public ip


listen=udp:eth0:5060     # CUSTOMIZE ME ,set port



####### Modules Section ########


#set module path

mpath="/usr/local//lib64/opensips/modules/"


#### SIGNALING module

loadmodule "signaling.so"


#### rest_client module

loadmodule "rest_client.so"


#### StateLess module

loadmodule "sl.so"


#### Transaction Module

loadmodule "tm.so"

modparam("tm", "fr_timeout", 5)

modparam("tm", "fr_inv_timeout", 30)

modparam("tm", "restart_fr_on_each_reply", 0)

modparam("tm", "onreply_avp_mode", 1)


#### Record Route Module

loadmodule "rr.so"

/* do not append from tag to the RR (no need for this script) */

modparam("rr", "append_fromtag", 0)


#### MAX ForWarD module

loadmodule "maxfwd.so"


#### SIP MSG OPerationS module

loadmodule "sipmsgops.so"


#### FIFO Management Interface

loadmodule "mi_fifo.so"

modparam("mi_fifo", "fifo_name", "/tmp/opensips_fifo")

modparam("mi_fifo", "fifo_mode", 0666)


#### URI module

loadmodule "uri.so"

modparam("uri", "use_uri_table", 0)


#### MYSQL module

loadmodule "db_mysql.so"


#### USeR LOCation module

loadmodule "usrloc.so"

modparam("usrloc", "nat_bflag", "NAT")

modparam("usrloc", "db_mode",   2)

modparam("usrloc", "db_url",

"mysql://opensips:opensipsrw@192.168.3.139:3360/opensips") # CUSTOMIZE ME



#### REGISTRAR module

loadmodule "registrar.so"

modparam("registrar", "tcp_persistent_flag", "TCP_PERSISTENT")

/* uncomment the next line not to allow more than 10 contacts per AOR */

#modparam("registrar", "max_contacts", 10)


#### ACCounting module

loadmodule "acc.so"

/* what special events should be accounted ? */

modparam("acc", "early_media", 0)

modparam("acc", "report_cancels", 0)

/* by default we 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)

modparam("acc", "db_url",

"mysql://opensips:opensipsrw@192.168.3.139:3360/opensips") # CUSTOMIZE ME


modparam("acc", "extra_fields", "db: a->from_uri; b->to_uri")


#### AUTHentication modules

loadmodule "auth.so"

loadmodule "auth_db.so"

modparam("auth_db", "calculate_ha1", yes)

modparam("auth_db", "password_column", "password")

modparam("auth_db|uri", "db_url",

"mysql://opensips:opensipsrw@192.168.3.139:3360/opensips") # CUSTOMIZE ME

modparam("auth_db", "load_credentials", "")


#### DIALOG module

loadmodule "dialog.so"

modparam("dialog", "dlg_match_mode", 1)

modparam("dialog", "default_timeout", 21600)  # 6 hours timeout

modparam("dialog", "db_mode", 2)

modparam("dialog", "db_url",

"mysql://opensips:opensipsrw@192.168.3.139:3360/opensips") # CUSTOMIZE ME


loadmodule "proto_udp.so"

loadmodule "proto_tcp.so" 

####### Routing Logic ########


# main request routing logic


route{


if (!mf_process_maxfwd_header("10")) {

send_reply("483","Too Many Hops");

exit;

}


if (has_totag()) {


# handle hop-by-hop ACK (no routing required)

if ( is_method("ACK") && t_check_trans() ) {

t_relay();

exit;

}


# sequential request within a dialog should

# take the path determined by record-routing

if ( !loose_route() ) {

# we do record-routing for all our traffic, so we should not

# receive any sequential requests without Route hdr.

send_reply("404","Not here");

exit;

}


# validate the sequential request against dialog

if ( $DLG_status!=NULL && !validate_dialog() ) {

xlog("In-Dialog $rm from $si (callid=$ci) is not valid according to dialog ");

## exit;

}


if (is_method("BYE")) {

# do accounting even if the transaction fails


# 调用http get服务 # CUSTOMIZE ME

# $var(rc) = rest_get("http://192.168.0.137:8000/opensips/bye?fu=$fU&tu=$tU", "$var(credit)", "$var(ct)", "$var(rcode)");

# 插入源和目标地址

$acc_extra(a) = $fu;

            $acc_extra(b) = $tu;

do_accounting("db","cdr");


}


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

# in $du (destination URI).

route(relay);

exit;

}


# CANCEL processing

if (is_method("CANCEL")) {


# 调用http get服务 # CUSTOMIZE ME

#$var(rc) = rest_get("http://192.168.0.137:8000/opensips/cancel?fu=$fU&tu=$tU", "$var(credit)", "$var(ct)", "$var(rcode)");


if (t_check_trans())

t_relay();


exit;

}


# absorb retransmissions, but do not create transaction

t_check_trans();


if ( !(is_method("REGISTER")  ) ) {

if (is_myself("$fd")) {

# authenticate if from local subscriber

# authenticate all initial non-REGISTER request that pretend to be

# generated by local subscriber (domain from FROM URI is local)

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

proxy_challenge("", "0");

exit;

}

if (!db_check_from()) {

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

exit;

}


consume_credentials();

# caller authenticated

} else {

# if caller is not local, then called number must be local

if (!is_myself("$rd")) {

send_reply("403","Relay Forbidden");

exit;

}

}


}


# preloaded route checking

if (loose_route()) {

xlog("L_ERR",

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

if (!is_method("ACK"))

send_reply("403","Preload Route denied");

exit;

}


# record routing

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

record_route();


# account only INVITEs

if (is_method("INVITE")) {

# create dialog with timeout

if ( !create_dialog("B") ) {

send_reply("500","Internal Server Error");

exit;

}

xlog("Method INVITE: $ru ");


# 调用http get服务 # CUSTOMIZE ME

#$var(rc) = rest_get("http://192.168.0.137:8000/opensips/invite?fu=$fU&tu=$tU", "$var(credit)", "$var(ct)", "$var(rcode)");


# 调用http post服务 # CUSTOMIZE ME

# $var(rcpost) = rest_post("http://192.168.0.137:8000/opensips/invite", "$fU,$tU", , "$var(body)", "$var(ct)", "$var(rcode)") ;


# 插入源和目标地址

$acc_extra(a) = $fu;

        $acc_extra(b) = $tu;

do_accounting("db");

}


if (!is_myself("$rd")) {

append_hf("P-hint: outbound "); 

route(relay);

}


# requests for my domain

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

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

exit;

}


if (is_method("REGISTER")) {

# authenticate the REGISTER requests

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

www_challenge("", "0");

exit;

}

if (!db_check_to()) {

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

exit;

}

if ($proto == "tcp")

setflag(TCP_PERSISTENT);

if (!save("location"))

sl_reply_error();


exit;

}


if ($rU==NULL) {

# request with no Username in RURI

send_reply("484","Address Incomplete");

exit;

}




 


# do lookup with method filtering

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

if (!db_does_uri_exist()) {

send_reply("420","Bad Extension");

exit;

}

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

exit;



# when routing via usrloc, log the missed calls also


# 插入源和目标地址

$acc_extra(a) = $fu;

    $acc_extra(b) = $tu;

do_accounting("db","missed");


route(relay);

}



route[relay] {

# for INVITEs enable some additional helper routes

if (is_method("INVITE")) {


t_on_branch("per_branch_ops");

t_on_reply("handle_nat");

t_on_failure("missed_call");

}


# ACK processing  # CUSTOMIZE ME

if (is_method("ACK")) {

#$var(rc) = rest_get("http://192.168.0.137:8000/opensips/ack?fu=$fU&tu=$tU", "$var(credit)", "$var(ct)", "$var(rcode)");

}


if (!t_relay()) {

send_reply("500","Internal Error");

}

exit;

}





branch_route[per_branch_ops] {

xlog("new branch at $ru ");

}



onreply_route[handle_nat] {

xlog("incoming reply ");

}



failure_route[missed_call] {

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;

##}


}




local_route {

if (is_method("BYE") && $DLG_dir=="UPSTREAM") {

acc_db_request("200 Dialog Timeout", "acc");

}

}


上一篇:CentOS7常用命令详解

下一篇:四川电信IPTV在播放时每个台卡几秒的问题对于光猫的设置要求

  • 友情链接:
  • 百度 DeepSeek 百度中英在线翻译 阿里云 腾讯云 西部数码 贝锐花生壳 IP查询 360在线翻译 360搜索 搜狗搜索 宽带测速 MAC厂商查询 mikrotik 容器镜像 Windows/office/2下载 PbootCMS Windows/office/开发工具下载 Windows/office下载 中川网维 bilibili