现在我用 freeradius2-mysql 管理 PPTP/L2TP/OpenVPN
因为VPS有流量限制,所以就想到用freeradius实现流量控制
我是在 freeradius2-mysql 下配置的,利用的是 rlm sqlcounter 这个模块
以限制每个帐号每月流量1Gbyte为例,具体操作如下:
//假设 freeradius2-mysql 已经配置好
----------------------------------------------------------
通过freeradius实现vpn的流量控制
首先安装配置好freeradius。
在文件末尾添加下面代码
上面代码意思是按月进行统计,从数据库的radacct表中,根据用户名(%k)将所有入站和出站流量累加。
时间也是可以自定义的(months、weeks、days、hours),也可以指定具体值,如三天重置一次 "reset = 3 d"
在authorize区块的末尾(205行)添加
在文件末尾添加下面两行
1)这里插入到radgroupcheck表,是限制某个用户组的流量。也可以插入到radcheck表,以限制某个用户的流量。
2)流量值以 byte 为单位,1G = 1073741824 bytes
3)VIP1是用户组,123456是数据库root密码
# 连接到MySQL数据库
# 每月最大流量(1G)
# 流量统计时间的间隔(60秒)
参考资料:
1. http://wiki.freeradius.org/Rlm_sqlcounter
2. http://freeradius.org/rfc/attributes.html
--------------------------------------------------------------
要控制vpn用户流量,要在freeradius上做文章。
首先,确认freeradius的mysql启用,并加入流量计数器。
counter daily {} — 每日计数器(基于文件),不用管
sqlcounter dailycounter {} — 每日计数器(基于sql),统计在线时长,不用管
sqlcounter monthlycounter {} — 每月计数器(基于sql),统计在线时长,不用管
后面加入一段自己的计数器,来统计流量
解释一下,check-name = Max-Monthly-Traffic中的Max-Monthly-Traffic自定义的一个属性(变量),需要在freeradius的字典中加 入。当验证的时候freeradius会去执行上面定义的sql(query属性)取出该用户实际的使用流量,和表(用户或组)中设定的Max- Monthly-Traffic值比较,如果超出,拒绝登录。
freeradius的字典中加入自定义的属性:
停止radiusd,使用调试模式查看:
attribute输入:Max-Monthly-Traffic,operator:选“:=”,表示赋值,value:填入1024,用于测试,单位byte,保存。
流量监测时间间隔:“table : reply”中加入一行,Acct-Interim-Interval:=600,其中600秒表示10分钟检查一次流量。
如果要限制用户的连接数:“table : check”中加入一行:
Simultaneous-Use:=1,表示用户同时只能有一个链接。
客户端去连服务器,应该会被拒绝,然后界面上把流量限制调大,再连接,成功。
另外,“reply-name = Monthly-Traffic-Limit”这个属性不知道怎么用,以后再研究。
其他参数:
Simultaneous-Use:=1 —- 用户连接数
Acct-Interim-Interval:=600 —- 计算流量的间隔(600秒),每隔10分钟记录当前流量
属性字典位于:/etc/radiusclient/dictionary
#其他 – 启动和诊断模式
使用以下命令启动/停止/查看radius服务:
service radiusd start/stop/status
如果需要随系统启动:
添加注册
chkconfig –add radiusd
创建启动项目
chkconfig radiusd on
诊断模式:
radiusd -X
因为VPS有流量限制,所以就想到用freeradius实现流量控制
我是在 freeradius2-mysql 下配置的,利用的是 rlm sqlcounter 这个模块
以限制每个帐号每月流量1Gbyte为例,具体操作如下:
//假设 freeradius2-mysql 已经配置好
- 启用 Rlm sqlcounter
- 首先在 /etc/raddb/radiusd.conf ,去掉下面这一行的注释
$INCLUDE sql/mysql/conter.conf
- 首先在 /etc/raddb/radiusd.conf ,去掉下面这一行的注释
- 添加流量统计器
- vim /etc/raddb/sql/mysql/counter.conf
在末尾添加如下代码
sqlcounter monthlytrafficcounter {
counter-name = Monthly-Traffic
check-name = Max-Monthly-Traffic
reply-name = Monthly-Traffic-Limit
sqlmod-inst = sql
key = User-Name
reset = monthly
query = "SELECT (SUM(AcctInputOctets + AcctOutputOctets))
FROM radacct WHERE UserName='%{%k}'
AND UNIX_TIMESTAMP(AcctStartTime) > '%b'"
}
- vim /etc/raddb/sql/mysql/counter.conf
- 添加字典
- vim /etc/raddb/dictionary
添加下面两行
ATTRIBUTE Max-Monthly-Traffic 3003 integer
ATTRIBUTE Monthly-Traffic-Limit 3004 integer
- vim /etc/raddb/dictionary
- 启用Traffic Counter
- vim /etc/raddb/sites-enabled/default
在authorize里添加monthlytrafficcounter(上面添加的流量统计器),像下面这样
authorize {
...
monthlytrafficcounter
}
- vim /etc/raddb/sites-enabled/default
- 添加CHECK ATTRIBUTE
- 在数据库的radcheck(用户规则)里添加如下规则
Max-Monthly-Traffic := 1073741824
// 1073741824 bytes=1 Gbyte, 填写时以byte为单位
这一步建议使用Web管理界面做,也方便以后管理
个人推荐用ARA (ASN RADIUS admin),也可以用daloRADIUS
- 在数据库的radcheck(用户规则)里添加如下规则
- 重启一下radiusd,万事大吉~
另外还要补充的一点是:
rlm sqlcounter的统计数据是在每次登陆时检查
因此使用过程中超流量不会强制下线,而是在下一次登陆时被拒绝
----------------------------------------------------------
通过freeradius实现vpn的流量控制
首先安装配置好freeradius。
一、启用 Rlm sqlcounter 模块
查找"counter.conf”(695行),去掉#号1 | vim /usr/local/etc/raddb/radiusd.conf |
二、添加 Traffic Counter流量计数器
网上一些教程有拼写错误,折腾了大半天才在官方文档上找到原因。1 | vim /usr/local/etc/raddb/sql/mysql/counter.conf |
1 2 3 4 5 6 7 8 9 | sqlcounter monthlytrafficcounter { counter-name = Monthly-Traffic check-name = Max-Monthly-Traffic reply-name = Monthly-Traffic-Limit sqlmod-inst = sql key = User-Name reset = monthly query = "SELECT SUM(acctinputoctets + acctoutputoctets) FROM radacct WHERE UserName='%{%k}' AND UNIX_TIMESTAMP(AcctStartTime) > '%b'" } |
时间也是可以自定义的(months、weeks、days、hours),也可以指定具体值,如三天重置一次 "reset = 3 d"
三、启用Traffic Counter流量计数器
1 | vim /usr/local/etc/raddb/sites-enabled/default |
1 | monthlytrafficcounter |
四、添加字典文件
1 | vim /usr/local/etc/raddb/dictionary |
1 2 | ATTRIBUTE Max-Monthly-Traffic 3003 integer ATTRIBUTE Monthly-Traffic-Limit 3004 integer |
五、数据库插入流量限制值
注意事项:1)这里插入到radgroupcheck表,是限制某个用户组的流量。也可以插入到radcheck表,以限制某个用户的流量。
2)流量值以 byte 为单位,1G = 1073741824 bytes
3)VIP1是用户组,123456是数据库root密码
# 连接到MySQL数据库
1 | mysql -uroot -p123456; |
1 | INSERT INTO radgroupcheck (groupname,attribute,op,VALUE) VALUES ('VIP1','Max-Monthly-Traffic',':=','1073741824'); |
1 | INSERT INTO radgroupcheck (groupname,attribute,op,VALUE) VALUES ('VIP1','Acct-Interim-Interval',':=','60'); |
1. http://wiki.freeradius.org/Rlm_sqlcounter
2. http://freeradius.org/rfc/attributes.html
--------------------------------------------------------------
使用freeradius控制vpn的用户流量
要控制vpn用户流量,要在freeradius上做文章。
首先,确认freeradius的mysql启用,并加入流量计数器。
nano /etc/raddb/radiusd.conf确认“$INCLUDE ${confdir}/sql.conf”已经打开,然后下面分别有
counter daily {} — 每日计数器(基于文件),不用管
sqlcounter dailycounter {} — 每日计数器(基于sql),统计在线时长,不用管
sqlcounter monthlycounter {} — 每月计数器(基于sql),统计在线时长,不用管
后面加入一段自己的计数器,来统计流量
sqlcounter monthlytrafficcounter { counter-name = Monthly-Traffic check-name = Max-Monthly-Traffic reply-name = Monthly-Traffic-Limit sqlmod-inst = sql key = User-Name reset = monthly query = "SELECT SUM(acctinputoctets + acctoutputoctets) FROM radacct WHERE UserName='%{%k}' AND UNIX_TIMESTAMP(AcctStartTime) > '%b'" }有了计数器,需要在合适的地方来计数,比如用户登录验证的地方,找到authorize {} 节点,在该节点最后加入计数器:
monthlytrafficcounter保存退出。
解释一下,check-name = Max-Monthly-Traffic中的Max-Monthly-Traffic自定义的一个属性(变量),需要在freeradius的字典中加 入。当验证的时候freeradius会去执行上面定义的sql(query属性)取出该用户实际的使用流量,和表(用户或组)中设定的Max- Monthly-Traffic值比较,如果超出,拒绝登录。
freeradius的字典中加入自定义的属性:
nano /etc/raddb/dictionary加入两行:
ATTRIBUTE Max-Monthly-Traffic 3003 integer ATTRIBUTE Monthly-Traffic-Limit 3004 integer表示我定义了两个属性,第一个名称Max-Monthly-Traffic,编码3003,类型为整形。
停止radiusd,使用调试模式查看:
radiusd -X然后可以登录ara界面,选择用户–>编辑,“table : reply”中加入一行:
attribute输入:Max-Monthly-Traffic,operator:选“:=”,表示赋值,value:填入1024,用于测试,单位byte,保存。
流量监测时间间隔:“table : reply”中加入一行,Acct-Interim-Interval:=600,其中600秒表示10分钟检查一次流量。
如果要限制用户的连接数:“table : check”中加入一行:
Simultaneous-Use:=1,表示用户同时只能有一个链接。
客户端去连服务器,应该会被拒绝,然后界面上把流量限制调大,再连接,成功。
另外,“reply-name = Monthly-Traffic-Limit”这个属性不知道怎么用,以后再研究。
其他参数:
Simultaneous-Use:=1 —- 用户连接数
Acct-Interim-Interval:=600 —- 计算流量的间隔(600秒),每隔10分钟记录当前流量
属性字典位于:/etc/radiusclient/dictionary
#其他 – 启动和诊断模式
使用以下命令启动/停止/查看radius服务:
service radiusd start/stop/status
如果需要随系统启动:
添加注册
chkconfig –add radiusd
创建启动项目
chkconfig radiusd on
诊断模式:
radiusd -X
No comments:
Post a Comment