如何 add/copy VSA(供应商特定属性)到 FreeRADIUS C 模块中 EAP 回复的外部通道

How to add/copy VSAs (Vendor-Specific attributes) to outer channel of EAP reply in FreeRADIUS C module

我正在以编程方式将 VSA 添加到我的 FreeRADIUS C 模块 () 中的 Access-Accept 回复。

出于 debugging/troubleshooting 目的,我需要一种方法来目视检查接收端的 VSA。问题是我的客户在 EAP 外通道上使用内通道协议(PEAP 和 TTLS),而 WireShark 等流量嗅探器工具仅显示外通道数据。

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

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

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

将属性从内部隧道复制到外部隧道的最简单方法是使用 outer.session-state 列表。此列表在 EAP 身份验证尝试的多个 Access-Request/Access-Challenge 轮中持续存在。

如果您想在最终的 Access-Accept 中添加 return 属性,请使用内部隧道虚拟服务器中的 unlang update 关键字将它们放入 outer.session-state 列表中。

在 Post-Auth 部分的外部虚拟服务器中,将外部请求的 session-state 列表中的属性复制到回复列表中。这将确保您的 VSA 仅在最终 Access-Accept/Access-Reject 中发送,而不在任何中间访问挑战数据包中发送。

内部虚拟服务器:

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>
        }
    }
}

更新 - 如果您不知道要使用哪些属性,可以提前 return 复制整个列表。

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