kamailio常见问题解答
- 其他
- 2025-09-08 17:09:01

常见问题解答
本页面接受贡献,你必须通过注册表单创建一个用户账户:
.kamailio.org/wiki/start?do=register
如果你有一个适合收录进常见问题解答的问题,并且你不知道答案,那就添加这个问题,并将答案设置为“待确定(TBA)”,其他人可以看到这个问题并给出正确答案。
目录 常见问题解答 常规问题 什么是Kamailio?Kamailio是一个B2BUA(背靠背用户代理)吗?Kamailio可以用作SIP重定向服务器吗?Kamailio可以用作SIP注册服务器和位置服务器吗?Kamailio可以用作SIP代理服务器吗?Kamailio可以用作SIP负载均衡服务器吗?我可以使用Kamailio对Asterisk或FreeSwitch进行负载均衡吗?Kamailio可以用作SIP最低成本路由服务器吗?是否可以重新加载Kamailio的配置文件?Kamailio的许可证是什么?它可以安装在Windows系统上吗? 传输层问题 Kamailio实现了哪些传输层协议?Kamailio支持WebSocket吗?Kamailio可以在传输层之间进行网关转换吗?Kamailio可以用于从Web浏览器(WebRTC)呼叫传统SIP电话吗? 模块问题 什么是Kamailio模块?Kamailio模块位于哪里?默认编译哪些模块?我如何编译和安装默认排除的模块?我使用了“make all”命令,但无法得到db_mysql.so文件。我该如何获取它?如何仅编译一个模块? SIP消息处理问题 为什么对头信息或消息体所做的更改不会立即显示出来?为什么From/To头信息的部分内容会多次出现?为什么SIP消息的消息体或其他部分会多次出现?如何为SIP请求的每个目的地设置不同的头信息值?当一个头信息多次出现时,如何删除其中一个单独的头字段?为什么SIP请求会收到“483跳数过多”或“513消息过大”的回复?我向Kamailio发送了SIP请求,但没有任何反应,为什么? 媒体流问题 Kamailio会中继媒体流吗?Kamailio支持哪些编解码器?Kamailio可以用于视频通话吗? 入门问题 在开始使用Kamailio之前,最低的知识要求是什么?有没有安装Kamailio的分步指南? 支持问题 有没有可以询问关于Kamailio问题的公共邮件列表?发布关于Kamailio问题的规则是什么?我可以在哪里报告问题?我在哪里可以购买商业支持? DNS问题 它支持ENUM吗?它可以进行哪些类型的DNS查询?它可以进行基于DNS(SRV)的负载均衡吗?如何避免在进行源IP比较时进行反向DNS查询? 即时消息和状态呈现问题 它可以路由SIP即时消息请求(页面模式,RFC3428)吗?它可以为离线用户存储即时消息,并在用户上线时传递这些消息吗?它可以使用MSRP(RFC4975)路由即时消息吗?它可以处理端到端的状态呈现请求吗?它支持SIP SIMPLE状态呈现(状态代理模型)吗?它支持资源列表服务吗?它可以充当状态呈现用户代理吗?它可以处理对话状态的订阅请求(也就是“闪烁指示灯”)吗?它支持处理XCAP吗? NAT穿越问题 Kamailio可以与从NAT后面连接的电话一起使用吗?Kamailio可以安装在NAT后面(例如在Amazon EC2上)吗? 配置文件处理问题 我可以检查配置文件的语法错误吗?对于SIP消息,我必须删除在配置文件中添加的AVP(属性值对)吗?什么是伪变量?如何遍历逗号分隔字符串中的各项?如何评估函数的返回码?如何处理SIP请求的重传? 故障排除问题 我遇到了“内存不足”错误,该怎么办? 工具问题 如何在命令行生成HA1值?如何在命令行生成HA1B值?Kamctl给出了一个关于打开FIFO文件的错误,为什么?Kamcmd有时无法使用数字参数执行RPC命令,为什么? 常规问题 什么是Kamailio? Kamailio是一个SIP服务器,实现了RFC3261中的规范。其核心功能是路由任何类型的SIP数据包。除此之外,还实现了许多概念性的功能,更多信息请查看:[Kamailio功能](Kamailio Features) Kamailio是一个B2BUA吗? 不是,Kamailio是一个灵活的SIP代理。许多人将Asterisk、FreeSWITCH、SEMS或其他产品与Kamailio集成,以实现B2BUA功能。 [[http://ftp.iptel.org/pub/sems/doc/current/ModuleDoc_sbc.html|SEMS B2BUA]] Kamailio可以用作SIP重定向服务器吗? 可以。 Kamailio可以用作SIP注册服务器和位置服务器吗? 可以。 Kamailio可以用作SIP代理服务器吗? 可以。 Kamailio可以用作SIP负载均衡服务器吗? 可以。 我可以使用Kamailio对Asterisk或FreeSwitch进行负载均衡吗? 可以。 Kamailio可以用作SIP最低成本路由服务器吗? 可以。 是否可以重新加载Kamailio的配置文件? 如果你使用的是原生脚本语言,在更新配置文件后必须重新启动。但请注意,许多全局参数可以通过RPC/MI命令进行更改,而无需重新启动(例如,TCP连接超时、调试级别)。应用与已加载模块或路由块相关的更改始终需要重新启动。如果你使用的是KEMI脚本语言(Lua、Python、JavaScript、Ruby、Squirrel),那么你可以通过发出RPC命令来重新加载路由逻辑脚本,而无需重新启动Kamailio(有关更多详细信息,请参阅KEMI解释器模块文档:app_lua、app_python、app_python3、app_jsdt、app_ruby、app_sqlang)。 Kamailio的许可证是什么? Kamailio是一个根据GNU通用公共许可证第2版(即GPLv2)授权的开源应用程序。它可以在你的基础设施上免费使用(就像免费啤酒一样)。请记住,如果你将其作为二进制文件分发给客户,你还需要分发你所做更改的源代码。有关更多信息,请查看GPLv2常见问题解答。从2008年底开始,对核心和几个模块的贡献是在BSD许可证下进行的。这意味着它的部分内容可以提取出来,并根据BSD许可证条款使用。但总的来说,当作为一个应用程序使用时,必须遵循GPLv2的条款,因为GPLv2具有传染性。 它可以安装在Windows系统上吗? 不可以。目前没有官方的开发工作朝着这个方向进行,Linux/Unix实际上是运行服务器的首选平台。但是,使用类似于Windows下的Cygwin这样的类Linux环境来编译它可能并不困难。 传输层问题 Kamailio实现了哪些传输层协议? 在网络层,Kamailio支持IPv4和IPv6。在传输层,Kamailio支持UDP、TCP、TLS和SCTP。传输可以在异步模式下进行(配置选项),包括TCP和TLS。Kamailio可用于在这些协议的任意组合之间进行桥接,例如,在IPv4上通过UDP接收SIP数据包,并在IPv6上通过TLS发送出去。从4.0.0版本开始,Kamailio支持WebSocket传输协议,允许现代Web浏览器直接通过Kamailio相互通话。 Kamailio支持WebSocket吗? 支持,从4.0.0版本开始。它支持通过TCP(WS)和TLS(WSS)的WebSocket,同时支持IPv4和IPv6。 Kamailio可以在传输层之间进行网关转换吗? 可以。你可以使用Kamailio在一种传输方式上接收SIP消息,并在另一种传输方式上发送出去。例如,在IPv6上接收TLS协议的消息,并在IPv4上通过UDP发送出去。 Kamailio可以用于从Web浏览器(WebRTC)呼叫传统SIP电话吗? 从信令的角度来看是可以的。请记住,Kamailio是一个SIP数据包路由器,根本不处理媒体平面。简单来说,Kamailio可以对所有SIP消息进行从WebSocket到UDP、TCP、TLS或SCTP的网关转换。然而,请注意,媒体平面(RTP流)需要对RTP数据包进行特殊的安全编码,而旧的SIP电话可能不支持这种编码。 模块问题 什么是Kamailio模块? 模块是一个扩展,它编译成一个单独的目标文件,并可以在Kamailio启动时加载。通常,一个模块会导出一些新的函数,这些函数可以在配置文件的路由块中使用。 Kamailio模块位于哪里? 在源代码树中,有三个目录:modules/modules_k/ - 自4.0.0版本起不再使用modules_s/ - 自4.0.0版本起不再使用每个模块都位于其自己的子文件夹中。包含在Kamailio软件包中的模块的文档可在以下网址获取:http://kamailio.org/docs/modules/stable/ 默认编译哪些模块? 与Kamailio核心具有相同依赖项的模块会被默认编译。那些默认不编译的模块会保留在Makefile的“exclude_modules”变量中。要打印被排除模块的列表,请执行以下命令:make printvar v=exclude_modules 我如何编译和安装默认排除的模块? 将其添加到“make cfg”命令的“include_modules”变量中。例如,编译和安装app_lua和db_mysql模块:make FLAVOUR=kamailio include_modules=“app_lua db_mysql” cfgmake allmake install 我使用了“make all”命令,但无法得到db_mysql.so文件。我该如何获取它? 该模块默认不编译,因为它依赖于libmysqlclient。使用以下命令进行编译和安装:make modules include_modules=“db_mysql”make install include_modules=“db_mysql” 如何仅编译一个模块? 首先,确保使用以下命令能正常编译核心:make要编译单个模块,请使用:make modules modules=modules/modname将modname替换为你要编译的模块的实际名称——例如,仅编译tls模块:make modules modules=modules/tls SIP消息处理问题 为什么对头信息或消息体所做的更改不会立即显示出来? Kamailio始终处理接收到的SIP消息(请求或回复)。对头信息或消息体所做的更改会被保留为一个操作列表,在写入网络之前应用这些操作。这些更改可以是添加头信息、删除头信息、更新头信息的内容、添加或删除消息体,或者更新消息体的内容。如果你希望更改立即应用,请使用textopsx模块中的msg_apply_changes()函数:http://kamailio.org/docs/modules/stable/modules/textopsx.html#textopsx.msg_apply_changes使用时要小心,并且不要在record_route()之后使用它,因为这个函数必须插入一个包含将用于转发的本地套接字IP地址的头信息——在执行配置文件时,套接字尚未确定。例如,假设传入消息中不存在X-Hdr头信息,以下是一些情况:不应用更改: append_hf("X-Hdr: xyz\r\n"); if(is_present_hf("X-Hdr")) { # 这部分不会执行 } else { # 这部分会执行 } 应用更改: append_hf("X-Hdr: xyz\r\n"); msg_apply_changes(); if(is_present_hf("X-Hdr")) { # 这部分会执行 } else { # 这部分不会执行 } 为什么From/To头信息的部分内容会多次出现? 在进行头信息管理操作后,可能会导致From/To头信息的部分内容重复,或者结果是多个值的连接。这与前面的问题相关,因为更改不会立即应用,并且对头信息部分的更新不是一个简单的设置操作。例如,如果From用户名是“alice”,并且配置文件中的操作是: $fU = "bob"; ... $fU = "carol"; 结果可能是From用户名变为“bobcarol”。一种解决方案是在中间使用msg_apply_changes()函数: $fU = "bob"; msg_apply_changes(); ... $fU = "carol"; 另一种解决方案是将值保存在一个变量(例如,avp或xavp)中,并仅进行一次操作,如下所示: $xavp(fuser) = "bob"; ... $xavp(fuser[0]) = "carol"; ... $fU = $xavp(fuser); 建议在branch_route中更新From/To头信息,特别是当需要为传出分支设置不同的值时。上面的示例是对 f U 的赋值(也可以是其他变量,如 fU的赋值(也可以是其他变量,如 fU的赋值(也可以是其他变量,如fu、 t U 、 tU、 tU、tu等),但使用uac_replace_from()或uac_replace_to()等函数时,行为是相同的。 为什么SIP消息的消息体或其他部分会多次出现? 这与From/To部分多次出现的原因实际上是相同的。配置文件执行了多次更改头信息或消息体部分的操作。例如,如果消息体中有两个连接的用于媒体流的IP地址,那么很可能是rtpproxy函数被使用了两次,或者,如果SDP出现了两次,那么很可能是rtpengine函数被使用了两次。如果更新需要多次进行,请在中间使用msg_apply_changes()函数,否则请重构配置,使其仅执行一次操作(例如,RTP中继函数应在branch_route块中使用)。 如何为SIP请求的每个目的地设置不同的头信息值? 在branch_route中设置头信息的值。在request_route中对SIP消息执行的所有操作(包括从request_route执行的子路由中的操作)对于所有传出分支都是通用的。如果你只想为特定的目的地进行更新,请使用branch routes。示例:仅在发送到语音邮件服务器时添加X-VBox头信息,在发送到其他地方时添加X-Peer-ID头信息: request_route { ... if(is_method("INVITE")) { t_on_branch("SETHEADERS"); t_on_failure("REROUTE"); } t_relay(); exit; } branch_route[SETHEADERS] { if($rd=="voicemail.server ") { append_hf("X-VBox: $fU\r\n"); } else { append_hf("X-Peer-ID: abc\r\n"); } } failure_route[REROUTE] { if (t_is_canceled()) { exit; } if (t_check_status("486|408")) { $du = $null; $ru = "sip:voicemail.server "; t_on_failure("REROUTE"); exit; } } 非常重要的是,也要注意在request_route中多次执行相同的操作kamailio常见问题解答由讯客互联其他栏目发布,感谢您对讯客互联的认可,以及对我们原创作品以及文章的青睐,非常欢迎各位朋友分享到个人网站或者朋友圈,但转载请说明文章出处“kamailio常见问题解答”