0x01 前言

最近在调试系统的时候发现新版的freeradius于freeradius 2有了很大的变化。我的系统使用自动登录脚本来登入系统获取数据,而freeradius则是验证软件。

为了控制系统负载不会太高,所以需要控制系统登录的优先级和同时登陆数。同时登陆数这个需要freeradius的支持。而我在freeradius 2中只需要简单地修改sql.conf文件即可启用,而freeradius 3则不是。

为了达到这需求,我们需要启用freeradius的Simultaneous Use Checking Queries功能。

0x02 准备

首先需要准备freeradius 3,安装并配置好。

在这里我使用mariadb,在freeradius中为mysql模块来存储用户数据。

要注意在数据库中的表radcheck。如果需要启用同时登陆数检测,并当超过阀值时能拒绝用户登入,则需要在此表中添加以下内容:

id   username   attribute          op   value
1    username   Simultaneous-Use   :=   2

意思是当该用户目前的session为2时,如果再有登入请求则会拒绝:

Sending Access-Reject Id 255 from 127.0.0.1:1812 to 127.0.0.1:41568
	Reply-Message := '\r\nYou are already logged in - access denied\r\n\n'

log:

 log {
 	stripped_names = no
 	auth = no
 	auth_badpass = no
 	auth_goodpass = no
 	colourise = yes
 	msg_denied = "You are already logged in - access denied"
 }

0x03 注意

这里有一点非常重要,要设定一个时间间隔,定时向客户端发送心跳包,检测用户是否在线。如果用户不在线,则需要向freeradius发出请求,将该session删除。

我记得刚接触freeradius的时候没有配置心跳包,导致用户意外离线后session依然存在,然后需要手动将session删除。

0x04 启用

启用Simultaneous Use Checking Queries功能非常简单,修改以下文件即可:

#打开文件
[root@test ~]# vim /etc/raddb/mods-config/sql/main/mysql/queries.conf

#定位到以下模块
Simultaneous Use Checking Queries

#取消以下内容的注释
simul_count_query = "\
        SELECT COUNT(*) \
        FROM ${acct_table1} \
        WHERE username = '%{SQL-User-Name}' \
        AND acctstoptime IS NULL"

0x05 结语

其实可以将freeradius用在付费服务中,例如电信的PPPoE,当然,电信拥有更高端的服务实现这个功能。