我在Centos 6.x上配置FreeRadius服务器,并且在mysql数据库上的身份验证工作正常。 但我无法使用sqlcounter来检查preiodicaly sum bandwith是否使用了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插入“site-available default”authorize {},如下所示:
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连接manoaly后,该用户无法再次登录。
但我喜欢在使用总带宽“999999”时自动断开用户。
请告诉我解决这个问题。 谢谢
答案 0 :(得分:3)
首先,您已定义
poyrazwifi_Limit
在授权部分,它与您配置的sqlcounter名称不同: -
sqlcounter wifi_Limit {
其次,您已配置sqlcounter并给出了
reply-name = Session-Timeout
你不需要这个,而这是一个错误的配置。这将发送留给用户的任何字节数据作为Session-Timeout进行浏览。
例如,您已为用户配置了“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 clients.conf文件中将NAS配置为COA服务器