2011年9月6日星期二

流量控制CentOS + L2TP/IPSec + FreeRadius

原载http://innercalm.info  
安装好vpn三合一安装包的情况下, 我们就已经配置好了一个可以提供L2TP(OpenVPN, PPTP)+FreeRadius的服务器了, 可以在Windows下整一个客户端连接试试看是否成功.


第二步是对用户的流量进行控制, 下面的步骤参考了FreeRADIUS 流量限制 这篇文章, 增加了自己理解的一部分内容.


  1. 启用 Rlm sqlcounter
    • 首先在 /etc/raddb/radiusd.conf ,去掉下面这一行的注释

      $INCLUDE sql/mysql/counter.conf
      #这里表示让freeradius启动counter(统计功能?)

  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'"
      }
      #这里是自定义的一个流量统计规则,例子中是按月统计. 可以看到query后面的那条SQL语句表示:从数据库的radacct表中,根据用户名将所有input和outpu流量累加
  3. 添加字典
    • vim /etc/raddb/dictionary
      添加下面两行

      ATTRIBUTE Max-Monthly-Traffic 3003 integer
      ATTRIBUTE Monthly-Traffic-Limit 3004 integer
      #增加字典,字典具体是干什么用的还不清楚,大概是将Max-Monthly-Traffic映射成一个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
      #这里我是直接用phpMyAdmin写入到MySQL数据库中的,因为两个Web管理都没用过,daloRadius摸不着头脑... 在radcheck表里插入如下项,表式给test用户每个月的流量是1G. 不过如其所说,这样不方便管理用户,应该学习下使用上述两个Web管理软件

6. 重启一下radiusd,万事大吉~
另外还要补充的一点是:
rlm sqlcounter的统计数据是在每次登陆时检查
因此使用过程中超流量不会强制下线,而是在下一次登陆时被拒绝

#的确是登录是检查, 试了下设成1,用户就无法接入了.

到此, 初步的流量控制就OK了, 可以依照上面的流程再增加按年,按日限流量的,应该问题不大.
在前面的基础上, 已经安装好l2tp+freeradius了, 基本的流量控制也搞定了, 可以按月或按日来限制流量了,稍微深入研究下counter的功能..

以下面这个counter为例子,这个是个按月做流量限制的例子, 问题是如何以此为基础生成可以根据你所需要的时间长度来限制流量?


01 sqlcounter monthlytrafficcounter {
02 counter-name = Monthly-Traffic
03 check-name = Max-Monthly-Traffic
04 reply-name = Monthly-Traffic-Limit
05 sqlmod-inst = sql
06 key = User-Name
07 reset = monthly
08 query = "SELECT (SUM(AcctInputOctets + AcctOutputOctets))
09 FROM radacct WHERE UserName='%{%k}'
10 AND UNIX_TIMESTAMP(AcctStartTime) > '%b'"
11 }


其实关键的问题就在reset这个字段, 上面这个例子里reset=monthly表示这个计数器会按月清空. 也就是说这些流量的统计会按月去清空一次. freeradius当然也提供了自定义的手段
我们可以将 reset的值改成我们想要的任意值.
如:

1 reset = 9h #表示9小时
2 reset = 9d #表示9天
3 reset = 9w #表示9周
4 reset = 9m #表示9个月

counter依旧用上面的代码应该没有问题,把里面相关名称改改就行. 详细的counter内容可以参考freeradius wiki的 Rlm sqlcounter .

目前不知道用户超过流量之后, 有没有办法管理员及时知道,钩子之类的,再行研究吧...


前面设置了流量统计器来做用户认证的, 用户使用超过限制的流量之后,认证就会失败. 但没有在时间上对用户作为限制. freeradius提供了一个密码过期的功能.默认已经启用了,可以在
/etc/raddb/sites-enabled/default 里的 authroize 可以查到 expiration这一项, 证明这项认证已经启动了.
freeradius会在用户登录的时候, 查找用户是否有Expiration的Atrributes. 如果有, 则将登录时间(获取当前系统时间) 与用户Expiration 的时间比较.
所以如果想让某个用户在某一时间密码不再有效, 只需要在radius数据库中的radcheck中增加一条记录.

SQL语言:
1 INSERT INTO `radius`.`radcheck` (
2 `id` ,
3 `username` ,
4 `attribute` ,
5 `op` ,
6 `value`
7 )
8 VALUES (
9 NULL , 'test', 'Expiration', '==', '19 Mar 2011'
或者phpMyAdmin插入也一样.

然后, test用户在2011年三月19日就无法再登录了...
注:感觉Expiration也可以配置在其他地方, 如某个配置文件中, 不一定非是数据库中. 无奈freeradius无详细文档,后续再研究...


FreeRADIUS 流量限制

现在我用 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的统计数据是在每次登陆时检查
    因此使用过程中超流量不会强制下线,而是在下一次登陆时被拒绝

没有评论:

发表评论