Kamailio RPC over HTTP 简介

简介

本文是关于如何通过 HTTP 在 Kamailio 上设置和使用 RPC 的基本概述。由于本示例极不安全,因此绝对不能在生产中使用。下一篇文章将介绍如何正确确保示例安全,以便在生产中使用。

这些示例的示例文件可在此处找到:

https://github.com/whosgonna/kamailio-httprpc/tree/main/ex1-insecure

Kamailio 的 JSONRPCS 和 xHTTP 模块

Kamailio的JSONCPRCS模块通过各种连接类型为Kamailio提供实时RPC(远程过程调用)接口。该模块本身支持 FIFO 套接字、TCP 和 DATAGRAM(UDP)类型的数据连接,但老实说,所有这些连接使用起来都很麻烦。不过,如果与 xHTTP 模块结合使用,就能在 Kamailio 本身内部轻松配置和使用 Kamailio 的远程管理接口。

如前所述,这确实存在一些明显的安全问题。首先,没有身份验证。其次,所有 RPC 命令都是允许的–这将允许关闭 Kamailio 或转储有关运行中的 Kamailio 实例的任何可用数据–包括转储预处理器定义的能力–你知道用户名和密码等东西通常存放在哪里。

尽管如此,了解 JSONRPCS 和 xHTTP 模块的使用方法以及如何向服务发送/从服务发送请求仍然是一个很好的起点。

配置(超基本)

这是我能想到的使用 http-rpc 的最简单配置。它除了说明其工作原理外毫无用处,但可以用来说明如何使用该功能:

#!KAMAILIO

loadmodule "sl"
loadmodule "json"
loadmodule "xhttp"
loadmodule "jsonrpcs"

tcp_accept_no_cl = yes
http_reply_parse = yes

modparam("jsonrpcs", "transport", 0)

request_route {
    exit;
}

event_route[xhttp:request] {
    jsonrpc_dispatch();
}

sl 是 xhttp 的要求,json 是 jsonrpcs 的要求。xhttp 模块的文档强烈建议使用 tcp_accept_no_cl 和 http_reply_parse,因此我们设置了这两个参数。jsonrpcs 模块默认情况下不使用 http 传输,因此我们将模块的传输参数设置为 0,这样就启用了 jsonrpcs 模块的所有传输(FIFO、UDP 和 HTTP)。

request_route 只是一个出口。xHTTP 模块导出了 xhttp:request 事件路由,当任何一个监听 TCP 接口收到 http 请求时(惊喜),就会使用该路由。我们在其中调用 jsonrpc_dispatch()函数,将请求传递给 JSONRPCS 模块。

通过 HTTP 连接到 RPC

那么,我们如何测试/使用它? curl将为我们做这件事。请记住,Kamailio默认侦听端口 5060 UDP和TCP。假设您在本地服务器上运行它,您应该能够通过 http 连接,但是使用此配置进行连接并不是很有用:

[kaufmania]$ curl -I http://localhost:5060
curl: (52) Empty reply from server

查看 Kamailio 日志:

25(31) ERROR: <core> [core/parser/msg_parser.c:749]: parse_msg(): ERROR: parse_msg: message=<HEAD / HTTP/1.1
Host: localhost:5060
User-Agent: curl/7.88.1
Accept: */*

>
25(31) ERROR: <core> [core/receive.c:376]: receive_msg(): core parsing of SIP message failed (172.21.0.1:44780/2)

发布请求:

因此,Kamailio 甚至无法识别 http HEAD 方法,而是尝试将其解析为 SIP。无论如何,我们最终还是要使用 POST 方法,所以让我们试试看:

[kaufmania]$ curl -I -X POST http://localhost:5060
curl: (52) Empty reply from server

仍然是空回复。这次查看日志,看起来有点希望:

29(35) ERROR: jsonrpcs [jsonrpcs_mod.c:1307]: ki_jsonrpcs_dispatch(): invalid json doc [[]]

消息被重新识别为 http,jsonrpcs_dispatch() 函数被调用,但参数无效。这并不奇怪,因为我们没有传递任何数据。

JSON-RPC

那么,这些数据应该是什么样子的呢?幸运的是,json-rpc这是一个实际的规范。预计有以下成员(键):

  • jsonrpc– 这是 json-rpc 版本,并且应该始终是2.0
  • id– 请求标识符。此 ID 也包含在回复中,以便发送它的客户端可以将请求和回复关联起来。在我们的示例中,我们将仅使用值1
  • method– RPC 应该执行的方法。与 REST API 不同,其中方法是 HTTP 方法,此处的值是特定于应用程序的。在本例中,我们的应用程序是 Kamailio,可接受的方法是核心和任何加载的模块提供的 RPC 方法。Kamailio 为每个版本记录了这些内容。 5.7.x 版本的 RPC 方法在这里
  • params– 这是可选的,取决于具体方法。Kamailio 的一些方法允许(甚至需要)额外的参数。对于 Kamailio,这些都是位置参数,因此它在 JSON 中应该如下所示:"params":["arg1","arg2",...]

因此,让我们尝试对不带参数的方法发出 POST 请求:

[kaufmania]$ curl -X POST \
    -d '{"jsonrpc":"2.0","method":"core.version","id":"1"}' \
    http://localhost:5060/
{
        "jsonrpc":      "2.0",
        "result":       "kamailio 5.6.3 (x86_64/linux) ",
        "id":   "1"
}

成功!

还有一个需要参数的方法,即core.prints,它将打印一个字符串。这是“Hello World!” 例子:

[kaufmania]$ curl -X POST \
    -d '{"jsonrpc":"2.0","method":"core.prints","id":"1","params":["Hello World!"]}' \
    http://localhost:5060/
{
        "jsonrpc":      "2.0",
        "result":       ["Hello World!"],
        "id":   "1"
}

不要忘记安全

或者,我们可以做一些破坏性的事情,比如关闭 Kamailio——这是一个为什么你不想在生产中运行这种类型的配置的例子:

[kaufmania]$ curl -X POST \
    -d '{"jsonrpc":"2.0","method":"core.kill","id":"1"}' \
    http://localhost:5060/
{
        "jsonrpc":      "2.0",
        "result":       {
        },
        "id":   "1"
}

当然,在此之后的任何 RPC 调用都会失败。

结论

现在已经介绍了在 html 上使用 jsonrpc 的基本概念,下次我们可以考虑保护请求。

原文:https://kaufmania.wordpress.com/2023/09/10/kamailio-rpc-over-http-introduction/

本文来自作者投稿,版权归原作者所有。如需转载,请注明出处:https://www.nxrte.com/jishu/35240.html

(0)

相关推荐

发表回复

登录后才能评论