Ubuntu下配置FreeRadius+L2TP+MySQL,实现限制用户流量和登录人数

我已在上篇文章讲解了如何搭建L2TP+MySQL+FreeRadius了,具体链接Ubuntu下配置FreeRadius+MySQL+xl2tpd,实现L2TP由FreeRadius认证连接并由MySQL管理用户

现在我们要解决的是,如何使用MySQL来管理用户流量。

一、MySQL管理FreeRadius

据我们所知,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"
...

    到这里已经完成了配置文件的基本设置,接下来可以使用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

    在authority{}模块下的行尾(即'}’前一行)添加monthlytrafficcounter计数器,打开计数验证

authority{
    ....
    monthlytrafficcounter
}
    到这里已经完成了基本配置,接下来可以 使用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+xl2tpd + daloRadius,实现L2TP由web管理


参考资料:

http://www.racksam.com/2017/07/03/freeradius3-monthly-traffic-limit/

https://www.zhukun.net/archives/5367


猜你喜欢

转载自blog.csdn.net/u013162322/article/details/80724172