使用 OpenSIPS 3.5 构建 IMS – S-CSCF(第 1 部分)

OpenSIPS 3.5 开发计划的主要重点是促进和提供所需的工具,以构建稳健、可投入生产的行业级 IMS 解决方案。为此,我们一直在开发 OpenSIPS 3.5 的新特性和功能,旨在简化 IMS 开发流程,同时提供所需的规范。

本篇文章是介绍如何使用 OpenSIPS 3.5 构建 IMS 解决方案的系列文章中的第一篇。它重点介绍了 IMS 设置中的 S-CSCF(服务-呼叫会话控制功能)组件,并介绍了我们为其开发的新功能,例如:

  • 异步 Diameter 查询
  • AKA 身份验证
  • 其他增强功能

本文将通篇介绍这些新功能的作用及其带来的好处。

异步 Diameter 查询

Diameter 协议在 EPS(演进分组交换/3G 网络)和 LTE(长期演进/4G 网络)技术的核心中发挥着重要作用。具体来说,对于 IMS S-CSCF,它用于与 HSS(家庭用户服务器)和/或 SLF(订阅定位功能)通信,以查找用户的位置。ETSI TS 129 229 将这种通信的规格描述为 Cx/Dx 接口,其中描述了每次用户操作(如注册、注销注册或呼叫等)所需的 Diameter 消息交换。

由于每个操作都可能需要一个或一系列多个 Diameter 请求-应答查询,因此优化这些查询成为当务之急,这也是我们增强 OpenSIPS 3.5 的异步功能以运行 Diameter 查询的原因。这意味着正在处理请求的进程将不再阻塞其执行,等待给定命令的 Diameter 答案,而是将其释放以处理其他请求,从而提高解决方案的整体吞吐量。

在使用方面,异步 dm_send_request 函数接收的参数与其同步同类函数相同,它只需适应异步处理请求的方式。一个典型的例子是,当用户注册时,s-CSCF 运行一条 SAR(Server-Assignment-Request,服务器分配请求)命令,该命令可能如下所示:

route {
    ... 
    $var(payload) = "[
        { \"Session-Id\": \"scscf.ims.mnc001.mcc001.3gppnetwork.org;"+$Ts+"."+$Tsm+";"+$pp+"\" },
        { \"Origin-Host\": \"scscf.ims.mnc001.mcc001.3gppnetwork.org\" },
        { \"Origin-Realm\": \"ims.mnc001.mcc001.3gppnetwork.org\" },
        { \"Destination-Realm\": \"ims.mnc001.mcc001.3gppnetwork.org\" },
        { \"Vendor-Specific-Application-Id\": [{\"Vendor-Id\": 10415},
            {\"Auth-Application-Id\": 16777216}]},
        { \"Auth-Session-State\": 1 },
        { \"User-Name\": \""+$fU+"@"+$fd+"\" },
        { \"Public-Identity\": \""+$fu+"\" },
        { \"Server-Assignment-Type\": 1 },
        { \"User-Data-Already-Available\": 0},
        { \"Server-Name\": \"sip:scscf.ims.mnc001.mcc001.3gppnetwork.org:6060\" }
    ]"; 

    if (!async(loadmodule "auth_aka.so"
modparam("auth_aka", "default_av_mgm", "diameter")
loadmodule "aka_av_diameter.so"
modparam("aka_av_diameter", "realm",
"scscf.ims.mnc001.mcc001.3gppnetwork.org")
modparam("aka_av_diameter", "aaa_url",
"diameter:/etc/opensips/freeDiameter.conf;extra-avps-file:/etc/opensips/scscf.dictionary")dm_send_request(16777216, 301, $var(payload), $var(rpl_avps)), dm_resume_sar))
        t_reply(500, "Internal Error");
    exit;
    ...
}

route[dm_resume_sar]
{
  if ($rc) {
    # all good - we successfully assigned the server to the User
        append_to_reply("Service-Route: <sip:orig@scscf.ims.mnc001.mcc001.3gppnetwork.org:6060;lr>\r\n");
    append_to_reply("P-Associated-URI: <$fu>\r\n");
    append_to_reply("Path: $hdr(Path)\r\n");
    t_reply(200, "OK");
  }
}

AKA 身份验证

虽然 IMS 允许用户使用不同的认证机制(如普通 Digest-Authentication、NASS-Bundle、Early-IMS-Security 等)对 IMS 引擎进行认证,但 ETSI TS 129 229 规范将 IMS-AKA 作为一项要求。由于 OpenSIPS 以前的版本不支持该功能,我们不得不从头开始实施。

这就是新的 AUTH_AKA 模块出现的原因,它允许 OpenSIPS 使用 RFC 3310 中定义的 AKA(认证和密钥协议)机制对用户进行认证。该机制旨在通过使用一组在 UE、HSS 和 CSCF 之间通过不同于(数据)SIP 的(控制)信道交换的 AV(认证向量),在 UE 和 IMS 引擎之间提供相互认证。一旦被 S-CSCF 检索到,它们就会被用于摘要验证过程。

由于 AV 应通过不同信道进行交换,我们决定模块应与获取方法无关。因此,该模块不会明确执行任何获取 AV 的操作,而只是为其他模块提供一个接口,以便执行获取 AV 的操作,并将其送入验证流程。当挑战需要一个新的 AV 时,它会向 AV 管理器模块(实现了它的接口)请求。AV 管理器的任务是获取 AV(通过它实现的任何通道),并将其推送回 auth_aka 模块,以继续摘要过程。

新的 AKA_AV_DIAMETER 就是 AV 管理器模块的一个例子,它使用 Cx Diameter 接口获取 AV,并通过其接口反馈给 auth_aka 模块。今后,还可以开发其他管理器,例如,按照 ETSI TS 123 501 中基于服务的 5G 架构规范的要求,通过 HTTP/2 查询获取 AV。

auth_aka 模块以同步和异步两种方式工作,但为了优化资源消耗,应始终使用异步模式。获取 AV 时,AV 管理器模块(即 aka_av_diameter)也应准备好在异步模式下工作,否则整个过程将退回到同步模式。

脚本中 auth_aka 和 aka_av_diameter 模块的使用方法应与 OpenSIPS 中的其他认证方法一样简单:加载模块,如果无法验证用户身份,则向其提出秘密挑战。简单的用法如下:

loadmodule "aaa_diameter.so" # makes the Diameter queries
loadmodule "auth_aka.so" # authenticates using AKA
loadmodule "aka_av_diameter.so" # fetches AVs over diameter

modparam("auth_aka", "default_av_mgm", "diameter")
modparam("aka_av_diameter", "realm",
"scscf.ims.mnc001.mcc001.3gppnetwork.org")
modparam("aka_av_diameter", "aaa_url",
"diameter:/etc/opensips/freeDiameter.conf;extra-avps-file:/etc/opensips/scscf.dictionary")

虽然 AUTH_AKA 模块支持 AKAv1 和 AKAv2 算法及其(哈希)变体,但由于测试环境有限,目前只测试了 AKAv1-MD5 算法。不过,从 ETSI TS 129 229 V17.2.0(2022-07) 开始,建议使用 AKAv1 方法只是为了向后兼容,而应使用 AKAv2 (RFC 4196)。因此,AKAv2 将很快进行测试并做出相应调整。

其他增强功能

为了提供完整的 IMS 解决方案,还必须开发一些小的增强功能。例如,由于 S-CSCF 和 HSS 之间交换的 AV 包含二进制信息,我们无法以 JSON 格式指定它们。因此,我们在提供 Diameter 查询的方式和构建命令的 Diameter 引擎之间创建了一个额外的编码层,允许我们在与 HSS 通信时使用任意二进制数据。这意味着您可以在脚本中提供 JSON 格式的二进制数据,将其编码为 hexa 格式–模块将根据额外 AVP 文件中的 AVP 描述对其进行内部检测,并在 Diameter 请求中将其转换为所需格式。同样,也可以在脚本中检索二进制值。

此外,IP 地址必须以其网络格式进行二进制编码,因此也开发了将它们从纯 IP 字符串转换为网络格式的支持。

结论

利用文章中描述的新功能以及以前已有的功能,就可以在 IMS 中构建一个完全正常工作的 S-CSCF 组件。您所需要做的就是将所有这些功能集成到一个脚本中,以实现您的个人需求。未来,我们计划为自己提供一种解决方案,将所有这些功能封装在一个脚本中,方便您进行测试。一旦推出,我们将及时更新。

大部分工作都是通过 OpenSIPS IMS 工作组在 OpenSIPS 社区的帮助下完成的,我们在此对他们的贡献表示感谢。

原文:https://blog.opensips.org/2024/03/21/build-an-ims-using-opensips-3-5-s-cscf-part-1/

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

(0)

相关推荐

发表回复

登录后才能评论