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

AI 赋能前端 -- 文本内容概要生成
幸福不在于你获得了什么,而在于你比他人多获得了什么 是比较出来的 大家好,我是柒八九。一个专注于前端开发技术/Rust及AI应用知识分享的Coder 此篇文章所涉及到的技术有 OpenAILangChainRust/WebAssemblyWeb Workerreact+ts+vite配置环境变量(env)因为,行文字数所限,有些概…...

orin部署tensorrt、cuda、cudnn、pytorch、onnx
绝大部分参考https://blog.csdn.net/qq_41336087/article/details/129661850 非orin可以参考https://blog.csdn.net/JineD/article/details/131201121 报错显卡驱动安装535没法安装、原始是和l4t-cuda的部分文件冲突 Options marked [*] produce a lot of output - pipe it t…...

使用javacv对摄像头视频转码并实现播放
要实现Java接受RTSP流解码,并推送给前端实现播放实时流,可以使用一些流媒体处理库,比如JavaCV或者FFmpeg等。以下是一个简单的示例代码: 1.控制层方面的 根据视频rtsp流链接打开转换,通过响应写出流到前台使用flvjs播…...

Linux网络-Socket套接字_Windows与Linux端双平台基于Udp传输协议进行多线程跨平台的服务器与客户端网络通信的简易聊天室实现
文章目录 一、Socket套接字二、Udp 常见API1. int socket(int domain, int type, int protocol);2. int bind(int socket, const struct sockaddr *address, socklen_t address_len);struct sockaddr 3. ssize_t recvfrom(int socket, void *restrict buffer, size_t length, i…...

20分钟快速入门SQL
SQL(Structured Query Language,结构化查询语言)是一种专门用来管理和操作关系型数据库的编程语言。以下是SQL入门的一些基础概念和教程: 1. SQL基础 数据库(Database):存储数据的集合。表&am…...

汇总区间,合并区间
题目一: 代码如下: vector<string> summaryRanges(vector<int>& nums) {vector<string> ret;if (nums.size() 0)return ret;int n nums.size();int i 0;while (i < n){int prev i;i;while (i < n && nums[i] n…...

Web程序设计-实验05 DOM与BOM编程
题目 【实验主题】 影视网站后台影视记录管理页设计 【实验任务】 1、浏览并分析多个网站后台的列表页面、编辑页面(详见参考资源,建议自行搜索更多后台页面)的主要元素构成和版面设计,借鉴并构思预期效果。 2、新建 index.h…...

Window系统安装Docker
因为docker只适合在liunx系统上运行,如果在window上安装的话,就需要开启window的虚拟化,打开控制面板,点击程序,在程序和功能中可以看到启动和关闭window功能,点开后,找到Hyper-V,Wi…...

RabbitMQ不完整的笔记
同步的不足 1、拓展性差,当要添加功能时,需要在原来的功能代码上做修改,高耦合。 2、性能下降,调用者需要等待服务提供者执行完返回结果后,才能继续向下执行 3、级联失败,由于我们是基于OpenFeign调用交易…...

微软Edge浏览器深度解析:功能、同步、隐私与安全
微软Edge浏览器是微软公司开发的一款网页浏览器,它基于Chromium内核,提供了快速、安全和兼容性良好的网页浏览体验。以下是关于微软Edge浏览器的详细信息和使用指南: 微软Edge浏览器的主要特点: 1. 基于Chromium内核: 渲染引擎:Chromium内核是基于开源项目Blink的,它…...