我已在上篇文章讲解了如何搭建L2TP+MySQL+FreeRadius了,具体链接Ubuntu下配置FreeRadius+MySQL+xd,实现L2TP由FreeRadius认证连接并由MySQL管理用户
现在我们要解决的是,如何使用MySQL来管理用户流量。
据我们所知,FreeRadius主要是认证用户在连接登录时的信息是否正确,及是否允许该用户连接,而我们所有的这些配置都已集成在MySQL上,现在我们来分析一下MySQL的表信息。
MySQL下的radius库共有12个表,包括cui、nas、radacct、radcheck、radgroupcheck、radgroupreply、radhuntgroup、radippool、radpostauth、radreply、radusergroup、wimax。
我们重点分析一下nas、radacct、radcheck、radgroupcheck、radgroupreply、radusergroup这六个表。
1.nas表
nas表主要是用于代替FreeRadius原本的文件加载client信息,原本的文件加载路径在/etc/freeradius/clients.conf,现在我们用nas表来配置client,配置的client将被FreeRadius加载,如何配置可见文章开头的链接。
2.radacct表
radacct主要是存放用户连接过程中产生的信息,包括登录时间,退出时间,连接时长、上传所花费的流量、下载所花费的流量等,这个表我们将用于控制用户流量。
3.radcheck表
radcheck表主要是用户管理的表,在这里可以设置L2TP用户登录的用户名和密码,原本在/etc/ppp/chap-secrets管理的用户表已失效。
4.radgroupcheck表
radgroupcheck表主要是设置用户组下的验证配置,验证成功则允许该用户组下的用户连接,验证不成功则拒绝该用户连接,这里我们将用户检测用户是否超出所设定的流量值,并决定是否继续给该用户连接。我们所有的控制操作都基本在该表配置
5.radgroupreply表
radgroupreply表主要是设置用户组下的用户连接成功后返回的响应信息。
6.radusergroup
radusergroup表主要是将用户和组绑定在一起,即将用户设置到某一个用户组上。用户在登录连接时,首先会获取用户所在组的验证配置,若验证通过,则允许连接,并返回响应信息。
1.打开FreeRadius的sql验证
修改FreeRadius的sites-enabled/default文件
vim /etc/freeradius/sites-enabled/default
注释掉accounting{}和seesion的radutmp,并反注释sql属性
accounting{
...
# radutmp
...
sql
...
}
session{
...
# radutmp
...
sql
...
}
修改sites-enabled/inner-tunnel文件
vim /etc/freeradius/sites-enabled/inner-tunnel
注释掉session的radutmp属性,并打开sql属性
session{
...
# radutmp
...
sql
...
}
原来的是使用radutmp文档验证,现在使用sql验证。
2.打开FreeRadius的SQL语句配置
修改sql/mysql/dialup.conf文件
vim /etc/freeradius/sql/mysql/dialup.conf
反注释掉simul_count_query的语句配置,去掉#号
...
simul_count_query = "SELECT COUNT(*) \
FROM ${acct_table1} \
WHERE username = '%{SQL-User-Name}' \
AND acctstoptime IS NULL"
...
重启一下FreeRadius服务
/etc/init.d/freeradius restart
到这里已经完成了配置文件的基本设置,接下来可以使用radgroupcheck表对用户组设置登录人数限制了。
3.使用radgroupcheck表设置用户组登录人数限制
进入MySQL,为radgroupcheck表插入一条记录
INSERT INTO radgroupcheck ( id , GroupName , Attribute , op , Value ) VALUES (NULL , 'normal', 'Simultaneous-Use', ':=', '1');
这里使用了Simultaneout-User属性,并设置它的值为1,这条语句代表了用户组normal下的用户,不能够同时登录同一个账号,第二个登录的用户将无法连接,防止了用户重复登录,我们在服务器上使用radtest进行测试一下,看看返回什么信息。
首先,我们现在其他设备上登录连接L2TP,并保持连接状态,其次,我们在终端使用radtest再次连接,看看返回什么信息(前提是该用户已经绑定在normal组上)
radtest crayon 123456 xxx.xxx.xxx.xxx 0 testing123
服务器返回响应
Sending Access-Request of id 248 to xxx.xxx.xxx.xxx port 1812
User-Name = "crayon"
User-Password = "123456"
NAS-IP-Address = xxx.xxx.xxx.xxx
NAS-Port = 0
Message-Authenticator = 0x00000000000000000000000000000000
rad_recv: Access-Reject packet from host xxx.xxx.xxx.xxx port 1812, id=248, length=68
Reply-Message = "\r\nYou are already logged in - access denied\r\n\n"
这里服务器返回了Access-Reject信息,表示已拒绝该用户的登录请求,原因是You are already logged in,即你已登录了,不能再次登录。
1.配置FreeRadius的自定义属性
编辑dictionary文件
vim /etc/freeradius/dictionary
在文件行尾加入自定义属性
ATTRIBUTE Max-Monthly-Traffic 3003 integer
ATTRIBUTE Monthly-Traffic-Limit 3004 integer
加入这两行代表了radgroupcheck表上可以识别并使用该属性
2.配置SQL计数器
修改radiusd.conf文件
vim /etc/freeradius/radiusd.conf
取消注释modules{}的$INCLUDE sql/mysql/counter.conf属性
modules{
...
$INCLUDE sql/mysql/counter.conf
...
}
修改sql/mysql/counter.conf文件
vim /etc/freeradius/sql/mysql/counter.conf
在行尾添加counter配置
sqlcounter monthlytrafficcounter {
sqlmod-inst = sql
counter-name = Monthly-Traffic
check-name = Max-Monthly-Traffic
reply-name = Monthly-Traffic-Limit
key = User-Name
reset = monthly
query = "SELECT SUM(acctinputoctets + acctoutputoctets) FROM radacct WHERE UserName='%{%k}' AND UNIX_TIMESTAMP(AcctStartTime) > '%b'"
#query的SQL语句表示统计本月下用户上传流量和下载流量的总和,单位是字节,即1MB = 1024 * 1024 = 1048576
}
编辑sites-enabled/default文件
vim /etc/freeradius/sites-enabled/default
在authorize{}模块下的行尾(即'}’前一行)添加monthlytrafficcounter计数器,打开计数验证
authorize{
....
monthlytrafficcounter
}
重启FreeRadius服务
/etc/init.d/freeradius restart
到这里已经完成了基本配置,接下来可以使用radgroupcheck表对用户组设置流量限制了。
3.使用radgroupcheck表对用户组设置流量限制
进入MySQL,为radgroupcheck表插入一条记录,设置normal用户组的流量限制为1MB
INSERT INTO radgroupcheck (groupname,attribute,op,VALUE) VALUES ('normal','Max-Monthly-Traffic',':=','1048576');
设置统计时间周期为60秒
INSERT INTO radgroupreply (groupname,attribute,op,VALUE) VALUES ('normal','Acct-Interim-Interval',':=','60');
这里使用了Max-Monthly-Traffic属性,并设置它的值为1048576,这条语句代表了用户组normal下的用户能使用的上传和下载流量最大为1MB,我们先使用到超出流量,然后在服务器上使用radtest进行测试一下,看看返回什么信息。(前提是该用户已经绑定在normal组上)
radtest crayon 123456 xxx.xxx.xxx.xxx 0 testing123
服务器返回响应
Sending Access-Request of id 172 to xxx.xxx.xxx.xxx port 1812
User-Name = "crayon"
User-Password = "123456"
NAS-IP-Address = xxx.xxx.xxx.xxx
NAS-Port = 0
Message-Authenticator = 0x00000000000000000000000000000000
rad_recv: Access-Reject packet from host xxx.xxx.xxx.xxx port 1812, id=172, length=70
Reply-Message = "Your maximum monthly usage time has been reached"
这里服务器返回了Access-Reject信息,表示已拒绝该用户的登录请求,原因是Your maxmum monthly usage time has been reached,即你超出使用的流量,拒绝登录。
如何使用daloRadius来实现web管理VPN,Ubuntu下配置FreeRadius+MySQL+xd + daloRadius,实现L2TP由web管理
参考资料:
http://www.racksam.com/2017/07/03/freeradius3-monthly-traffic-limit/
https://www.zhukun.net/archives/5367