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