当前位置: > Linux服务器 > VPN >

PPTP配置FreeRADIUS+DaloRADIUS实现高级用户控制+流量控制

时间:2014-11-30 15:07来源:linux.it.net.cn 作者:IT

现在很多拥有国外VPS的朋友都纷纷安装了VPN服务来方便自己上网,有时候我们还会共享出一些帐号给自己的同学、朋友使用。使用VPN来上网、玩网游等能够有效地解决某些线路上的问题,但是用的人一多难免会出现资源分配不均的情况,这时合理的管理手段就显得很有必要了。不过拿常见的PPTP VPN来说,最简单的配置就是使用PPP的chap-secrets文件来静态地保存用户名和密码,这样我们没有办法知道各个用户连接VPN的时间,上传下载的数据量等信息,所谓用户跟踪管理完全就是一笔糊涂账。我们将目光转向一种更加高级的用户验证手段——RADIUS服务,用它就能实现完善的用户跟踪管理功能。

本文以CentOS 5.5操作系统上的PoPToP VPN服务为例讲述配置FreeRADIUS服务,使用MySQL数据库管理用户验证信息,安装Web管理界面daloRADIUS的方法,其他VPN例如L2TP、OpenVPN等类似。本文内容参考了诸多资料,恕不一一列出。
前置条件

首先要保证使用chap-secrets验证的PPTP服务能够正常使用。关于配置简单PPTP VPN的方法不在本文的范围之内,请参考这篇文章或其他相关教程。
其次,你需要在服务器上安装好HTTP+PHP+MySQL环境,本例中使用Apache作为HTTP服务器。此外PHP需要安装PEAR。
科普时间

PPP:Point-to-Point Protocol,点对点协议,是工作在数据链路层的连接协议。常见的ADSL连接时使用的PPPoE便是指的以太网上的点对点协议(Point-to-Point Protocol over Ethernet)。而我们创建连接VPN时也会通过PPP来进行,*nix操作系统上的pppd能够完成这一任务,其进行用户验证的默认方法便是chap-secrets文件。配置完FreeRADIUS后,我们需要把用户验证这一环节交给RADIUS服务器来完成。

RADIUS:Remote Authentication Dial In User Service,远程用户拨号验证服务,基于RFC2865和RFC2866。具体的工作原理挺复杂的,仔细阅读这两个RFC标准应该可以搞明白。简单的说,它是一个兼顾验证(authentication)、授权(authorization)及记账(accounting)三种服务的协议,即AAA协议。RADIUS运行在应用层,使用UDP进行传输,它被广泛用于ISP和企业用来控制Internet或内部网络、无线网络的访问。

FreeRADIUS:是一个实现RADIUS协议的软件,基于GPLv2开源。它是目前部署最广泛的开源RADIUS软件。

daloRADIUS:是一个FreeRADIUS的Web挂历程序,使用PHP编写。
安装配置流程
配置FreeRADIUS

1. 登入终端后,首先安装FreeRAIUS,一般源里两个版本,其中FreeRADIUS 1.x已经不被支持了,我们安装的是freeradius2。

  1. # yum install freeradius2 freeradius2-mysql freeradius2-utils

2. 安装完后,我们编辑/etc/raddb/users,在文件开头加上:testing Cleartext-Password := "password"。

  1. # vim /etc/raddb/users
  2. testing Cleartext-Password := "password"

    Tips:你需要了解如何使用SSH终端,和终端里文本编辑的方法,例如Vim的使用。

3. 启动radiusd,第一次启动会生成密钥,稍等片刻即可。使用-X参数可以让调试信息直接输出屏幕:

  1. # radiusd -X

4. 新打开一个SSH终端,测试服务器是否连通:

  1. # radtest testing password 127.0.0.1 0 testing123

如果看到Access-Accept就说明连接成功了。如果看到类似“Ignoring request to authentication address * port 1812 from unknownclient”的文字,可能需要去修改/etc/raddb/clients.conf,将client localhost段下的ipaddr改为服务器的IP,而不是127.0.0.1。
测试连接成功后,我们可以把users里临时加上去的第一行删除。

5. 下载ppp源码,因为要用到其中的配置文件:

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

6. 编辑/usr/local/etc/radiusclient/servers,加上一组服务器和密钥,本例中为“MyVPN”:

  1. # vim /usr/local/etc/radiusclient/servers
  2. localhost MyVPN

7. 编辑/usr/local/etc/radiusclient/dictionary,将最后一行改为:

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

可以再添加一行:

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

  1. # vim /usr/local/etc/radiusclient/dictionary
  2. INCLUDE /usr/local/etc/radiusclient/dictionary.microsoft
  3. INCLUDE /usr/local/etc/radiusclient/dictionary.merit

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

9. 编辑/etc/raddb/radiusd.conf,找到$INCLUDE sql.conf,去掉前面的#;找到$INCLUDE sql/mysql/counter.conf,去掉前面的#。

10. 添加MySQL用户及数据库,你可以使用现成的phpMyAdmin等工具,也可以在终端下操作。本例中,创建了radius的用户和同名的数据库:

  1. # mysql -uroot -p
  2. (如果有密码,请输入)
  3. > CREATE USER 'radius'@'localhost' IDENTIFIED BY '***';
  4. > CREATE DATABASE IF NOT EXISTS `radius` ;
  5. > GRANT ALL PRIVILEGES ON `radius` . * TO 'radius'@'localhost';

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

12. 编辑/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

13. 首先下载并安装daloRADIUS,其中需要安装一个Pear-DB的包:

  1. # wget http://sourceforge.net/projects/daloradius/files/daloradius/daloradius-0.9-8/daloradius-0.9-8.tar.gz
  2. # pear install DB
  3. # mkdir /usr/share/daloRadius
  4. # tar zxvf daloradius-0.9-8.tar.gz
  5. # mv daloradius-0.9-8/* /usr/share/daloRadius/
  6. # rm -r daloradius-0.9-8

14. 这时我们将daloRADIUS中附带的sql文件导入MySQL数据库,别忘了输入密码:

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

15. 编辑/usr/share/daloRadius/library/daloradius.conf.php,这是daloRADIUS的配置文件。首先是MySQL登录信息:

  1. # /usr/share/daloRadius/library/daloradius.conf.php
  2. $configValues['CONFIG_DB_HOST'] = 'localhost';
  3. $configValues['CONFIG_DB_USER'] = 'radius';
  4. $configValues['CONFIG_DB_PASS'] = '***'; // 设为自己的密码
  5. $configValues['CONFIG_DB_NAME'] = 'radius';

下面有一个daloRADIUS的bug,默认配置中有一个表名和我们导入的不一样,把它改过来:
$configValues['CONFIG_DB_TBL_RADUSERGROUP'] = 'radusergroup';

然后修改daloRADIUS的路径:
$configValues['CONFIG_PATH_DALO_VARIABLE_DATA'] = '/usr/share/daloRadius/var';

16. 添加Apache虚拟主机,如果有Web控制面板什么的自然就方便多了,不然就编辑/etc/httpd/conf/httpd.conf,加入:

  1. # vim /etc/httpd/conf/httpd.conf
  2. Alias /vpn "/usr/share/daloRadius/"
  3. <Directory "/usr/share/daloRADIUS">
  4. </Directory>

17. 重启重启Apache和MySQL:

  1. # service httpd restart
  2. # service mysqld restart

18. 打开浏览器,进入daloRADIUS的管理页面(本例中为http://your.domain/vpn),使用默认用户名administrator和密码radius登录。

daloRADIUS似乎写的不怎么样,最新稳定版已经是三年之前的了,不过作者直到现在还在更新SVN,下次有机会可以用最新的SVN版本试试看。在Management中添加一个新用户,注意密码类型选择Cleartext-Password。

19. 在终端里再次启动radius -X,同时在另一个终端中用radtest username password localhost 0 MyVPN测试一下,看看现在是不是还能正常接通,如果没问题就OK,让我们把这套系统接驳到PPP上。
配置pppd

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

  1. # vim /etc/ppp/options.pptpd
  2. refuse-pap
  3. refuse-chap
  4. refuse-mschap
  5. require-mppe-128
  6. require-mschap-v2
  7.  
  8. # 在配置文件最后加上3行:
  9.     
  10. plugin radius.so
  11. plugin radattr.so
  12. radius-config-file /usr/local/etc/radiusclient/radiusclient.conf

启动服务

21. 一切完成后我们不需要使用debug模式启动radiusd了:

  1. # service radiusd start

22. 当然,我们可以把radiusd和pptpd设为开机启动服务:

  1. # chkconfig radiusd on
  2. # chkconfig pptpd on

至此,PPTP+FreeRADIUS+MySQL+daloRADIUS全部配置完毕,我们在本机上使用添加的用户名和密码拨入VPN,可以正常使用。在daloRADIUS中,还可以看到各个用户每次连接的时长,上传和下载的数据量统计等。daloRADIUS其他的使用方法,本文不再叙述。

文章来源于互联网,具体链接一时忘记未有记下。。。如下几点则为具体配置中所出现的问题及解决方法

1、执行第十三点时报如下错误:

pear not found

经谷歌,解决方法如下:

  1. # yum install php-pear
  2. # pear upgrade PEAR

2、daloRadius登录界面,用户名为administrator,没记错的话密码是radius。修改密码到config->Opeartors修改。

3、MySQL错误:Database connection error Error Message: DB Error: extension not found

解决方法:

  1. # yum install php-mysql -y

4、无法连接MySQL:Database connection error Error Message: DB Error: connect failed

  1. # vim /usr/share/daloRadius/library/daloradius.conf.php
  2. # $configValues['CONFIG_DB_HOST'] = '127.0.0.1'; # 默认为 localhost

5、无法拨入,客户端报691错误:

  1. # vim /usr/local/etc/radiusclient/dictionary
  2. #INCLUDE /etc/radiusclient/dictionary.microsoft
  3. INCLUDE /usr/local/etc/radiusclient/dictionary.merit
  4. INCLUDE /usr/local/etc/radiusclient/dictionary.microsoft
  5. INCLUDE /usr/local/etc/radiusclient/dictionary.ascend
  6. INCLUDE /usr/local/etc/radiusclient/dictionary.compat

 

PS:添加流量控制:

1、建立表格

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

以上前四行不用改动,acct-interim-interval是计算流量的间隔(600秒),意味着每隔10分钟记录当前流量。倒数第二行是每月最大流量,这里是5G(单位是字节)。最后一行是允许同时连接数目。

2、修改配置

  1. # vim /etc/raddb/sql/mysql/dialup.conf
  2. sql_user_name = "%{%{Stripped-User-Name}:-%{%{User-Name}:-none}}"
  3. # 取消前面的注释并注释下一行
  4. # 同时如果需要打开simultanoues-use(控制同时在线用户数)的话需要把simul_query_check取消注释。

3、输入测试用户信息:

  1. > INSERT INTO radcheck (username,attribute,op,VALUE) VALUES ('test','Cleartext-Password',':=','test');
  2. > INSERT INTO radusergroup (username,groupname) VALUES ('test','user');

(用户名与密码必须以明文/NTLM Crypt形式保存,因为MS-CHAPv2不支持MD5保存的密码。)

4、由于上步中有非内置的attribute Max-Monthly-Traffic,所以需要在/usr/local/etc/raddb/dictionary里面定义:

ATTRIBUTE Max-Monthly-Traffic 3003 integer

5、初步测试:

  1. # /etc/init.d/freeradius stop
  2. # radiusd -X >
  3. # radtest test test localhost 1649 testing123

如果结果中有Access-Accept就代表成功了,否则退回去检查设置。

6、测试成功的话添加在认证时检测流量的语句,打开/usr/local/etc/raddb/sites-enabled/default,找到authorize一节插入:

  1. # vim /usr/local/etc/raddb/sites-enabled/default
  2.     update request {
  3.     Group-Name := "%{sql:SELECT groupname FROM radusergroup WHERE username='%{User-Name}' ORDER BY priority}"
  4.     }
  5.     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';}") {
  6.     reject
  7.     }

7、设置radiusclient:

打开/usr/local/etc/radiusclient/radiusclient.conf,修改

authserver localhost:1812

acctserver localhost:1813

修改server:

最后加上localhost secret(就是FreeRadius的client.conf里面定义的secret)

修改dictionary:

最后加上

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

如果没有dicitionary.microsoft的话看这里:http://wiki.freeradius.org/PopTop

8、启动服务

  1. # service radiusd start
  2. # chkconfig radiusd on
  3. # chkconfig pptpd on

至此,完成了所有配置了。。。

(责任编辑:IT)
------分隔线----------------------------