freeradius防止用户异常断开无法重新链接上

本文介绍通过Freeradius实现异常断线处理的方法。一种是通过配置文件判断用户在线状态并更新数据库记录;另一种是利用MySQL存储过程定时检查用户会话时长。这两种方案均可有效解决用户异常断开连接的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这里可以通过两种方式实现:

1、通过配置文件来判断用户的在线情况,如果在线并且MAC相等就自动结束这条信息,

2、通过MYSQL自带的计划任务,定时扫描radacct这张表中的数据


第一种方式:


编辑default文件里

vim /etc/freeradius/sites-enabled/default

在authorize块中加入以下语句

复制代码
1 authorize{
2 ...
3if(User-Name){
4if("%{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}"){
5 }
6 }
7 }
复制代码



这是一条服务器每当接收客户端认证时发生时检查的sql语句、看清楚了、第二个if块里面可是一行内的、千万别拆成两行、

解释下这条语句的作用吧、这里就是更新radacct表中的AcctStopTime字段、因为如果是异常断开的VPN用户、AcctStopTime会一直处于NULL的状态、这个时候、如果已经在freeradius设置成了单用户登录方式(通常都会这样)、所以就会禁止了VPN再次登录、而freeradius也一直在傻等着这个伪链接会几时断开、所以这里的处理方法是当用户再次登录上freeradius用户时、就把AcctStopTime的值设置为当前的会话时间加上开始的时间、具体的实现方法是用ADDDATE函数、AcctStartTime为被加时间、INTERVAL AcctSessionTime SECOND为关键字、以秒为单位、加上AcctSessionTime值、就成为了AccStopTime、而用户中止的类型也设置为Clear_stale Session、WHERE后面加了条件、条件为当前登录用户名、并且上次异常断开的IP这次登录的IP也要一致、而且AccStopTime的停止时间为空、当满足这三个条件后、就会自动把伪链接给强制断开、然后开启新会话接纳该用户

这个会造成一个问题:就是当用户恶意使用非正常方法断开VPN时、流量数据和时间会填写为0、因为freeradius并不是实时写入数据的、这样会与计费流程背离、不过相信大部分人还是好的、实在有这些用户就把它加入黑名单屏蔽掉吧、


第二种方式:


创建存储过程,定时执行这个存储过程就可以 了

CREATE DEFINER=`radius`@`%` PROCEDURE `cron_check_sessiontime`()
    LANGUAGE SQL
    NOT DETERMINISTIC
    CONTAINS SQL
    SQL SECURITY DEFINER
    COMMENT '检查用户是否持续在线,如超出5分钟无计帐信息表示用户离线,'
BEGIN
    UPDATE radacct SET  acctstoptime = FROM_UNIXTIME(UNIX_TIMESTAMP(acctstarttime) + acctsessiontime) WHERE ((UNIX_TIMESTAMP(acctstarttime) + acctsessiontime + 305 - UNIX_TIMESTAMP())<0) AND acctstoptime IS NULL;
END


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值