我在 Centos 6.x 上配置 FreeRadius 服务器,身份验证在 mysql 数据库上工作正常。 但我无法使用 sqlcounter 来检查使用我的 mysql 数据库中的用户的带宽总和。
我做了一个这样的sqlcount:
sqlcounter wifi_Limit{
count-attribute = Acct-Input-Octets
counter-name = Mikrotik-Total-Limit
check-name = Mikrotik-Total-Limit
reply-name = Session-Timeout
sqlmod-inst = sql
key = User-Name
reset = never
query = "SELECT ((SUM(AcctInputOctets)+SUM(AcctOutputOctets))) FROM radacct WHERE UserName='%{%k}'"
}
并且还将 wifi_limite 插入“站点可用默认值”授权中,如下所示:
poyrazwifi_Limit{
reject = 1
}
if(reject){
reject
}
我在 radcheck 中插入“Mikrotik-Total-Limit”属性,如下所示:
insert into radcheck(username,attribute,op,value) values('test','Mikrotik-Total-Limit',':=','999999')
现在,当用户使用总带宽“999999”后手动断开pppoe连接时,此配置可以正常工作,之后该用户无法再次登录。
但是我喜欢在使用总带宽“999999”时自动断开用户连接。
请建议我解决这个问题。 谢谢你
首先,你已经定义了
poyrazwifi_Limit
在授权部分,与您配置的sqlcounter名称不同:-
sqlcounter wifi_Limit{
其次,您已经配置了 sqlcounter 并给出了
回复名称=会话超时
您不需要这个,而是这是一个错误的配置。这将发送剩余的任何数据字节供用户浏览作为会话超时。
例如,您已将用户的“Mikrotik-Total-Limit”配置为 999999,并且用户已浏览其中的 999990 字节。
因此,如果用户验证了 Session-Timeout=9 的回复属性,将会得到回复。因此,9 秒后,无论用户是否浏览了剩余的 9 个字节,用户都将被取消身份验证,我认为这不是您想要的。
因此您可以简单地将计数器配置为:-
sqlcounter wifi_Limit{
count-attribute = Acct-Input-Octets
counter-name = Mikrotik-Total-Limit
check-name = Mikrotik-Total-Limit
sqlmod-inst = sql
key = User-Name
reset = never
query = "SELECT ((SUM(AcctInputOctets)+SUM(AcctOutputOctets))) FROM radacct WHERE UserName='%{%k}'"
并将部分授权为:-
authorize {
......
wifi_Limit
......
}
第三,现在介绍如何在达到设定的数据限制时自动断开用户连接。你可以使用 unlang 来实现这一点,所以你必须检查每个计费数据包并使用以下代码来断开用户连接:-
accounting {
......
if ( "%{sql: SELECT ((SUM(AcctInputOctets)+SUM(AcctOutputOctets))) FROM radacct WHERE UserName='%{User-Name}'}" > "%{sql: SELECT value from radcheck where username='%{User-Name}' and attribute='Mikrotik-Total-Limit'}" ) {
update disconnect {
User-Name = "%{User-Name}"
Calling-Station-Id = "%{Calling-Station-Id}"
}
}
......
}
注意:为此,您的 NAS 应侦听 Radius 的 COA 或 POD 请求,并且应在 FreeRadius client.conf 文件中将 NAS 配置为 COA 服务器