kamailio关于via那点事
如果kamailio作为代理服务器,在转到目的路由时 不删除原始的via信息 会造成信息泄露
如果 Kamailio 作为代理服务器(SIP Proxy)在转发 SIP 请求时不删除原始的 Via
信息,这确实可能会造成信息泄露。
📌 为什么不删除 Via
可能会泄露信息?
-
暴露内部网络信息
Via
头包含了 前一个发送者的 IP 地址、端口和传输方式(UDP/TCP/TLS)。- 如果
Via
头未被清理,可能会泄露 内部服务器 IP(如私有地址 192.168.x.x)或运营商信息。 - 例如,假设 Kamailio 运行在
10.10.10.1
,但 SIP 服务器在192.168.1.100
,那么Via
头可能会泄露:
这个信息 不应该暴露给外网。Via: SIP/2.0/UDP 192.168.1.100:5060;branch=z9hG4bK12345
-
攻击者可利用
Via
进行网络拓扑分析- 恶意用户可能利用
Via
头中的 IP 地址 扫描 SIP 代理的拓扑结构,寻找潜在的攻击点(如未受保护的 SIP 服务器)。
- 恶意用户可能利用
-
SIP 设备可能错误处理额外的
Via
- 某些 SIP 设备(特别是运营商的 SBC 或 PBX)可能不期望看到 额外的
Via
头,从而导致 SIP 处理异常(如400 Bad Request
、483 Too Many Hops
)。
- 某些 SIP 设备(特别是运营商的 SBC 或 PBX)可能不期望看到 额外的
✅ 解决方案:让 Kamailio 在转发请求时删除原始 Via
方法 1:使用 remove_hf("Via")
Kamailio 提供了 remove_hf("Via")
指令,可以在 SIP 代理模式下 移除所有 Via
头并重新生成,防止信息泄露。
在 kamailio.cfg
配置文件中:
request_route {if (!is_method("ACK")) {remove_hf("Via"); # 删除所有 Via 头}append_hf("Via: SIP/2.0/UDP $si:$sp;branch=z9hG4bK$var(branch)\r\n");t_relay();
}
🔹 解释:
- 移除
Via
头,防止泄露内部 IP。 - 手动添加新的
Via
,只显示 Kamailio 作为代理的 IP($si:$sp
)。
方法 2:使用 topos
模块(推荐)
topos
是 Kamailio 提供的 “拓扑隐藏”(Topology Hiding)模块,可以自动删除 Via
头,并在响应时恢复,防止信息泄露。
📌 安装 topos
模块
sudo apt install kamailio-topos-modules
📌 在 kamailio.cfg
启用 topos
loadmodule "topos.so"request_route {if (!is_method("ACK")) {topos_request();}t_relay();
}onreply_route {topos_reply();
}
🔹 解释:
topos_request()
删除Via
和Record-Route
,隐藏内部拓扑。topos_reply()
在响应时恢复正确的路由,确保 SIP 消息能正确返回。
📍 结论
✅ 不删除 Via
确实会导致信息泄露,特别是在 NAT 或运营商环境中!
✅ 推荐使用 remove_hf("Via")
或 topos
模块来移除 Via
,保护 SIP 代理的内部拓扑信息! 🚀
使用topos模块自动更正via
使用 topos
模块后,目的地路由的 Via
头信息
当 Kamailio 作为 SIP 代理(Proxy) 并启用了 topos
模块时,它会自动删除原始的 Via
头,并在转发 SIP 请求时仅留下 Kamailio 自己的 Via
。那么,在**目的地路由(最终 SIP 服务器)**收到的请求中,Via
头的情况如下:
📌 1. 启用了 topos
,最终目的地收到的 Via
头
示例:
📍 客户端 (EP1) 发送初始请求
INVITE sip:13545769997@222.223.190.118 SIP/2.0
Via: SIP/2.0/UDP 192.168.1.100:5060;branch=z9hG4bK111111
Via: SIP/2.0/UDP 10.10.10.1:5060;branch=z9hG4bK222222
Via: SIP/2.0/UDP 222.211.75.75:5060;branch=z9hG4bK333333
🔹 这里 Via
头中包含了所有中间代理的 IP(内部网络信息)。
📍 Kamailio 代理(启用了 topos
)
当 topos_request()
处理后,Kamailio 会:
- 删除原始
Via
头(192.168.1.100
、10.10.10.1
、222.211.75.75
)。 - 只留下 Kamailio 自己的
Via
头。
🔹 Kamailio 转发后的 SIP 请求
INVITE sip:13545769997@222.223.190.118 SIP/2.0
Via: SIP/2.0/UDP 47.100.62.225:5060;branch=z9hG4bKabcdef
📌 🔹 这里 Via
只保留了 Kamailio 自己的 IP(47.100.62.225
),不会暴露任何内部 IP!
📌 2. 目的地收到的 Via
头
最终,目的地路由(222.223.190.118) 只会看到 Kamailio 的 Via
:
INVITE sip:13545769997@222.223.190.118 SIP/2.0
Via: SIP/2.0/UDP 47.100.62.225:5060;branch=z9hG4bKabcdef
✅ 原始 Via
(192.168.1.100、10.10.10.1、222.211.75.75)已被隐藏,保护了 SIP 代理的内部网络结构!
📌 3. 响应中的 Via
处理
当 目的地(222.223.190.118) 发送 200 OK 响应时,它的 Via
头如下:
SIP/2.0 200 OK
Via: SIP/2.0/UDP 47.100.62.225:5060;branch=z9hG4bKabcdef
然后 Kamailio 会使用 topos_reply()
恢复正确的返回路径,但不会暴露目的地的 Via
,所以客户端最终收到的响应仍然不会看到 222.223.190.118 的 Via
。
📍 结论
✅ 目的地路由(最终 SIP 服务器)收到的 Via
头只包含 Kamailio 的 IP,不包含原始的 Via
头,确保了内部网络信息不被泄露!
✅ 响应时 Kamailio 也会正确恢复路径,确保 SIP 消息能够正确返回! 🚀
下面是一个完整的 Kamailio 作为 SIP 代理服务器(Proxy) 的 kamailio.cfg
配置,结合 Lua 脚本 进行 呼叫计费,并使用 topos
模块隐藏 Via
信息,确保 SIP 请求的安全性。
📌 功能概述
- 基本 SIP 代理功能
- 启用
topos
模块,隐藏Via
头 - 使用 Lua 进行通话计费
- 转发 INVITE、ACK、BYE 等必要的 SIP 请求
- 防止环路、错误处理
- 超时释放通话
📌 Lua 计费脚本 (/usr/local/kamailio/lua/billing.lua
)
-- billing.lua - 计费逻辑(计算通话费用)
local billing = {}function billing.calculate_fee(duration)local rate_per_second = 0.05 -- 每秒 0.05 元local cost = duration * rate_per_secondreturn cost
endfunction billing.log_call(call_id, caller, callee, duration)local cost = billing.calculate_fee(duration)local log_str = string.format("CALL BILLING - Call-ID: %s, From: %s, To: %s, Duration: %d sec, Cost: %.2f 元",call_id, caller, callee, duration, cost)-- 记录日志KSR.info(log_str)
endreturn billing
📌 Kamailio kamailio.cfg
配置
####### 全局配置 #########!KAMAILIO
#!define WITH_LUA
#!define WITH_TOPOloadmodule "sl.so" # SIP 事务管理
loadmodule "tm.so" # SIP 事务管理
loadmodule "rr.so" # 记录路由
loadmodule "maxfwd.so" # Max-Forwards 处理
loadmodule "siputils.so" # 处理 SIP 头
loadmodule "topos.so" # 隐藏 Via 头
loadmodule "topos_redis.so" # Redis 版本的 topos(推荐)
loadmodule "lua.so" # Lua 脚本支持modparam("topos", "storage", "redis://127.0.0.1:6379/0") # 存储 SIP 会话信息到 Redis
modparam("lua", "load", "/usr/local/kamailio/lua/billing.lua")####### SIP 请求路由 ########request_route {if (!mf_process_maxfwd(10)) {sl_send_reply("483", "Too Many Hops");exit;}if (is_method("OPTIONS")) {sl_send_reply("200", "OK");exit;}# 处理 INVITEif (is_method("INVITE")) {record_route();topos_request(); # 删除原始 Via 信息route(1);exit;}# 处理 BYE(通话结束)if (is_method("BYE")) {handle_bye();topos_request(); # 确保 Via 头处理route(1);exit;}route(1);
}route[1] {if (!t_relay()) {sl_reply_error();}exit;
}####### 响应处理 ########onreply_route {topos_reply(); # 确保 Via 头处理
}####### 处理 BYE 进行计费 ########event_route[tm:local-request] {if (is_method("BYE")) {handle_bye();}
}####### 计费逻辑(Lua 计费) ########route[handle_bye] {xlog("L_INFO", "Handling BYE request for call billing");# 获取通话时长if ($Ts - $T_req_time > 0) {$var(duration) = $Ts - $T_req_time;} else {$var(duration) = 0;}# 获取通话 ID、主叫和被叫$var(call_id) = $ci;$var(caller) = $fU;$var(callee) = $tU;# 调用 Lua 计费$var(lua_result) = lua_runstring(string.format("require 'billing'.log_call('%s', '%s', '%s', %d)",$var(call_id), $var(caller), $var(callee), $var(duration)));xlog("L_INFO", "Billing logged: " + $var(lua_result));
}
📌 代码解析
-
topos
模块topos_request();
删除Via
头,防止信息泄露topos_reply();
确保返回路径正确- 使用 Redis 存储会话信息,防止 Kamailio 重启导致
Via
丢失
-
Lua 计费
calculate_fee(duration)
计算通话费用log_call(call_id, caller, callee, duration)
记录计费日志
-
计费触发时机
onreply_route {}
处理 SIP 响应event_route[tm:local-request] {}
监听BYE
事件并触发 Lua 计费
-
SIP 代理功能
- 转发 INVITE、ACK、BYE
- 防止环路(Max-Forwards 机制)
- 记录路由(Record-Route 机制)
📌 运行流程
📞 呼叫过程:
EP1 -> Kamailio
发送INVITE
Kamailio
使用topos_request()
删除原始Via
头Kamailio -> 目的地
转发INVITE
目的地 -> Kamailio
发送200 OK
Kamailio
使用topos_reply()
恢复路径 并转发给EP1
EP1
发送BYE
Kamailio
调用Lua
计算通话时长和费用Kamailio
记录计费日志,并转发BYE
到目的地
📌 示例日志
CALL BILLING - Call-ID: c12345abcd, From: 01089672389, To: 13545769997, Duration: 120 sec, Cost: 6.00 元
📌 结论
✅ 隐藏 Via
头,保护代理服务器信息
✅ 使用 Lua 实现通话计费
✅ 支持 topos
,防止 Via
泄露
✅ 支持基本 SIP 代理功能(INVITE、BYE、ACK) 🚀
已经使用了lua脚本,为什么还要把路由相关代码写入到kamailio.cfg中呢?
这是因为 Kamailio 的路由逻辑必须在 kamailio.cfg
中定义,Lua 主要是用于 业务逻辑扩展(如计费),而不是完全替代 kamailio.cfg
的 SIP 处理能力。下面详细解释 为什么 kamailio.cfg
仍然需要路由逻辑:
📌 为什么 kamailio.cfg
仍然需要路由逻辑?
Kamailio 主要用于 SIP 代理、注册和路由控制,其核心逻辑(如 INVITE
处理、路由转发、事务管理等)都是由 kamailio.cfg
配置完成的。Lua 只是一个辅助工具,不能完全代替 Kamailio 处理 SIP 消息。
🚀 Kamailio kamailio.cfg
主要职责
-
解析 SIP 请求
- 识别 SIP 方法(如
INVITE
、BYE
) - 处理
Max-Forwards
以防止循环 - 记录路由 (
Record-Route
) 以保持通话链路
- 识别 SIP 方法(如
-
管理 SIP 事务
tm
(事务管理)模块用于 SIP 事务控制sl
(状态回复)模块用于无事务性消息回复
-
控制 SIP 代理逻辑
- 进行
t_relay()
(SIP 请求转发) - 处理
onreply_route{}
(SIP 响应处理) - 通过
topos
隐藏Via
头
- 进行
📌 Lua 主要职责
- 提供业务逻辑(如计费、日志记录)
- 与外部系统交互(如数据库、Redis、REST API)
- 增强 Kamailio,但不能完全取代
kamailio.cfg
Lua 不能直接控制 Kamailio 的 SIP 代理行为,它只是一个扩展工具。例如,Lua 不能执行 t_relay()
这样的 SIP 代理操作,必须在 kamailio.cfg
中完成。
📌 为什么不能只用 Lua 处理 SIP?
- Lua 不能直接处理 SIP 事务(如
t_relay()
),必须在kamailio.cfg
内调用。 - Lua 不能替代
kamailio.cfg
的核心 SIP 处理逻辑(如record_route()
)。 - Kamailio 是一个高性能 SIP 代理,C 语言模块比 Lua 解析更快,直接在
kamailio.cfg
处理 SIP 逻辑可以提升性能。
📌 最佳实践:结合 kamailio.cfg
和 Lua
kamailio.cfg
负责 SIP 代理、转发、事务管理- Lua 负责计费、日志、数据库交互
例如:
- Kamailio 处理
BYE
请求并调用 Lua 计费 - Lua 计算通话时长,并将费用存入数据库
- Kamailio 继续处理 SIP 路由
📌 结论
不能完全用 Lua 替代 kamailio.cfg
,因为 Lua 不能直接处理 SIP 代理逻辑。
最佳方式是:kamailio.cfg
处理 SIP 代理,Lua 负责计费、日志等业务逻辑。 🚀
相关文章:

kamailio关于via那点事
如果kamailio作为代理服务器,在转到目的路由时 不删除原始的via信息 会造成信息泄露 如果 Kamailio 作为代理服务器(SIP Proxy)在转发 SIP 请求时不删除原始的 Via 信息,这确实可能会造成信息泄露。 📌 为什么不删除 …...

[MFC] 使用控件
介绍如何使用控件,以及如何获取控件中的数值 check Box 添加点击事件,即选中和取消选中触发的事件 第一种方式是按照如下方式第二种方式是直接双击点击进去 void CMFCApplication1Dlg::OnBnClickedCheckSun() {// TODO: 在此添加控件通知处理程序代…...

【探索未来科技】2025年国际学术会议前瞻
【探索未来科技】2025年国际学术会议前瞻 【探索未来科技】2025年国际学术会议前瞻 文章目录 【探索未来科技】2025年国际学术会议前瞻前言1. 第四届电子信息工程、大数据与计算机技术国际学术会议( EIBDCT 2025)代码示例:机器学习中的线性回…...

使用wpa_supplicant和wpa_cli 扫描wifi热点及配网
一:简要说明 交叉编译wpa_supplicant工具后会有wpa_supplicant和wpa_cli两个程序生产,如果知道需要连接的wifi热点及密码的话不需要遍历及查询所有wifi热点的名字及信号强度等信息的话,使用wpa_supplicant即可,否则还需要使用wpa_…...

Sealos的k8s高可用集群搭建
Sealos 介绍](https://sealos.io/zh-Hans/docs/Intro) Sealos 是一个 Go 语言开发的简单干净且轻量的 Kubernetes 集群部署工具,能很好的支持在生产环境中部署高可用的 Kubernetes 集群。 Sealos 特性与优势 支持离线安装,工具与部署资源包分离&#…...

Android和DLT日志系统
1 Linux Android日志系统 1.1 内核logger机制 drivers/staging/android/logger.c static size_t logger_offset( struct logger_log *log, size_t n) { return n & (log->size - 1); } 写的off存在logger_log中(即内核内存buffer)&am…...

【openresty服务器】:源码编译openresty支持ssl,增加service系统服务,开机启动,自己本地签名证书,配置https访问
1,openresty 源码安装,带ssl模块 https://openresty.org/cn/download.html (1)PCRE库 PCRE库支持正则表达式。如果我们在配置文件nginx.conf中使用了正则表达式,那么在编译Nginx时就必须把PCRE库编译进Nginx…...

如何将网站提交百度收录完整SEO教程
百度收录是中文网站获取流量的重要渠道。本文以我的网站,www.mnxz.fun(当然现在没啥流量) 为例,详细讲解从提交收录到自动化维护的全流程。 一、百度收录提交方法 1. 验证网站所有权 1、登录百度搜索资源平台 2、选择「用户中心…...

【STM32】ADC|多通道ADC采集
本次实现的是ADC实现数字信号与模拟信号的转化,数字信号时不连续的,模拟信号是连续的。 1.ADC转化的原理 模拟-数字转换技术使用的是逐次逼近法,使用二分比较的方法来确定电压值 当单片机对应的参考电压为3.3v时,0~ 3.3v(模拟信…...

蓝桥杯算法日记|贪心、双指针
3412 545 2928 2128 贪心学习总结: 1、一般经常用到sort(a,an);【a[n]】排序,可以给整数排,也可以给字符串按照字典序排序 2、每次选最优 双指针 有序数组、字符串、二分查找、数字之和、反转字…...

ArcGIS Pro SDK (二十七)自定义许可
ArcGIS Pro SDK (二十七)自定义许可 环境:Visual Studio 2022 + .NET6 + ArcGIS Pro SDK 3.0 文章目录 ArcGIS Pro SDK (二十七)自定义许可1 在Config.xaml中添加扩展配置2 在Module1.cs中实现接口IExtensionConfig1 在Config.xaml中添加扩展配置 <modules><inse…...

通过客户端Chatbox或OpenwebUI访问识别不到本地ollama中的模型等问题的解决
Chatbox和Open WebUI 等无法获取到 Ollama里的模型,主要是由以下原因导致: Ollama 服务未正确暴露给 Docker 容器或客户端模型未正确下载或名称不匹配网络配置或权限问题 排查以上问题的思路首先排查ollama服务是否启动,然后再看端口号 使…...

速度超越DeepSeek!Le Chat 1100tok/s闪电回答,ChatGPT 4o和DeepSeek R1被秒杀?
2023年,当全球科技界还在ChatGPT引发的AI狂潮中沉浮时,一场来自欧洲的"静默革命"正悄然改变游戏规则。法国人工智能公司Mistral AI推出的聊天机器人Le Chat以"比ChatGPT快10倍"的惊人宣言震动业界,其背后承载的不仅是技术…...

JVM速成=。=
JVM跨平台原理 跨平台:一次编译,到处运行 本质:不同操作系统上运行的JVM不一样,只需要把java程序编译成一份字节码文件,JVM执行不同的字节码文件。 Java是高级语言,提前编译一下(变成字节码文件…...

Packer 手动修复安装腾讯云插件
文章目录 Packer [腾讯云插件文档](https://developer.hashicorp.com/packer/integrations/hashicorp/tencentcloud) 提供的版本:v1.2.0,目前 Packer 构建镜像时,不支持现有2种[硬盘类型](https://www.tencentcloud.com/zh/document/product/…...

学习总结三十
下头论文 # P10605 下头论文 题目背景 莲子一直在苦恼关于论文的灵感。她为此花了太多时间,以至于没有时间理会她的伙伴梅莉。 题目描述 一天,莲子发现了一个绝妙的点子,并希望通过实验等过程将其完善。具体来说,她需要依次完成 n…...

开发完的小程序如何分包
好几次了,终于想起来写个笔记记一下 我最开始并不会给小程序分包,然后我就各种搜,发现讲的基本上都是开发之前的小程序分包,可是我都开发完要发布了,提示我说主包太大需要分包,所以我就不会了。。。 好了…...

Flutter PIP 插件 ---- Android
在 Flutter Android 应用中实现画中画功能 画中画(Picture-in-Picture, PiP)模式允许您的应用在一个固定在屏幕角落的小窗口中运行,同时用户可以与其他应用进行交互。本指南将介绍如何在 Flutter Android 应用中实现画中画功能,包括其局限性和解决方案。 项目地址 flutter_p…...

【20250211】字符串:459.重复的子字符串
#方法一:暴力求解法 # class Solution: # def repeatedSubstringPattern(self, s): # n len(s) # substr "" # #只重复一次不算“重复多次” # if n < 1: # return False # else: # …...

【DeepSeek学Cuda】矩阵转置:行读取优先还是列读取优先。
目录 **1. 实现A(按行读取,按列存储)2. 实现B(按列读取,按行存储)**3. 哪种更好 Professional cuda programming5. "当L1缓存被禁用时,所有内存访问都直接指向全局内存(Global …...

如何将3DMAX中的3D文件转换为AutoCAD中的2D图形?
大家好,今天我们来探讨一下如何将3DMAX中的3D文件转换为AutoCAD中的2D图形。无论是出于设计交流、施工准备还是其他实际需求,这种转换在工程设计领域都是一项非常实用的技能。接下来,我将为大家详细介绍几种实现这一转换的方法,帮助大家轻松跨越3D与2D设计之间的鸿沟。让我…...

Softhsm储存安全数据性能整理
目标:存储百万条数据对象 测试方案一:总大小2GB,每个数据对象大小约512KB,总条数4096条; 测试方案一:总大小2GB,每个数据对象大小约256B,总条数8388608条; 测试环境&am…...

【C++】——精细化哈希表架构:理论与实践的综合分析
先找出你的能力在哪里,然后再决定你是谁。 —— 塔拉韦斯特弗 《你当像鸟飞往你的山》 目录 1. C 与哈希表:核心概念与引入 2. 哈希表的底层机制:原理与挑战 2.1 核心功能解析:效率与灵活性的平衡 2.2 哈希冲突的本质&#x…...

【cocos creator】拖拽排序列表
DEMO下载 GameCtrl.ts import ItemCtrl from "./ItemCtrl";const { ccclass, property } cc._decorator;ccclass export default class GameCtrl extends cc.Component {property(cc.Node)content: cc.Node null;property(cc.Node)prefab: cc.Node null;arr []…...

b站——《【强化学习】一小时完全入门》学习笔记及代码(1-3 多臂老虎机)
问题陈述 我们有两个多臂老虎机(Multi-Armed Bandit),分别称为左边的老虎机和右边的老虎机。每个老虎机的奖励服从不同的正态分布: 左边的老虎机:奖励服从均值为 500,标准差为 50 的正态分布,即…...

【Mac排错】ls: command not found 终端命令失效的解决办法
【TroubleShooting on Mac】ls: command not found 终端命令失效的解决办法 A Solution to Solve “Command not found” of Terminal on Mac 一直在使用心爱的MacBook Pro的Terminal,并且为她定制了不同的Profile。 这样,看起来她可以在不同季节&…...

探秘Hugging Face与DeepSeek:AI开源世界的闪耀双子星
目录 一、引言:AI 开源浪潮的澎湃二、Hugging Face:AI 开源社区的基石(一)起源与发展历程(二)核心技术与特色(三)在 AI 领域的广泛应用 三、DeepSeek:东方崛起的 AI 新势…...

SkyWalking 10.1.0 实战:从零构建全链路监控,解锁微服务性能优化新境界
文章目录 前言一、集成SkyWalking二、SkyWalking使用三、SkyWalking性能剖析四、SkyWalking 告警推送4.1 配置告警规则4.2 配置告警通知地址4.3 下发告警信息4.4 测试告警4.5 慢SQL查询 总结 前言 在传统监控系统中,我们通过进程监控和日志分析来发现系统问题&…...

本地部署DeepSeek-R1(Mac版)
本地部署DeepSeek-R1(Mac版) 前言:过年这段时间,DeepSeek火遍全球,但遭受黑客攻击,10次对话基本9次都是服务器繁忙,请稍后重试。那么,本地部署整起来 总体来说,本地部署…...

网易易盾接入DeepSeek,数字内容安全“智”理能力全面升级
今年农历新年期间,全球AI领域再度掀起了一波革命性浪潮,国产通用大模型DeepSeek凭借其强大的多场景理解与内容生成能力迅速“出圈”,彻底改写全球人工智能产业的格局。 作为国内领先的数字内容风控服务商,网易易盾一直致力于探索…...