没有 rr 头的 kamailio 路由脚本

分享下笔者最近编写的 kamailio 路由脚本

  1. 不用 rr 模块,因为有些 sip 协议栈不支持 rr 头
  2. 处理 sip 注册直接回 200 OK,这部分目前不是重点
  3. 更换 contact 头,换成 kamailio 自己
  4. 目前只支持 sip transport 为 udp,以后可能支持 tcp,tls 等

测试环境为:

  1. kamailio 版本为 5.8.1
  2. kamailio ip 为 192.168.43.135
  3. fs ip为 192.168.43.203
  4. microsip ip 为 192.168.43.68,修改 microsip.ini,sourcePort=5060
  5. fs 呼叫 kamailio, 后者 relay 到 microsip 的 5060 端口
  6. microsip 呼叫 kamailio, 后者 relay 到 fs 的 5080 端口

内行看门道,可重点关注下面几个路由块:

  • route[INVITE]
  • onreply_route[MANAGE_REPLY] 
  • route[WITHINDLG] 

下面是完整的路由脚本:

#!substdef "!KAM_IP!192.168.43.135!g"
#!substdef "!KAM_PORT!5060!g"#!substdef "!FS!sip:192.168.43.203:5080!g"
#!substdef "!MICROSIP!sip:192.168.43.68:5060!g"# - flags
#   FLT_ - per transaction (message) flags
#!define FLT_ACC 1
#!define FLT_ACCMISSED 2
#!define FLT_ACCFAILED 3
#!define FLT_NATS 5#	FLB_ - per branch flags
#!define FLB_NATB 6
#!define FLB_NATSIPPING 7debug=2
log_stderror=no
memdbg=5
memlog=5log_facility=LOG_LOCAL0
log_prefix="{$mt $hdr(CSeq) $ci} "children=8# disable_tcp=yes
# tcp_children=8
# auto_aliases=no
# alias="sip.mydomain.com"listen=udp:KAM_IP:KAM_PORT
listen=tcp:KAM_IP:KAM_PORTtcp_connection_lifetime=3605
tcp_max_connections=2048
tcp_accept_no_cl=yes
enable_sctp=no# mpath="/usr/local/lib/kamailio/modules/"loadmodule "xhttp.so"
loadmodule "jsonrpcs.so"
loadmodule "kex.so"
loadmodule "corex.so"
loadmodule "tm.so"
loadmodule "tmx.so"
loadmodule "sl.so"
#loadmodule "rr.so"
loadmodule "pv.so"
loadmodule "maxfwd.so"
loadmodule "usrloc.so"
loadmodule "registrar.so"
loadmodule "textops.so"
loadmodule "textopsx.so"
loadmodule "siputils.so"
loadmodule "xlog.so"
loadmodule "sanity.so"
loadmodule "ctl.so"
loadmodule "cfg_rpc.so"
loadmodule "counters.so"
#loadmodule "auth_db.so"
loadmodule "nathelper.so"
#loadmodule "rtpengine.so"loadmodule "htable.so"modparam("jsonrpcs", "pretty_format", 1)
# modparam("jsonrpcs", "fifo_name", "/run/kamailio/kamailio_rpc.fifo")
# modparam("jsonrpcs", "dgram_socket", "/run/kamailio/kamailio_rpc.sock")
modparam("jsonrpcs", "transport", 7)# modparam("ctl", "binrpc", "unix:/run/kamailio/kamailio_ctl")modparam("sanity", "autodrop", 0)modparam("tm", "failure_reply_mode", 3)
modparam("tm", "fr_timer", 30000)
modparam("tm", "fr_inv_timer", 120000)modparam("registrar", "method_filtering", 1)
# modparam("registrar", "append_branches", 0)
# modparam("registrar", "max_contacts", 10)
modparam("registrar", "max_expires", 3600)
modparam("registrar", "gruu_enabled", 0)
modparam("registrar", "use_path", 1)
modparam("registrar", "path_mode", 0)modparam("usrloc", "timer_interval", 60)
modparam("usrloc", "timer_procs", 1)
modparam("usrloc", "use_domain", 0)#modparam("usrloc", "db_url", DBURL)
modparam("usrloc", "db_mode", 0)#modparam("auth_db", "db_url", DBURL)
#modparam("auth_db", "calculate_ha1", yes)
#modparam("auth_db", "password_column", "password")
#modparam("auth_db", "load_credentials", "")
#modparam("auth_db", "use_domain", 0)#modparam("rtpengine", "rtpengine_sock", "udp:127.0.0.1:2223")# ----- nathelper params -----
modparam("nathelper", "natping_interval", 30)
modparam("nathelper", "ping_nated_only", 1)
modparam("nathelper", "sipping_bflag", FLB_NATSIPPING)
modparam("nathelper", "sipping_from", "sip:pinger@kamailio.org")modparam("nathelper|registrar", "received_avp", "$avp(RECEIVED)")
modparam("usrloc", "nat_bflag", FLB_NATB)request_route {route(REQINIT);route(NATDETECT);# CANCEL processingif (is_method("CANCEL")) {if (t_check_trans()) {route(RELAY);}exit;}if (!is_method("ACK")) {if(t_precheck_trans()) {t_check_trans();exit;}t_check_trans();}route(WITHINDLG);route(AUTH);remove_hf("Route");route(PRESENCE);route(REGISTRAR);if (is_method("OPTIONS")) {sl_send_reply("200", "OK");exit;}if ($rU==$null) {sl_send_reply("484", "Address Incomplete");exit;}if (is_method("INVITE")) {route(INVITE);exit;}sl_send_reply("501", "Not Implemented ");return;
}route[RELAY] {if (is_method("INVITE|BYE|SUBSCRIBE|UPDATE")) {if(!t_is_set("branch_route")) t_on_branch("MANAGE_BRANCH");}if (is_method("INVITE|SUBSCRIBE|UPDATE")) {if(!t_is_set("onreply_route")) t_on_reply("MANAGE_REPLY");}if (is_method("INVITE")) {if(!t_is_set("failure_route")) t_on_failure("MANAGE_FAILURE");}if (!t_relay()) {sl_reply_error();}exit;
}route[REQINIT] {set_reply_no_connect();force_rport();if (!mf_process_maxfwd_header("10")) {sl_send_reply("483", "Too Many Hops");exit;}if(!sanity_check("17895", "7")) {xlog("Malformed SIP request from $si:$sp\n");exit;}
}route[WITHINDLG] {if (!has_totag()) return;if ($(ru{uri.param,lm}) =~ "ua") {$var(host) = $(ru{uri.param,lhst});xlog("WITHINDLG|$var(host)\n");$var(host)=$(var(host){s.decode.base64t});$du = $var(host);xlog("WITHINDLG|du=$var(host)\n");$var(new) = $(ru{re.subst,/^(sip:.*);lhst=.*/\1/});$ru = $var(new);xlog("WITHINDLG|ru=$var(new)\n");route(RELAY);}exit;
}route[REGISTRAR] {if (!is_method("REGISTER")) return;sl_send_reply("200", "OK");exit;
}# Presence server processing
route[PRESENCE] {if(!is_method("PUBLISH|SUBSCRIBE")) return;sl_send_reply("404", "Not here");exit;
}route[AUTH] {return;
}route[NATDETECT] {//if (nat_uac_test("19")) {//	if (is_method("REGISTER")) {//		fix_nated_register();//	} else {//		if(is_first_hop()) {//			set_contact_alias();//		}//	}//	setflag(FLT_NATS);//}return;
}route[NATMANAGE] {//if (is_request()) {//	if(has_totag()) {//		if(check_route_param("nat=yes")) {//			setbflag(FLB_NATB);//		}//	}//}if (!(isflagset(FLT_NATS) || isbflagset(FLB_NATB))) return;//if(nat_uac_test("8")) {//	rtpengine_manage("SIP-source-address replace-origin replace-session-connection");//} else {//	rtpengine_manage("replace-origin replace-session-connection");//}//if (is_request()) {//	if (!has_totag()) {//		if(t_is_branch_route()) {//			add_rr_param(";nat=yes");//		}//	}//}if (is_reply()) {if(isbflagset(FLB_NATB)) {if(is_first_hop())set_contact_alias();}}if(isbflagset(FLB_NATB)) {# no connect message in a dialog involving NAT traversalif (is_request()) {if(has_totag()) {set_forward_no_connect();}}}return;
}# URI update for dialog requests
route[DLGURI] {if(!isdsturiset()) {handle_ruri_alias();}return;
}event_route[xhttp:request] {set_reply_close();set_reply_no_connect();if(src_ip!=127.0.0.1) {xhttp_reply("403", "Forbidden", "text/html","<html><body>Not allowed from $si</body></html>");exit;}if ($hu =~ "^/RPC") {jsonrpc_dispatch();exit;}xhttp_reply("200", "OK", "text/html","<html><body>Wrong URL $hu</body></html>");exit;
}branch_route[MANAGE_BRANCH] {xdbg("new branch [$T_branch_idx] to $ru\n");route(NATMANAGE);return;
}reply_route {if(!sanity_check("17604", "6")) {xlog("Malformed SIP response from $si:$sp\n");drop;}return;
}onreply_route[MANAGE_REPLY] {xinfo("incoming reply|$rm|$rs|$ct\n");if($rm == "INVITE" && status=~"[12][0-9][0-9]" && is_present_hf("Contact")) {$var(user) = $(sel(contact.uri.user));remove_hf("Contact");$var(host) = $(sut{s.encode.base64t});append_hf("Contact: <sip:$var(user)@KAM_IP:KAM_PORT;transport=udp;lhst=$var(host);lm=uas>\r\n", "CSeq");route(NATMANAGE);}return;
}failure_route[MANAGE_FAILURE] {route(NATMANAGE);if (t_is_canceled()) exit;return;
}route[INVITE] {if ($ua =~ "FreeSWITCH") {xlog("fs call microsip\n");$du = "MICROSIP";} else {xlog("microsip call fs\n");$du = "FS";}$var(user) = $(sel(contact.uri.user));remove_hf("Contact");$var(host) = $(sut{s.encode.base64t});append_hf("Contact: <sip:$var(user)@KAM_IP:KAM_PORT;transport=udp;lhst=$var(host);lm=uac>\r\n", "CSeq");route(RELAY);exit;
}

当然 OpenSIPS 有拓扑隐藏模块,UA 看不到 rr 头,工作的很好 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/20640.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2024.05.30更新票星球抢购软件

文章目录 软件功能订阅须知早期代码软件功能 自持自定义搜索演唱会信息支持添加、删除观影人信息支持多账号并发抢票支持捡漏模式支持IP代理订阅须知 订阅后如果有问题,请联系博主,如果不懂可以免费提供讲解和远程服务早期代码 def enter_concert(self):print(u###打开浏览器…

Unity DOTS技术(一)简介

文章目录 一.概述二.将会介绍的内容三.DOTS技术与传统方式的不同传统问题DOTS技术 四.插件安装 一.概述 传统的游戏开发中,如果有成千上万的物体在场景中运动,那么你一定会认为是疯了.但有了Dost技术这一些都将变成可能.如图场景中有10000个物体在同时运动,帧率即能保持在60Fp…

【星海出品】Langchain Prompt template

Management prompt words We can use this program to face students from different families. But now this program cannot communicate in Chinese. URL: https://platform.openai.com/account/api-keys LLMs&#xff1a; 这是一个语言模型&#xff0c;It lets input word…

Science:论文写不出来?这三个方法让你一天完成一篇论文

我是娜姐 迪娜学姐 &#xff0c;一个SCI医学期刊编辑&#xff0c;探索用AI工具提效论文写作和发表。 众所周知&#xff0c;干了学术研究这一行&#xff0c;论文就是你研究质量和数量的衡量标准&#xff0c;可以说&#xff0c;你的一切“输入”-读文献、做实验、分析数据&#x…

k8s之PV、PVC

文章目录 k8s之PV、PVC一、存储卷1、存储卷定义2、存储卷的作用2.1 数据持久化2.2 数据共享2.3 解耦2.4 灵活性 3、存储卷的分类3.1 emptyDir存储卷3.1.1 定义3.1.2 特点3.1.3 用途3.1.4 示例 3.2 hostPath存储卷3.2.1 定义3.2.2 特点3.2.3 用途3.2.4 示例 3.3 NFS存储卷3.3.1 …

【C语言】柔性数组

前言 你是否听说过柔性数组呢&#xff1f;如果没有的话&#xff0c;就一起了解一下吧。 &#xff08;没有malloc free calloc realloc 四个函数的前置知识的朋友最好先阅读一下我的“动态内存管理”一文&#xff0c;因为下面会涉及到。&#xff09; 介绍 C99中&#xff0c;…

python找出100~999之间的水仙花数字

水仙花数字&#xff1a;个位&#xff0c;十位&#xff0c;百位的立方之和等于这个数本身 例如&#xff1a;153 1^35^33^3 for i in range(100, 1000):bw i // 100sw i % 100 // 10gw i % 10if bw ** 3 sw ** 3 gw ** 3 i:print(i)

Chatgpt-4o:人工智能领域的革新与未来展望

随着科技的飞速发展&#xff0c;人工智能&#xff08;AI&#xff09;领域正经历着前所未有的变革。作为这一领域的佼佼者&#xff0c;OpenAI于2024年5月13日正式发布了其最新旗舰模型——Chatgpt-4o。这一模型不仅在技术上取得了重大突破&#xff0c;更在用户体验、应用场景以及…

【OS】AUTOSAR OS系统调用产生Trap的过程详解

目录 前言 正文 1.Os_Hal_Trap使用示例 2. Os_Hal_Trap的定义 3. syscall详解详解

LeetCode题练习与总结:路径总和Ⅱ--113

一、题目描述 给你二叉树的根节点 root 和一个整数目标和 targetSum &#xff0c;找出所有 从根节点到叶子节点 路径总和等于给定目标和的路径。 叶子节点 是指没有子节点的节点。 示例 1&#xff1a; 输入&#xff1a;root [5,4,8,11,null,13,4,7,2,null,null,5,1], target…

FreeRTOS同步互斥与通信

本章简介&#xff1a; 本章是概述性的内容。可以把多任务系统当做一个团队&#xff0c;里面的每一个任务就相当于团队里的一个人。团队成员之间要协调工作进度(同步)、争用会议室(互斥)、沟通(通信)。多任务系统中所涉及的概念&#xff0c;都可以在现实生活中找到例子。 各类RT…

Java大厂面试题第2季

一、本课程前提要求和说明 面试题1&#xff1a; 面试题2&#xff1a; 面试题3&#xff1a; 面试题4&#xff1a; 面试题5&#xff1a; 高频最多的常见笔试面试题目 ArrayList HashMap 底层是什么东东 JVM/GC 多线程与高并发 java集合类

【科研基础】证明积累

1-Bayesian Estimation (P317) Suppose that x = θ + ν w h e r e ν i s a n N ( 0 , σ ) random variable and θ is the value of a n N ( θ 0 , σ 0 ) random variable θ (Fig. 8-7). Find the bayesian estimate θ o f θ . \begin{align…

大学校园广播“录编播”与IP校园公共广播系统技术方案

一、项目概述 1、校园IP网络广播系统概述 大学校园广播系统是学校整个弱电系统中的子系统&#xff0c;它是每个学校不可缺少的基础设施之一&#xff0c;在传递校园文化、传播校园新闻资讯方面发挥着重要的作用。近几年来&#xff0c;虽然视频技术和网络技术在飞速发展&#xf…

操作系统的体系结构:宏内核和微内核

操作系统的体系结构是一个开放的问题。操作系统在核心态为应用程序提供公共的服务&#xff0c;那么操作系统在核心态应该提供什么服务、怎样提供服务&#xff1f;有关这个问题的回答形成了两种主要的体系结构&#xff1a;宏内核和微内核。 宏内核&#xff1a;大而全 宏内核系统…

2024蓝桥杯国赛C++研究生组游记+个人题解

Day0 开始复习&#xff0c;过了一遍大部分板子 本来打算再学一遍SAM&#xff0c;但是想到去年考了字符串大题今年应该不会再考了吧。。 过了一遍数据结构和图论&#xff0c;就1点了 两点的时候还没睡着&#xff0c;舍友打游戏好像打到2点过。。 Day1 相当困 第一题&…

word里面没有Acrobat选项

加载项被禁止&#xff0c;选择项里面&#xff0c;没有Acrobat选项 文件-》选项 加载项-》com加载项-》转到 添加Acrobat 出现Acrobat选项

[Qt]关于QListWidget、QScrollArea 为什么在QDesigner上设置了之后界面上仍然不生效的问题

前言 最近做了一些有关QListWidget和QScrollArea的控件&#xff0c;我去&#xff0c;这两个控件是真的坑&#xff0c;明明我在QDesigner的操作界面上对这两个控件的界面进行了修改&#xff0c;但是编译出来的软件就是看上去什么都没有&#xff0c;很坑&#xff0c;Gpt也没解决…

【linux】宝塔,首页挂载磁盘,显示使用情况

挂载前&#xff1a; 挂载后&#xff1a; 数据无价&#xff0c;建议&#xff1a;备份需要挂载的磁盘&#xff0c;或者使用新磁盘来进行操作。 1、下载自动挂载磁盘的脚本&#xff1a; wget -O auto_disk.sh http://download.bt.cn/tools/auto_disk.sh 2、给脚本添加执行权限&a…

Re0:从零开始的C++游戏开发 【下】

Re0:从零开始的C游戏开发 &#xff08;下&#xff09; 这是蒟蒻观看B站upVoidmatrix的课程从零开始的提瓦特幸存者的个人笔记【自用】 前言&#xff1a;采用适用于小白的easyx图形库。 第三集 提瓦特の幸存者&#xff08;下&#xff09; 3.1 用户界面实现和设计模式基础 3…