没有 rr 头的 kamailio 路由脚本
分享下笔者最近编写的 kamailio 路由脚本
- 不用 rr 模块,因为有些 sip 协议栈不支持 rr 头
- 处理 sip 注册直接回 200 OK,这部分目前不是重点
- 更换 contact 头,换成 kamailio 自己
- 目前只支持 sip transport 为 udp,以后可能支持 tcp,tls 等
测试环境为:
- kamailio 版本为 5.8.1
- kamailio ip 为 192.168.43.135
- fs ip为 192.168.43.203
- microsip ip 为 192.168.43.68,修改 microsip.ini,sourcePort=5060
- fs 呼叫 kamailio, 后者 relay 到 microsip 的 5060 端口
- 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 头,工作的很好
相关文章:
没有 rr 头的 kamailio 路由脚本
分享下笔者最近编写的 kamailio 路由脚本 不用 rr 模块,因为有些 sip 协议栈不支持 rr 头处理 sip 注册直接回 200 OK,这部分目前不是重点更换 contact 头,换成 kamailio 自己目前只支持 sip transport 为 udp,以后可能支持 tcp&…...
 
mysql 分区
目标 给一个表(半年有800万)增加分区以增加查询速度 约束 分区不能有外键否则会报错 https://blog.csdn.net/yabingshi_tech/article/details/52241034 主键 按照时间列进行分区 https://blog.csdn.net/winerpro/article/details/135736454 参看以…...
 
在龙芯安装docker compose
安装过程报错:pynacl无法安装 原因:未知 解决尝试:单独安装pynacl 执行:pip install pynacl 报错: 再次执行dockerscompose撒谎啥 少了头文件 dev,表示c编译器有问题 python是c编写的 喵的 搞了半天是我…...
纯C++做多项式拟合
一、多项式拟合用途 当前有一组对应的x、y数据,希望通过这些数据点做出近似的多项式曲线:YnX^2mXc 其中多项式最高次数可调,返回各个参数及曲线的拟合度R^2 二、函数实现 参数中的order为设置的多项式最高次次数,coefficients为…...
 
vulnhub靶场之FunBox-9
一.环境搭建 1.靶场描述 Its a box for beginners, but not easy. Gather careful !!! Hint: Dont waste your time ! Every BruteForce-Attack at all ports can be stopped after 1500 trys per account. Enjoy the game and WYSIWYG ! This works better with VirtualBox…...
C# 变量与参数详解
在C#编程中,变量和参数是构建程序逻辑的基础。本篇博客将深入探讨C#中的变量作用域、参数传递方式、以及一些高级特性,如in、ref、out参数,params修饰符,可选参数和命名参数等。 变量作用域 在C#中,变量的作用域分为…...
 
CentOS7.9部署安装OpenGauss 5.0.2企业版
1、更新系统: yum update -y 2、更改主机名: hostnamectl set-hostname opendb01 3、关闭透明页: echo never > /sys/kernel/mm/transparent_hugepage/enabled echo never > /sys/kernel/mm/transparent_hugepage/defrag# 加入开机自启动 echo …...
 
java基础-chapter15(io流)
io流:存储和读取数据的解决方案 I:input O:output io流的作用:用于读写数据(本地文件,网络) io流按照流向可以分为: 输出流:程序->文件 输入流:文件->程序 io流按照操作文件…...
 
mysql去除重复数据
需求描述 doc表有很多重复的title,想去除掉重复的记录 表结构 CREATE TABLE doc (id INT PRIMARY KEY,title VARCHAR(255),content TEXT );去重SQL -- 创建临时表 CREATE TEMPORARY TABLE temp_doc AS SELECT * FROM doc WHERE 10;-- 插入唯一的记录(每个title最…...
 
MySQL基础索引知识【索引创建删除 | MyISAM InnoDB引擎原理认识】
博客主页:花果山~程序猿-CSDN博客 文章分栏:MySQL之旅_花果山~程序猿的博客-CSDN博客 关注我一起学习,一起进步,一起探索编程的无限可能吧!让我们一起努力,一起成长! 目录 一,索引用…...
 
SJ601-II垂直法阻燃性能测试仪
一、主要用途 主要用于有阻燃要求的纺织品如机织物、针织物、涂层产品、层压产品、服装织物、装饰织物、帐篷织物、窗帘幕布、建材装饰织物等材料阻燃性能的测定。并用于窗帘幕布阻燃等级的测定和防火封堵材料的型式过证。 二、仪器特征 1、脉冲自动点火,安全可靠…...
 
瑞吉外卖项目学习笔记(二)后台系统的员工管理业务开发
一、完善登录功能 1.1 问题分析 1.2 代码实现 package com.itheima.reggie.filter;//这是一个过滤器类 //登录检查过滤器import com.alibaba.fastjson.JSON; import com.itheima.reggie.common.R; import lombok.extern.slf4j.Slf4j; import org.slf4j.Logger; import org.slf…...
 
Unity OutLine 模型外描边效果
效果展示: 下载链接...
 
CRLF注入漏洞
1.CRLF注入漏洞原理 Nginx会将 $uri进行解码,导致传入%0a%0d即可引入换行符,造成CRLF注入漏洞。 执行xss语句 2.漏洞扩展 CRLF 指的是回车符(CR,ASCII 13,\r,%0d) 和换行符(LF,ASCII 10,\n&am…...
理解接口回调及其在 RabbitMQ 中的实际运用
介绍 接口回调是一种常见的编程模式,它在异步编程中发挥着重要作用。本文将通过一个简单的示例介绍接口回调的概念和原理,并探讨它在 RabbitMQ 中的实际应用。 接口回调的概念 接口回调是一种编程模式,用于在异步编程中实现回调机制。它允许…...
大模型日报2024-05-31
大模型日报 2024-05-31 大模型资讯 Anthropic揭示Claude大语言模型的内部机制 摘要: 研究人员将大语言模型的活动模式与特定概念关联起来,并展示了他们可以通过调整这些模式来控制AI模型的行为。 Mistral AI开源新款代码语言模型Codestral 摘要: 人工智能初创公司Mi…...
 
HarmonyOS 鸿蒙DevEco:导入无法运行提示Sync failed
场景:导入官网下载的案例后导入发现无法运行模拟机,Notifications提示Sync failed... 解决:查看Cause发现是版本问题,通过修改相关内容来解决该问题 1、打开案例地址找到hvigor文件夹 2、打开hvigor-config.json5,将&…...
 
kafka的安装
windows下kafka的安装 【Kafka】Windows下安装Kafka(图文记录详细步骤)_windows安装kafka-CSDN博客 kafka生产消息 kafka消费消息...
代码随想录算法训练营第36期DAY45
DAY45 1两数之和 [https://www.bilibili.com/video/BV1pt421u7qG/?spm_id_from333.880.my_history.page.click&vd_sourcebaa5f3043be10f96febc0c68c5983df5] 出自B站热血编程系列,主要是复习双指针sum写法、重载比较运算符 class Solution {public: vec…...
 
springboot+vue 社区养老服务系统
Springbootvue社区居家养老服务系统,数据库mysql,mybatis框架,有可视化页面。 功能: 用户管理 养老服务管理 护理人员管理 服务类型管理 健康状况管理 社区管理 服务区管理 娱乐资讯管理 咨询分类管理 反馈建议 系统简历管理 轮播…...
 
国防科技大学计算机基础课程笔记02信息编码
1.机内码和国标码 国标码就是我们非常熟悉的这个GB2312,但是因为都是16进制,因此这个了16进制的数据既可以翻译成为这个机器码,也可以翻译成为这个国标码,所以这个时候很容易会出现这个歧义的情况; 因此,我们的这个国…...
【Linux】shell脚本忽略错误继续执行
在 shell 脚本中,可以使用 set -e 命令来设置脚本在遇到错误时退出执行。如果你希望脚本忽略错误并继续执行,可以在脚本开头添加 set e 命令来取消该设置。 举例1 #!/bin/bash# 取消 set -e 的设置 set e# 执行命令,并忽略错误 rm somefile…...
 
基于距离变化能量开销动态调整的WSN低功耗拓扑控制开销算法matlab仿真
目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.算法仿真参数 5.算法理论概述 6.参考文献 7.完整程序 1.程序功能描述 通过动态调整节点通信的能量开销,平衡网络负载,延长WSN生命周期。具体通过建立基于距离的能量消耗模型&am…...
PHP和Node.js哪个更爽?
先说结论,rust完胜。 php:laravel,swoole,webman,最开始在苏宁的时候写了几年php,当时觉得php真的是世界上最好的语言,因为当初活在舒适圈里,不愿意跳出来,就好比当初活在…...
React Native在HarmonyOS 5.0阅读类应用开发中的实践
一、技术选型背景 随着HarmonyOS 5.0对Web兼容层的增强,React Native作为跨平台框架可通过重新编译ArkTS组件实现85%以上的代码复用率。阅读类应用具有UI复杂度低、数据流清晰的特点。 二、核心实现方案 1. 环境配置 (1)使用React Native…...
 
《用户共鸣指数(E)驱动品牌大模型种草:如何抢占大模型搜索结果情感高地》
在注意力分散、内容高度同质化的时代,情感连接已成为品牌破圈的关键通道。我们在服务大量品牌客户的过程中发现,消费者对内容的“有感”程度,正日益成为影响品牌传播效率与转化率的核心变量。在生成式AI驱动的内容生成与推荐环境中࿰…...
鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院查看报告小程序
一、开发环境准备 工具安装: 下载安装DevEco Studio 4.0(支持HarmonyOS 5)配置HarmonyOS SDK 5.0确保Node.js版本≥14 项目初始化: ohpm init harmony/hospital-report-app 二、核心功能模块实现 1. 报告列表…...
 
论文浅尝 | 基于判别指令微调生成式大语言模型的知识图谱补全方法(ISWC2024)
笔记整理:刘治强,浙江大学硕士生,研究方向为知识图谱表示学习,大语言模型 论文链接:http://arxiv.org/abs/2407.16127 发表会议:ISWC 2024 1. 动机 传统的知识图谱补全(KGC)模型通过…...
Unit 1 深度强化学习简介
Deep RL Course ——Unit 1 Introduction 从理论和实践层面深入学习深度强化学习。学会使用知名的深度强化学习库,例如 Stable Baselines3、RL Baselines3 Zoo、Sample Factory 和 CleanRL。在独特的环境中训练智能体,比如 SnowballFight、Huggy the Do…...
Element Plus 表单(el-form)中关于正整数输入的校验规则
目录 1 单个正整数输入1.1 模板1.2 校验规则 2 两个正整数输入(联动)2.1 模板2.2 校验规则2.3 CSS 1 单个正整数输入 1.1 模板 <el-formref"formRef":model"formData":rules"formRules"label-width"150px"…...
