我使用的是 FreeRADIUS 版本 3.0.13,并尝试将记账请求复制到第三方服务器,该服务器使用数据包将 IP 映射到用户名。用户名对他们来说并不重要,只是可以搜索的东西。因此,我想在其中添加更多信息,而不仅仅是我们的用户名(本质上是端口和 vlan)。我编写了一个更新查询,它可以完成我想要的操作,但我只能弄清楚如何在 PROXY 上更新它,而不是在 REPLICATE 上更新它。
如果我在“preacct”部分更新它,它会破坏我在本地进行的实际会计工作,因为我的本地会计数据包中有我更改的用户名。
preacct {
update request {
User-Name := "%{User-Name}_%{sql: SELECT b.agreement FROM radcheck a, customer_customer b WHERE a.customer_id = b.id and a.username = '%{User-Name}'}_%{sql: SELECT REPLACE(b.name,' ','_') FROM radcheck a, customer_customer b WHERE a.customer_id = b.id and a.username = '%{User-Name}'}"
}
update control {
#Proxy-To-Realm := r_ca_fa
Replicate-To-Realm := r_ca_fa
}
replicate
如果我在“预代理”部分中更新代理请求,它会按照我的要求执行,但似乎只有使用代理而不是复制才能实现这一点。代理工作正常,只是我的服务器正在等待永远不会到来的响应,然后最终宣布服务器死机(我在日志中看到这一点,不确定对服务是否有任何实际影响)。
不确定还有哪些信息可能与故障排除有关,但我已经研究这个问题很长时间了,也浏览过论坛,但似乎无法弄清楚。任何帮助都将不胜感激。
谢谢!
答案1
是的,复制模块有点奇怪,它绕过了 RADIUS 的大部分协议状态机,只是动态地创建新的数据包,并将其直接写入输出套接字。
结果是所有正常的代理列表都无法像平常一样发挥作用。
如果您想重写出站数据包中的任何属性,则需要在当前请求中更改它们。
update {
request:Tmp-String-0 := &User-Name
request:User-Name := "%{User-Name}_%{sql: SELECT b.agreement FROM radcheck a, customer_customer b WHERE a.customer_id = b.id and a.username = '%{User-Name}'}_%{sql: SELECT REPLACE(b.name,' ','_') FROM radcheck a, customer_customer b WHERE a.customer_id = b.id and a.username = '%{User-Name}'}"
control:Replicate-To-Realm := 'r_ca_fa'
}
replicate
update {
request:User-Name := &Tmp-String-0
}