如何在FreeRADIUS C模块中将VSA(供应商特定属性)添加/复制到EAP回复的外部通道



我正在以编程方式将VSA添加到我的FreeRADIUS C模块中的Access-Accept回复中(更多详细信息在这里(。

出于调试/故障排除目的,我需要一种方法来目视检查接收端的 VSA。问题是我的客户端通过 EAP 外部通道使用内部隧道协议(PEAP 和 TTLS(,而流量嗅探器工具(如 WireShark(仅显示外部通道数据。

我知道有一种方法可以为此目的将属性复制到外部通道,但无法找到有关如何执行此操作的说明或示例。

更新:这是为了解决Arran在下面的答案。虽然我确信 Arran 说 unlang 是首选方法是正确的,但它不适用于我的情况 - 我需要在回复中发送到 NAS 的 VSA 集是在 FreeRADIUS 服务器之外定义的,并在运行时根据被验证的用户传递给 C 模块。这就是为什么我正在寻找一种以编程方式执行此操作的方法。

我不建议在你的模块中以编程方式执行此操作,除非由于某种原因它只能在内部隧道服务器中过度调用。 相反,您应该将属性放在内部隧道请求的请求或回复列表中,然后使用 unlang 将它们复制到外部请求。

将属性从内部隧道复制到外部隧道的最简单方法是使用outer.session-state列表。 此列表在 EAP 身份验证尝试的多个访问-请求/访问-质询轮次中保持不变。

如果要在最终的访问接受中返回属性,请在内部隧道虚拟服务器中使用 unlangupdate关键字将它们放在outer.session-state列表中。

在外部虚拟服务器的"身份验证后"部分中,将外部请求session-state列表中的属性复制到回复列表。这将确保您的 VSA 仅在最终的访问-接受/访问-拒绝中发送,而不是在任何中间访问-质询数据包中发送。

内部虚拟服务器:

server inner {
post-auth {
<your_custom_module>
update outer.session-state {
<custom attribute> := &reply:<custom attribute>
}
}
}

外部虚拟服务器:

server {
post-auth {
update reply {
<custom attribute> := &session-state:<custom attribute>
}
}
}

更新 - 如果您不知道将提前返回哪些属性,则可以执行整个列表复制。

server inner {
post-auth {
<your_custom_module>
update {
&outer.session-state: += &reply:[*]
}
}
}

最新更新