安装:

yum install freeradius2 freeradius2-mysql freeradius2-utils

安装完以后,编辑 /etc/raddb/users,加上:

testing Cleartext-Password := "password"

打开radius的测试模式,执行radiusd -X,然后打开一个新终端,执行:

radtest testing password 127.0.0.1 0 testing123

如果看到Access-Accept,说明没问题,如果没看到,返回去检查. 测试连接成功后,我们可以把users里临时加上去的第一行删除.

下载ppp源码:

wget ftp://ftp.samba.org/pub/ppp/ppp-2.4.5.tar.gz
tar zxvf ppp-2.4.5.tar.gz
cp -R /root/ppp-2.4.5/pppd/plugins/radius/etc/ /usr/local/etc/radiusclient

编辑 /usr/local/etc/radiusclient/servers,加上一组服务器和密钥,本例中为"LaoxieVPN":

localhost LaoxieVPN

编辑 /usr/local/etc/radiusclient/dictionary: 最后一行改成:

INCLUDE /usr/local/etc/radiusclient/dictionary.microsoft

然后添加一行:

INCLUDE /usr/local/etc/radiusclient/dictionary.merit

编辑 /etc/raddb/clients.conf: 把client localhost段下的secret改成刚才指定的密钥.

编辑 /etc/raddb/radiusd.conf,找到:

$INCLUDE sql.conf

去掉前面的#.

找到:

$INCLUDE sql/mysql/counter.conf

去掉前面的#.

进入mysql,添加数据库:

create database radius;
flush privileges;
exit;

编辑 /etc/raddb/sql.conf,配置login(用户名),password(密码),radius_db(数据库名)等字段,并找到readclients一行,设为yes并去掉注释符号#.

编辑 /etc/raddb/sites-enabled/default,根据下面的说明注释或取消注释相应的行:

authorize段,关掉files,打开sql,也可以把unix关掉
preacct段,关掉files
accounting段,打开sql,也可以把unix关掉
session段,打开sql
post-auth段,打开sql
pre-proxy段,关掉files

到这一步,我们的FreeRADIUS就算配置好了,用户信息都将保存在MySQL数据库中.至于数据库中的表,我们在后面统一导入.

配置DaloRADIUS:

wget http://sourceforge.net/projects/daloradius/files/daloradius/daloradius-0.9-8/daloradius-0.9-8.tar.gz
pear install DB
mkdir /usr/share/daloRadius
tar zxvf daloradius-0.9-8.tar.gz
mv daloradius-0.9-8/* /usr/share/daloRadius/
rm -r daloradius-0.9-8

注意,这里需要安装pear,如果bash提示找不到命令,那么请自行google安装方法. 下面导入数据库:

mysql -uroot -p radius < /usr/share/daloRadius/contrib/db/fr2-mysql-daloradius-and-freeradius.sql

编辑 /usr/share/daloRadius/library/daloradius.conf.php,修改daloRADIUS的配置文件.

首先是MySQL登录信息:

$configValues['CONFIG_DB_HOST'] = 'localhost';
$configValues['CONFIG_DB_USER'] = 'radius'; //根据自己实际情况填写
$configValues['CONFIG_DB_PASS'] = ''; // 设为自己的密码
$configValues['CONFIG_DB_NAME'] = 'radius';

下面有一个daloRADIUS的bug,默认配置中有一个表名和我们导入的不一样,把它改过来:

$configValues['CONFIG_DB_TBL_RADUSERGROUP'] = 'radusergroup';

然后修改daloRADIUS的路径:

$configValues['CONFIG_PATH_DALO_VARIABLE_DATA'] = '/usr/share/daloRadius/var';

网页目录下建目录链接:

cd /usr/local/apache/htdocs/
ln -s /usr/share/daloRadius/ admin

daloRADIUS管理页面地址就是 http://ip/admin ,默认用户名administrator和密码radius登录.

重启mysql和apache服务:

service httpd restart
service mysqld restart

daloRADIUS似乎写的不怎么样,最新稳定版已经是三年之前的了,不过作者直到现在还在更新SVN,下次有机会可以用最新的SVN版本试试看.在Management中添加一个新用户,注意密码类型选择Cleartext-Password. 在终端里再次启动radiusd -X,同时在另一个终端中用radtest username password localhost 0 LaoxieVPN测试一下,看看现在是不是还能正常接通,如果没问题就OK,让我们把这套系统接驳到PPP上.

配置Pppd:

编辑 /etc/ppp/options.pptpd,里面已经有许多配置选项了,我们要保证有下面的几行,如果没有就添加上去,为了保障用户登录的安全我们限制只使用MS-CHAPv2:

refuse-pap
refuse-chap
refuse-mschap
require-mppe-128
require-mschap-v2

在配置文件最后加上3行:

plugin radius.so
plugin radattr.so
radius-config-file /usr/local/etc/radiusclient/radiusclient.conf
vi /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'"
}

上面代码意思是按月进行统计,从数据库的radacct表中,根据用户名(%k)将所有入站和出站流量累加. 时间也是可以自定义的(months、weeks、days、hours),也可以指定具体值,如三天重置一次 "reset = 3 d".

vi /etc/raddb/sites-enabled/default

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

monthlytrafficcounter

添加字典文件.

vim /usr/local/etc/raddb/dictionary

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

ATTRIBUTE Max-Monthly-Traffic 3003 integer
ATTRIBUTE Monthly-Traffic-Limit 3004 integer

流量控制服务 建立表格:

INSERT INTO radgroupreply (groupname,attribute,op,VALUE) VALUES ('user','Auth-Type',':=','Local');
INSERT INTO radgroupreply (groupname,attribute,op,VALUE) VALUES ('user','Service-Type',':=','Framed-User');
INSERT INTO radgroupreply (groupname,attribute,op,VALUE) VALUES ('user','Framed-IP-Address',':=','255.255.255.255');
INSERT INTO radgroupreply (groupname,attribute,op,VALUE) VALUES ('user','Framed-IP-Netmask',':=','255.255.255.0');
INSERT INTO radgroupreply (groupname,attribute,op,VALUE) VALUES ('user','Acct-Interim-Interval',':=','600');
INSERT INTO radgroupreply (groupname,attribute,op,VALUE) VALUES ('user','Max-Monthly-Traffic',':=','5368709120');
INSERT INTO radgroupcheck (groupname,attribute,op,VALUE) VALUES ('user','Simultaneous-Use',':=','1');

以上前四行不用改动,acct-interim-interval是计算流量的间隔(600秒),意味着每隔10分钟记录当前流量.倒数第二行是每月最大流量,这里是5G(单位是字节).最后一行是允许同时连接数目. 访问daloRADIUS,在Management中添加一个新用户,注意密码类型选择Cleartext-Password.用户组选择user.

radiusd -X
radtest username password localhost 0 LaoxieVPN

测试一下,看看现在是不是还能正常接通,如果没问题就OK. 如果结果中有Access-Accept就代表成功了,否则退回去检查设置. 测试成功的话添加在认证时检测流量的语句,打开/etc/raddb/sites-enabled/default,找到authorize一节插入:

update request {
    Group-Name := "%{sql:SELECT groupname FROM radusergroup WHERE username='%{User-Name}' ORDER BY priority}"
}
if ("%{sql: SELECT SUM(acctinputoctets+acctoutputoctets) FROM radacct WHERE username='%{User-Name}' AND date_format(acctstarttime, '%Y-%m-%d') >= date_format(now(),'%Y-%m-01') AND date_format(acctstoptime, '%Y-%m-%d') <= last_day(now());}" >= "%{sql: SELECT value FROM radgroupreply WHERE groupname='%{Group-Name}' AND attribute='Max-Monthly-Traffic';}") {
reject
}

启动服务:

service radiusd start
chkconfig radiusd on
chkconfig pptpd on

自动断线检测脚本:

#!/bin/bash
MYSQL_PASS=XXXXXXXXXX
/usr/local/mysql/bin/mysql -uroot -p$MYSQL_PASS -e "UPDATE radius.radacct SET acctstoptime = acctstarttime + acctsessiontime WHERE ((UNIX_TIMESTAMP(acctstarttime) + acctsessiontime + 240 - UNIX_TIMESTAMP())<0) AND acctstoptime IS NULL;"

至此,已经完成所有操作了!

常见错误:

执行radiusd -X的时候,提示:

/etc/raddb/sql.conf[22]: Instantiation failed for module "sql"
/etc/raddb/sites-enabled/default[177]: Failed to load module "sql".
/etc/raddb/sites-enabled/default[69]: Errors parsing authorize section.

解决办法:

mysql> ALTER TABLE radius.nas ADD COLUMN server VARCHAR(45) NOT NULL AFTER secret ; service mysqld restart