使用说明

  • 这是基于官方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\n");
## 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\n"); # 调用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\r\n"); 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\n");
} onreply_route[handle_nat] { xlog("incoming reply\n");
} 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"); }
}

数据库文件

  • 其中表acc为通话成功记录表,记录成功的INVITE和BYE。
  • missed_calls记录失败的INVITE记录,可以是拨打方Cancel的和忙线(具体看sip_reason)。
  • subscriber表记录用户名和密码,在这可以手动新增客户
  • 数据库文件下载:opensips2.4_db

获取镜像

docker pull 459741134/opensips2.4_with_mysql_rest

运行镜像

docker run -d -it --name sip -p 5060:5060/udp -v /docker/opensips/opensips.cfg:/etc/opensips/opensips.cfg opensips/opensips

Docker安装Opensips2.4实现内网sip电话通讯的更多相关文章

  1. 【转】Syncthing – 数据同步利器---自己的网盘,详细安装配置指南,内网使用,发现服务器配置

    Syncthing – 数据同步利器---自己的网盘,详细安装配置指南,内网使用,发现服务器配置 原贴:https://www.cnblogs.com/jackadam/p/8568833.html ...

  2. docker 安装redis 并配置外网可以访问

    1, docker 拉去最新版本的redis docker pull redis #后面可以带上tag号, 默认拉取最新版本 2, docker安装redis container 安装之前去定义我们的 ...

  3. docker 安装redis 并配置外网可以访问 - flymoringbird的博客 - CSDN博客

    原文:docker 安装redis 并配置外网可以访问 - flymoringbird的博客 - CSDN博客 端口映射,data目录映射,配置文件映射(在当前目录下进行启动). docker run ...

  4. Syncthing – 数据同步利器---自己的网盘,详细安装配置指南,内网使用,发现服务器配置

    简介: 无论办公.文件共享.团队协作还是家庭照片.视频.音乐.高清电影的存储,我们常常都有文件同步和存储的需求.但随着国内各大网盘的花式阵亡或限速,早已没什么好选择了.好吧,我已经转战使用onedri ...

  5. centos7下安装openvpn,访问内网服务器 (二) windows访问

    一.简介 在上一章中已经安装好了openvpn,并且已经启动成功,现在就可以通过openvpn的客户端进行连接访问内网服务器了. 二.安装openvpn客户端 下载地址: https://www.te ...

  6. docker安装redis并允许外网访问

    拉取redis镜像 docker pull redis:3.2 本地新建redis配置文件 redis.conf ,写入以下内容 #允许外网访问bind 0.0.0.0 daemonize NO pr ...

  7. Linux安装redis并且连接内网的redis

    1.安装redis步骤 1.首先准备工作  [root@10-100-14-130 ~]# yum install gcc-c++   yum install wget 2.推荐进入到linux路径/ ...

  8. CentOS 7 安装 bind 服务 实现内网DNS

    目录 安装 配置 服务管理 测试 安装 废话不多说,直接安装 yum install -y bind bind-utils 配置 [root@jenkins named]# rpm -ql bind ...

  9. CentOS 7 安装 dnsmasq 服务 实现内网DNS

    目录 安装 配置 服务管理 测试解析 安装 废话不多述,上来就安装 yum install -y bind-utils dnsmasq 配置 [root@jenkins ~]# rpm -ql dns ...

随机推荐

  1. ZYNQ使用ymodem协议传输文件

    SDK: V2014.4 协议: Ymodem 工具: USB转UART转接线.xshell6软件 可实现各种文件传输,大小不限,只是速度很慢 参考原代码如下: /****************** ...

  2. linux内存(二)高端内存

    来此网址 https://ilinuxkernel.com/?p=1013 Linux内核地址映射模型x86 CPU采用了段页式地址映射模型.进程代码中的地址为逻辑地址,经过段页式地址映射后,才真正访 ...

  3. swing 实现用户登录注册界面(不使用数据库)

    swing 实现用户登录注册界面(不使用数据库) 实现的功能 先说一下具体实现的功能吧:用户注册后会将注册的对象存入内存中,登录时会遍历注册的对象列表,判断是否登录成功: 登录和注册界面: 本次实验分 ...

  4. ChIP-seq技术介绍|易基因

    大家好,这里是专注表观组学十余年,多组学科研服务领跑者的易基因. 染色质免疫沉淀后测序(ChIP seq)是一种针对DNA结合蛋白.组蛋白修饰或核小体的全基因组分析技术.由于二代测序技术的巨大进步,C ...

  5. linux下的shell脚本

    先说明以下内容来自: http://c.biancheng.net/cpp/shell/ ,C语言中文网,请大家支持原作,点击链接查看. 我写下来只是作为笔记,如果侵权,请留言,立马删除. Shell ...

  6. MyISAM 表格将在哪里存储,并且还提供其存储格式?

    每个 MyISAM 表格以三种格式存储在磁盘上: ·".frm"文件存储表定义 ·数据文件具有".MYD"(MYData)扩展名 索引文件具有".MY ...

  7. Redis 相比 Memcached 有哪些优势?

    1.Memcached 所有的值均是简单的字符串,redis 作为其替代者,支持更为丰 富的数据类 2.Redis 的速度比 Memcached 快很 3.Redis 可以持久化其数据

  8. Java 中能创建 volatile 数组吗?

    能,Java 中可以创建 volatile 类型数组,不过只是一个指向数组的引用,而不 是整个数组.我的意思是,如果改变引用指向的数组,将会受到 volatile 的保护, 但是如果多个线程同时改变数 ...

  9. Leetcode刷题之链表增加头结点的前缀节点

    链表之增加头结点的前缀节点 在许多链表题中往往需要在题目给的头结点之前增加一个前缀节点 通常在删除链表和头结点需要交换时需要用到这一操作 因为增加这个节点就避免了对删除头结点这种特殊情况的特殊处理 而 ...

  10. MySQL碎片整理小节--实例演示

    MYSQL之磁盘碎片整理 清澈,细流涓涓的爱 数据库引擎以InnoDB为主 1.磁盘碎片是什么 ​ InnoDB表的数据存储在页中,每个页可以存放多条记录,这些记录以树形结构组织,这棵树称为B+树. ...