freeradius开启流量控制

1 前置条件
已经安装好apache2 mysql php5
PPTP能够正常工作。
此文在ubuntu12.04 LTS下验证通过。

2 安装FreeRADIUS
shell中输入以下命令,安装freeradius,freeradius-mysql, freeradius-utils模块。完装完成后会自动启动freeradius,第一次启动会生成密钥,稍等片刻即可。

sudo apt-get install freeradius freeradius-mysql freeradius-utils

安装完后,我们编辑/etc/freeradius/users,

sudo vim /etc/freeradius/users

查找 steve Cleartext (76-84行), 取消注释,用于添加一个steve的用户。

steve  Cleartext-Password := "testing" 
       Service-Type = Framed-User, 
       Framed-Protocol = PPP, 
       Framed-IP-Address = 172.16.3.33, 
       Framed-IP-Netmask = 255.255.255.0, 
       Framed-Routing = Broadcast-Listen, 
       Framed-Filter-Id = "std.ppp", 
       Framed-MTU = 1500, 
       Framed-Compression = Van-Jacobsen-TCP-IP

以DEBUG模式启动freeradius.

sudo service freeradius stop 
sudo freeradius -X

大写-X,意思是以debug模式运行,可以让调试信息直接。
新开一个窗口执行以下命令

radtest steve testing localhost 0 testing123

如果看到新窗口中输出Access-Accept就说明连接成功了。
如果看到类似“Ignoring request to authentication address * port 1812 from unknownclient”的文字,可能需要去修改/etc/freeradius/clients.conf,将client localhost段下的ipaddr改为服务器的IP,而不是127.0.0.1。

测试连接成功后,我们可以把users里临时修改的内容恢复。

3 FreeRadius MySQL 模块配置
3.1 启用MySQL模块支持
编辑/etc/freeradius/radiusd.conf,查找”sql.conf”(683行),去掉#号

sudo vim /etc/freeradius/radiusd.conf

3.2 创建 radius 数据库

mysqladmin -uroot -p123456 create radius;

把123456改成mysql的root密码

3.3 创建radius帐号的密码

cd /etc/freeradius/sql/mysql
sudo sed -i 's/radpass/123456/g' admin.sql 
sudo sed -i 's/radpass/123456/g' /etc/freeradius/sql.conf

其中radpass为默认的radius的密码。请把123456修改为你需要的密码。

3.4 生成radius数据库中的数据表
由于此目录下几个sql文件权限设置为640,会导致mysql不能读取sql文件,所以先要设置sql文件的属性为644。

sudo chmod 755 /etc/freeradius/sql/mysql 
sudo chmod 644 /etc/freeradius/sql/mysql/*.sql 
mysql -uroot -p123456 < admin.sql 
mysql -uroot -p123456 radius < cui.sql 
mysql -uroot -p123456 radius < ippool.sql 
mysql -uroot -p123456 radius < nas.sql 
mysql -uroot -p123456 radius < schema.sql 
mysql -uroot -p123456 radius < wimax.sql

3.5打开从数据库获取nas信息支持
freeradius默认从 “/etc/freeradius/clients.conf” 文件读取nas的信息,可以修改成从数据库nas表读取nas信息

sudo sed -i 's/\#readclients/readclients/g' /etc/freeradius/sql.conf

3.6 打开在线人数查询支持
在文件/etc/freeradius/sql/mysql/dialup.conf中查找simul_count_query 将279-282行注释去掉

sudo vim /etc/freeradius/sql/mysql/dialup.conf

修改后的内容如下:

# Uncomment simul_count_query to enable simultaneous  
use checking simul_count_query = "SELECT COUNT(*) \ 
                             FROM ${acct_table1} \ 
                             WHERE username = '%{SQL-User-Name}' \ 
                             AND acctstoptime IS NULL"

3.7 修改sites-enabled目录配置文件
编辑/etc/freeradius/sites-enabled/default,根据下面的说明注释或取消注释相应的行,行号仅供参考:

sudo vim /etc/freeradius/sites-enabled/default

找到authorize {}模块,注释掉files(152行),去掉sql前的#号(159行)
找到accounting {}模块,注释掉radutmp(378行),注释掉去掉sql前面的#号(388行)。
找到session {}模块,注释掉radutmp(432行),去掉sql前面的#号(436行)。
找到post-auth {}模块,去掉sql前的#号(457行),去掉sql前的#号(545行)。

 sudo vim /etc/freeradius/sites-enabled/inner-tunnel 

找到authorize {}模块,注释掉files(124行),去掉sql前的#号(131行)。
找到session {}模块,注释掉radutmp(251行),去掉sql前面的#号(255行)。
找到post-auth {}模块,去掉sql前的#号(277行),去掉sql前的#号(301行)。

3.8 向数据库添加用户资料,权限等信息
3.8.1 连接 MySQL 数据库

mysql -uroot -p123456; 

3.8.2 使用 radius 数据库

USE radius; 

3.8.3 添加用户test,密码test,注意是在radchec表

INSERT INTO radcheck (username,attribute,op,VALUE) VALUES ('test','Cleartext-Password',':=','test'); 

3.8.4 将用户test加入VIP1用户组

INSERT INTO radusergroup (username,groupname) VALUES ('test','VIP1');

3.8.5 限制同时登陆人数,注意是在radgroupcheck表

INSERT INTO radgroupcheck (groupname,attribute,op,VALUE) VALUES ('VIP1','Simultaneous-Use',':=','3'); 

如果是针对某一个特定用户做限制,则可以加入radcheck表中。
3.8.6 添加NAS,把localhost换成服务器的ip地址。这里是192.168.11.40

INSERT INTO radius.nas VALUES ('1','192.168.11.40','marker123', 'other', NULL ,'marker123.com',NULL ,NULL ,'RADIUS Client'); 

3.8.7 添加一些基本的用户配置

INSERT INTO radgroupreply (groupname,attribute,op,VALUE) VALUES ('VIP1','Auth-Type',':=','Local'); 
INSERT INTO radgroupreply (groupname,attribute,op,VALUE) VALUES ('VIP1','Service-Type',':=','Framed-User'); 
INSERT INTO radgroupreply (groupname,attribute,op,VALUE) VALUES ('VIP1','Framed-Protocol',':=','PPP'); 
INSERT INTO radgroupreply (groupname,attribute,op,VALUE) VALUES ('VIP1','Framed-MTU',':=','1500'); 
INSERT INTO radgroupreply (groupname,attribute,op,VALUE) VALUES ('VIP1','Framed-Compression',':=','Van-Jacobson-TCP-IP');

3.9 测试
以debug模式启动freeradius

sudo freeradius -X 

从Log 可以看到连接mysql是否成功,有可能会出现radius用户对raidius数据库的权限不够,我是通过phpmyadmin对radius用户权限进行了修改,追加了所有SQL操作权限。
新开一个窗口执行,看到 “Access-Accept packet” 表示成功了,”Access-Reject” 表示失败了。

radtest test test 192.168.11.40 0 xsdou.com

4 安装及配置freeradius客户端
4.1 安装radiusclient

sudo apt-get install radiusclient1

4.2 设置和服务器的连接
其中192.168.11.40为nas表中插入的nasname,marker123.com为nas表中的nasname对应记录的secret:

sudo cat >>/etc/radiusclient/servers<

同时修改/etc/radiusclient/radiusclient.conf中的ip设置。要把192.168.11.40换成服务器的IP地址。

sudo sed -i 's/localhost/192.168.11.40/g' /etc/radiusclient/radiusclient.conf 

4.3 设置字典
这一步很重要!否则windows客户端无法连接服务器。

wget -c http://small-script.googlecode.com/files/dictionary.microsoft 
sudo mv ./dictionary.microsoft /etc/radiusclient/
sudo cat >>/etc/radiusclient/dictionary<

4.4 pptp启用freeradius插件

sudo sed -i 's/logwtmp/\#logwtmp/g' /etc/pptpd.conf 
sudo sed -i 's/radius_deadtime/\#radius_deadtime/g' /etc/radiusclient/radiusclient.conf 
(这句其实没作用) 
sudo sed -i 's/bindaddr/\#bindaddr/g' /etc/radiusclient/radiusclient.conf 
(这句也没用) 
sudo cat >>/etc/ppp/pptpd-options <

5 启用VPN流量控制功能
5.1 启用 Rlm sqlcounter 模块
在/etc/freeradius/radiusd.conf文件中,查找”counter.conf”(695行),去掉#号

sudo vim /etc/freeradius/radiusd.conf

修改后内容如下:

$INCLUDE sql/mysql/counter.conf

5.2 添加 Traffic Counter流量计数器
1 sudo vim /etc/freeradius/sql/mysql/counter.conf

在文件的最后添加如下内容

qlcounter monthlytrafficcounter { 
    counter-name = Monthly-Traffic 
    check-name = Max-Monthly-Traffic 
    reply-name = Session-Octets-Limit 
    sqlmod-inst = sql 
    key = User-Name 
    reset = monthly 
    query = "SELECT IFNULL(SUM(acctinputoctets + acctoutputoctets),0) as counter FROM radacct WHERE UserName='%{%k}' AND UNIX_TIMESTAMP(AcctStartTime) > '%b'" 
}

Max-Monthly-Traffic: 每个月最大流量
Session-Octets-Limit: 用户登录时,freeradius服务返回客户端,目前还剩多少流量。
上面SQL代码意思是按月进行统计,从数据库的radacct表中,根据用户名(%k)将所有入站和出站流量累加。如果本月没有流量,就为0。时间也是可以自定义的(months、weeks、days、hours),也可以指定具体值,如三天重置一次 “reset = 3 d”。

5.3 启用traffic counter流量计数器
编辑/etc/freeradius/sites-enabled/default

sudo vim /etc/freeradius/sites-enabled/default 

在authorize区块的末尾(205行)添加

monthlytrafficcounter 

5.4 添加字典文件
编辑字典文件/etc/freeradius/dictionary

sudo vim /etc/freeradius/dictionary

在文件末尾中添加下面两行

ATTRIBUTE Max-Monthly-Traffic 3003 integer# 
  
# Experimental, implementation specific attributes 
# 
# Limit session traffic 
ATTRIBUTE Session-Octets-Limit 227 integer 
# What to assume as limit - 0 in+out, 1 in, 2 out, 3 max(in,out) 
ATTRIBUTE Octets-Direction 228 integer 
  
# Octets-Direction 
VALUE Octets-Direction Sum 0 
VALUE Octets-Direction Input 1 
VALUE Octets-Direction Output 2 
VALUE Octets-Direction MaxOveral 3 
VALUE Octets-Direction MaxSession 4

在/etc/radiusclient/dictionary中追加

# 
# Experimental, implementation specific attributes 
# 
# Limit session traffic 
ATTRIBUTE Session-Octets-Limit 227 integer 
# What to assume as limit - 0 in+out, 1 in, 2 out, 3 max(in,out) 
ATTRIBUTE Octets-Direction 228 integer 
  
# Octets-Direction 
VALUE Octets-Direction Sum 0 
VALUE Octets-Direction Input 1 
VALUE Octets-Direction Output 2 
VALUE Octets-Direction MaxOveral 3 
VALUE Octets-Direction MaxSession 4

5.5 在数据库插入流量限制值
注意事项:
1)这里插入到radgroupcheck表,是限制某个用户组的流量。也可以插入到radcheck表,以限制某个用户的流量。
2)流量值以 byte 为单位,1G = 1073741824 bytes
3)VIP1是用户组,123456是数据库root密码
每月最大流量(1G)

INSERT INTO radgroupcheck (groupname,attribute,op,VALUE) VALUES ('VIP1','Max-Monthly-Traffic',':=','1073741824'); 

流量统计时间的间隔(60秒)
参考资料:
每60秒更新一次流量至数据表

INSERT INTO radgroupreply (groupname,attribute,op,VALUE) VALUES ('VIP1','Acct-Interim-Interval',':=','60');

流量计算规则:0 in+out, 1 in, 2 out, 3 max(in,out)

INSERT INTO radgroupreply (groupname,attribute,op,VALUE) VALUES ('VIP1',' Octets-Direction ',':=','0') 
点赞