没有 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框架,有可视化页面。 功能: 用户管理 养老服务管理 护理人员管理 服务类型管理 健康状况管理 社区管理 服务区管理 娱乐资讯管理 咨询分类管理 反馈建议 系统简历管理 轮播…...

linux之kylin系统nginx的安装
一、nginx的作用 1.可做高性能的web服务器 直接处理静态资源(HTML/CSS/图片等),响应速度远超传统服务器类似apache支持高并发连接 2.反向代理服务器 隐藏后端服务器IP地址,提高安全性 3.负载均衡服务器 支持多种策略分发流量…...

TDengine 快速体验(Docker 镜像方式)
简介 TDengine 可以通过安装包、Docker 镜像 及云服务快速体验 TDengine 的功能,本节首先介绍如何通过 Docker 快速体验 TDengine,然后介绍如何在 Docker 环境下体验 TDengine 的写入和查询功能。如果你不熟悉 Docker,请使用 安装包的方式快…...
golang循环变量捕获问题
在 Go 语言中,当在循环中启动协程(goroutine)时,如果在协程闭包中直接引用循环变量,可能会遇到一个常见的陷阱 - 循环变量捕获问题。让我详细解释一下: 问题背景 看这个代码片段: fo…...
uni-app学习笔记二十二---使用vite.config.js全局导入常用依赖
在前面的练习中,每个页面需要使用ref,onShow等生命周期钩子函数时都需要像下面这样导入 import {onMounted, ref} from "vue" 如果不想每个页面都导入,需要使用node.js命令npm安装unplugin-auto-import npm install unplugin-au…...

MMaDA: Multimodal Large Diffusion Language Models
CODE : https://github.com/Gen-Verse/MMaDA Abstract 我们介绍了一种新型的多模态扩散基础模型MMaDA,它被设计用于在文本推理、多模态理解和文本到图像生成等不同领域实现卓越的性能。该方法的特点是三个关键创新:(i) MMaDA采用统一的扩散架构…...
Linux云原生安全:零信任架构与机密计算
Linux云原生安全:零信任架构与机密计算 构建坚不可摧的云原生防御体系 引言:云原生安全的范式革命 随着云原生技术的普及,安全边界正在从传统的网络边界向工作负载内部转移。Gartner预测,到2025年,零信任架构将成为超…...
什么是EULA和DPA
文章目录 EULA(End User License Agreement)DPA(Data Protection Agreement)一、定义与背景二、核心内容三、法律效力与责任四、实际应用与意义 EULA(End User License Agreement) 定义: EULA即…...
土地利用/土地覆盖遥感解译与基于CLUE模型未来变化情景预测;从基础到高级,涵盖ArcGIS数据处理、ENVI遥感解译与CLUE模型情景模拟等
🔍 土地利用/土地覆盖数据是生态、环境和气象等诸多领域模型的关键输入参数。通过遥感影像解译技术,可以精准获取历史或当前任何一个区域的土地利用/土地覆盖情况。这些数据不仅能够用于评估区域生态环境的变化趋势,还能有效评价重大生态工程…...

C++ 求圆面积的程序(Program to find area of a circle)
给定半径r,求圆的面积。圆的面积应精确到小数点后5位。 例子: 输入:r 5 输出:78.53982 解释:由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982,因为我们只保留小数点后 5 位数字。 输…...

UR 协作机器人「三剑客」:精密轻量担当(UR7e)、全能协作主力(UR12e)、重型任务专家(UR15)
UR协作机器人正以其卓越性能在现代制造业自动化中扮演重要角色。UR7e、UR12e和UR15通过创新技术和精准设计满足了不同行业的多样化需求。其中,UR15以其速度、精度及人工智能准备能力成为自动化领域的重要突破。UR7e和UR12e则在负载规格和市场定位上不断优化…...