当前位置: 首页 > news >正文

OpenSIP3.4 路由脚本之我见

熟悉我的都知道,我早就习惯了 Kamailio

用 osipsconfig 产生 Residential 的路由脚本,仔细看了下,还是不太习惯

首先,有二处认证,感觉很怪异

其次,没有宏定义,要用 m4 等工具来进行处理

再次,版本变化太大,脚本的兼容性比较差

您对此有什么看法?

附 opensips.cfg

#
# 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:
#      https://opensips.org/Resources/DocsCookbooks
# for a explanation of possible statements, functions and parameters.
#


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

/* uncomment the following lines to enable debugging */
#debug_mode=yes

log_level=3
xlog_level=3
stderror_enabled=no
syslog_enabled=yes
syslog_facility=LOG_LOCAL0

udp_workers=4

/* 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


socket=udp:127.0.0.1:5060   # CUSTOMIZE ME
socket=tcp:127.0.0.1:5060   # CUSTOMIZE ME


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

#set module path
mpath="/usr/lib/x86_64-linux-gnu/opensips/modules/"

#### SIGNALING module
loadmodule "signaling.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)

#### MYSQL module
loadmodule "db_mysql.so"

#### HTTPD module
loadmodule "httpd.so"
modparam("httpd", "port", 8888)

#### USeR LOCation module
loadmodule "usrloc.so"
modparam("usrloc", "nat_bflag", "NAT")
modparam("usrloc", "working_mode_preset", "single-instance-no-db")

#### REGISTRAR module
loadmodule "registrar.so"
modparam("registrar", "tcp_persistent_flag", "TCP_PERSISTENT")
modparam("registrar", "received_avp", "$avp(received_nh)")/* 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 to enable "append_fromtag"
in "rr" module */
modparam("acc", "detect_direction", 0)

#### AUTHentication modules
loadmodule "auth.so"
loadmodule "auth_db.so"
modparam("auth_db", "calculate_ha1", yes)
modparam("auth_db", "password_column", "password")
modparam("auth_db", "db_url",
"mysql://opensips:opensipsrw@localhost/opensips") # CUSTOMIZE ME
modparam("auth_db", "load_credentials", "")

####  NAT modules
loadmodule "nathelper.so"
modparam("nathelper", "natping_interval", 10)
modparam("nathelper", "ping_nated_only", 1)
modparam("nathelper", "sipping_bflag", "SIP_PING_FLAG")
modparam("nathelper", "sipping_from", "sip:pinger@127.0.0.1") #CUSTOMIZE ME
modparam("nathelper", "received_avp", "$avp(received_nh)")

loadmodule "rtpproxy.so"
modparam("rtpproxy", "rtpproxy_sock", "udp:localhost:12221") # CUSTOMIZE ME

####  MI_HTTP module
loadmodule "mi_http.so"

loadmodule "proto_udp.so"
loadmodule "proto_tcp.so" 

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

# main request routing logic

route{

    # initial NAT handling; detect if the request comes from behind a NAT
# and apply contact fixing
force_rport();
if (nat_uac_test("diff-port-src-via,private-via,diff-ip-src-via,private-contact")) {
if (is_method("REGISTER")) {
fix_nated_register();
setbflag("NAT");
} else {
fix_nated_contact();
setflag("NAT");
}
}

    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;
}

        if (is_method("BYE")) {
# do accounting even if the transaction fails
do_accounting("log","failed");
}


if (check_route_param("nat=yes")) 
setflag("NAT");
# route it out to whatever destination was set by loose_route()
# in $du (destination URI).
route(relay);
exit;
}

    # CANCEL processing
if (is_method("CANCEL")) {
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("", "auth");
exit;
}
if ($au!=$fU) {
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")) {

do_accounting("log");
}

    
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("", "auth");
exit;
}

if ($au!=$tU) {
send_reply(403,"Forbidden auth ID");
exit;
}
if ($socket_in(proto) == "tcp")
setflag("TCP_PERSISTENT");
if (isflagset("NAT")) {
setbflag("SIP_PING_FLAG");
}
# store the registration and generate a SIP reply
if (!save("location"))
xlog("failed to register AoR $tu\n");

        exit;
}

    if ($rU==NULL) {
# request with no Username in RURI
send_reply(484,"Address Incomplete");
exit;
}

    

    

     

    # do lookup with method filtering
if (!lookup("location", "method-filtering")) {
if (!db_does_uri_exist("$ru","subscriber")) {
send_reply(420,"Bad Extension");
exit;
}

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

    if (isbflagset("NAT")) setflag("NAT");

    # when routing via usrloc, log the missed calls also
do_accounting("log","missed");
route(relay);
}


route[relay] {
# for INVITEs enable some additional helper routes
if (is_method("INVITE")) {

if (isflagset("NAT") && has_body("application/sdp")) {
rtpproxy_offer("ro");
}

        t_on_branch("per_branch_ops");
t_on_reply("handle_nat");
t_on_failure("missed_call");
}

    if (isflagset("NAT")) {
add_rr_param(";nat=yes");
}

    if (!t_relay()) {
send_reply(500,"Internal Error");
}
exit;
}


branch_route[per_branch_ops] {
xlog("new branch at $ru\n");
}


onreply_route[handle_nat] {
if (nat_uac_test("private-contact"))
fix_nated_contact();
if ( isflagset("NAT") && has_body("application/sdp") )
rtpproxy_answer("ro");
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;
##}

    
}

http://www.dtcms.com/a/554496.html

相关文章:

  • php网站开发进程施工企业工作环境
  • 第1讲:为什么是Flutter?跨平台开发的现状与未来
  • 怎样做网站策划教育培训机构十大排名
  • 成都怎样制作公司网站产品营销网站建设
  • 百度网站链接提交入口做淘宝网店需要多少钱
  • 推荐几本学习计算机语言的书
  • 保定网站建设报价wordpress菜单分级
  • 贵阳网站设计企业百度直播
  • MPK(Mirage Persistent Kernel)源码笔记(4)--- 转译系统
  • html 手机网站wordpress云盘视频播放
  • 白宫网站 wordpress企石镇仿做网站
  • Chatbox 安装 for Windows
  • Ubuntu OpenCV C++ 获取MYNT EYE S1030-IR摄像头图像
  • 网站的域名怎么看合肥高端网站建设设计公司
  • 个人网站制作多少钱个人网站推广
  • 使用中继扩展蓝牙传输距离的方法
  • 【Python】-- 趣味代码 - 猜数字游戏
  • 网站备案怎么那么慢内蒙古生产建设兵团四师三十四团知青网站
  • 阜阳市住房和城乡建设局网站中国工商业联合会
  • 淘宝客网站免费做网站建设的费用结构包括
  • html5网站后台建设银行鞍山网站
  • DepthAI ROS Release 3.0
  • 自己创造网站平台seo关键词排名网络公司
  • 自己做网络棋牌网站流程wordpress 卢松松
  • 透明快捷键或命令管理器
  • 一个CTO的一天:详细设计的作用
  • C++ std::unordered_map
  • 【Python办公】压缩包智能提取工具:基于顺丰单号的精准文件提取解决方案(无需解压缩)
  • 沈阳市建设工程信息网站石家庄 外贸网站建设公司排名
  • Redis 持久化方式