Total Pageviews

Sunday, 27 November 2011

用freeradius实现vpn的流量控制

现在我用 freeradius2-mysql 管理 PPTP/L2TP/OpenVPN
因为VPS有流量限制,所以就想到用freeradius实现流量控制
我是在 freeradius2-mysql 下配置的,利用的是 rlm sqlcounter 这个模块
以限制每个帐号每月流量1Gbyte为例,具体操作如下:
//假设 freeradius2-mysql 已经配置好
  1. 启用 Rlm sqlcounter
    • 首先在 /etc/raddb/radiusd.conf ,去掉下面这一行的注释
      $INCLUDE sql/mysql/conter.conf
  2. 添加流量统计器
    • 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'"
      }
  3. 添加字典
    • vim /etc/raddb/dictionary
      添加下面两行
      ATTRIBUTE Max-Monthly-Traffic 3003 integer
      ATTRIBUTE Monthly-Traffic-Limit 3004 integer
  4. 启用Traffic Counter
    • vim /etc/raddb/sites-enabled/default
      在authorize里添加monthlytrafficcounter(上面添加的流量统计器),像下面这样
      authorize {
          ...
          monthlytrafficcounter
      }
  5. 添加CHECK ATTRIBUTE
    • 在数据库的radcheck(用户规则)里添加如下规则
      Max-Monthly-Traffic := 1073741824 // 1073741824 bytes=1 Gbyte, 填写时以byte为单位
      这一步建议使用Web管理界面做,也方便以后管理
      个人推荐用ARA (ASN RADIUS admin),也可以用daloRADIUS
  6. 重启一下radiusd,万事大吉~
    另外还要补充的一点是:
    rlm sqlcounter的统计数据是在每次登陆时检查
    因此使用过程中超流量不会强制下线,而是在下一次登陆时被拒绝
Links:
----------------------------------------------------------
通过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'"
}
上面代码意思是按月进行统计,从数据库的radacct表中,根据用户名(%k)将所有入站和出站流量累加。
时间也是可以自定义的(months、weeks、days、hours),也可以指定具体值,如三天重置一次 "reset = 3 d"

三、启用Traffic Counter流量计数器

1
vim /usr/local/etc/raddb/sites-enabled/default
在authorize区块的末尾(205行)添加
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;
# 每月最大流量(1G)
1
INSERT INTO radgroupcheck (groupname,attribute,op,VALUE) VALUES ('VIP1','Max-Monthly-Traffic',':=','1073741824');
# 流量统计时间的间隔(60秒)
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