整套Radius环境基于mysql+freeradius+daloradius,daloradius本身有踢用户下线功能,但是只能逐个用户踢下线。
在网上找了几篇处理方法的文章。
文章一:《freeradius防止用户异常断开无法重新链接上》出处:https://www.cnblogs.com/klobohyz/archive/2012/02/08/2342532.html
大概就是:
vim /etc/freeradius/sites-enabled/default
authorize{
...
if(User-Name){
if("%{sql: UPDATE radacct set AcctStopTime=ADDDATE(AcctStartTime,INTERVAL AcctSessionTime SECOND), AcctTerminateCause='Clear-Stale Session' WHERE UserName='%{User-Name}' and CallingStationId='%{Calling-Station-Id}' and AcctStopTime is null}"){
}
}
}
未经验证,但这种方法有两个问题,一是同一个账号允许多台设备同时登录有问题,二是就是当用户恶意使用非正常方法断开VPN时、流量数据和时间会填写为0、因为freeradius并不是实时写入数据的。
文章二:《mariadb+freeradius踢用户下线及非正常掉线用户清理【更新】》出处:
https://blog.csdn.net/inthesun29/article/details/110231525
这篇文章是通过查询用户3个计费周期内没有数据上报就判断该用户异常掉线从而将其踢下线,清理掉非正常掉线用户。
已经验证文章中提供的sql语句可以查询和清除非正常掉线用户。但是需要编写Python脚本并设置定时任务。
本人使用mysql自带的事务去处理。借助phpmyadmin、natcat等数据库管理工具或者大佬可以使用命令直接处理。我借用的是phpmyadmin。步骤如下:
新建事件:
该事件表示的是每30分钟清理超过三次未正常上报账单的用户,将其下线时间设为当前时间。
UPDATE radacct SET acctstoptime = acctstarttime + acctsessiontime WHERE((UNIX_TIMESTAMP(acctstarttime) + acctsessiontime + 600 - UNIX_TIMESTAMP())<0) AND acctstoptime IS NULL
其中600是账单上报间隔
仅作备忘。