CentOS PPTP配置FreeRADIUS+DaloRADIUS实现高级用户控制+流量控制
分类:运维技术日期:2012-01-24 - 13:44:44作者:老谢
前提条件
阅读本文前,您需要搭建好PPTP,如果仍未搭建,可以参考:http://www.xj123.info/2301.html
如果您需要配置DaloRADIUS,那么您还需要安装LAMP,可以参考:http://www.xj123.info/2223.html
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编写。
安装配置
yum install freeradius2 freeradius2-mysql freeradius2-utils
2014.12.10 更新 目前yum官方源已经取消了freeradius1的安装包,请执行下面的命令安装freeradius
yum install freeradius freeradius-mysql freeradius-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 |
流量控制服务
建立表格
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
radius -X radtest username password localhost 0 LaoxieVPN |
测试一下,看看现在是不是还能正常接通,如果没问题就OK
如果结果中有Access-Accept就代表成功了,否则退回去检查设置。
测试成功的话添加在认证时检测流量的语句,打开/usr/local/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 |
2013.06.03新增内容:自动断线检测脚本
#!/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;" |
至此,已经完成所有操作了!
本文主要参考以下文章,感谢以下所有文字创建者
在PPTP VPN服务器上配置FreeRADIUS+DaloRADIUS实现用户跟踪管理
PPTP+FreeRADIUS+MySQL搭建VPN认证和流量控制
ARA (ASN RADIUS admin) – FreeRADIUS 管理程序安装总结
请问radiuxd-X 监测时,出现这个怎么处理:
rlm_sql: Failed to create the pair: Unknown attribute “Max-Monthly-Traffic” requires a hex string, not “5368709120”
是因为你的Couter.conf中没有对应的配置造成的,不要使用这个属性就好了~
@okhwyy 你没有添加Max-Monthly-Traffic这个流量限制参数
请问在哪里添加是counter.conf 还是数据库但是数据库已经有这个attribute 了
老谢你好!非常喜欢你博客内的内容,自己也借鉴了不少(照抄比较难听 哈哈)
我照你的做 到了导入数据库的时候也就是这一步
mysql -uroot -p radius < /usr/share/daloRadius/contrib/db/fr2-mysql-daloradius-and-freeradius.sql
我输入的就是sql中root的密码 然后提示我
ERROR 1064 (42000) at line 128: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '(14) NOT NULL,
PRIMARY KEY (id)
)' at line 6
如果你有空麻烦你看下 谢谢
@king9t 不知道你的一键包是如何安装什么版本的数据库,你可以进入mysql里面后使用SOURCE命令导入数据库试试看,手动编译比较麻烦,可以参考下yum的安装:http://t.cn/zR9Eg6U,或者参考使用一键包http://t.cn/zR9EDrV
恩 谢谢你的回复 我这就去看看 继续折腾:)
遇到过 可能是数据库版本过高 timedate相关 找找去吧
我不知道是不是我装的lamp有问题,昨天晚上我照你的手动配置了lamp 这一步没有问题 可以到daloRADIUS管理页面 今天偷懒装了一键lamp包后就出现这个问题了 请教下你
老谢 你好 经过2天的折腾,现在可以进到管理页面里面了,但是又有新的问题了,又跑来麻烦你了 具体是我输入了radius -X 系统提示这个命令不存在,然后这一步radtest username password localhost 0 MyVPN
中的uername 和password这个用户名和密码具体是指那个? 我试过daloradius里面自定义的用户和密码 但是提示是
Sending Access-Request of id 91 to 127.0.0.1 port 1812
User-Name = “testing”
User-Password = “testing123”
NAS-IP-Address = 216.127.161.134
NAS-Port = 0
Message-Authenticator =0x00000000000000000000000000000000
radclient: no response from server for ID 91 socket 3
另外重新启动radius 提示启动失败……
如果有空,还请大大指教!
@king9t radius命令不存在的话你要检查下freeradius是否安装成功,这个用户名、密码就是在/etc/raddb/users添加的测试用的帐号,启动失败需要看具体提示什么错误和日志
文中为typo
实际应为radiusd -X
少了个字母d
这个在前面出现过。前面是没有漏掉d的。
供其它兄弟参考。
Sending Access-Request of id 63 to 127.0.0.1 port 1812
User-Name = “steve”
User-Password = “testing”
NAS-IP-Address = 127.0.0.1
NAS-Port = 0
Message-Authenticator = 0x00000000000000000000000000000000
radclient: no response from server for ID 63 socket 3
我也遇到这个问题了,请问日志在哪里呢,谢谢
我也总算是搭建好了,是一篇经典的文章。不过我总是觉得用户的月流量限制没什么效果。或者是当前使用的流量是储存在哪个表里面的呢?
@Iris 可以看看 http://www.xj123.info/2856.html
还有就是文章可能是多次修改或者借鉴。
比如配置时是LaoxieVPN,测试时却是MyVPN
结果会导致显示错误。
建议修改成统一的。方便参照文章进行测试的同学测试。
@iplaylinux 感谢指正
悲剧。为了给VPS装面板。我将原MYSQL备份了一下radius数据库。
然后重装过了MYSQL,并且将备份的数据导回去,也创建了原来的一样的用户名和密码。 现在这个VPN管理页面也能访问和登录。但是VPN却用不了了。奇怪。不知道连接VPN还有啥依赖于我的旧的时候的MYSQL的地方。
@iplaylinux vpn登录提示什么错误?
yum install freeradius2 freeradius2-mysql freeradius2-utils
Error: Nothing to do
找不到包。。。
我也是!!!
已经解决了,把2去掉就行,默认的就是2
求救大牛哇~我在配置完daloradius后试图启动radiusd -X 结果出现了一个很奇怪的 database query error, SELECT id, nasname, shortname, type, secret, server FROM nas: Unknown column ‘server’ in ‘field list’ 这样一个错误,直接导致了后面的/etc/raddb/sql.conf[22]: Instantiation failed for module “sql”
我的内心已经频临崩溃边缘了,请大牛拯救一下> <
流速的控制没有做
网页目录下建目录链接的时候显示“没有这个文件或者路径” 是我哪出问题了?求老谢指点!
根据自己的实际路径来,不可能跟我文章里写的都一模一样
第一个 命令就不能运行了。。。
我现在搭建的是strongswan+freeradius,我现在想断开连接上来的指定用户,我怎么做才能实现啊。
我自己解决了。还有就是您文中提到的自动断线检测脚本,给好多网页造成误解,您的并不是自动断线,而是非正常断线后的解决方法。我上次提到的我自己找到解决办法了。
自动断掉非正常断线的连接
就是说客户自己不是正常断掉的,您那种方法可以解决由于它自身没有正常断开而造成下次不能正常连接的问题。
是的
Management中添加一个新用户 老谢 你好 我配置到这里 就出问题了
你全文只出现了 两次 修改 Management 文件 我找了半天 也没找到
是我 理解错了吗??
web页面出现 但是 无法输入密码 访问 提示Database error
Error Message: DB Error: no such table
Debug info: SELECT username FROM operators WHERE username = ‘administrator’ AND password = ‘radius’ [nativecode=1146 ** Table ‘radius.operators’ doesn’t exist] 报错
你好,如果我想在自己的VPS( centos 6)上小范围搭建VPN服务器,流量控制软件参考你上面的配置的话,VPS配置最低多少(内存,硬盘)? 谢谢
推荐最低512M
你好,请问你有个人QQ或者交流群吗?
qq群 21778118
管理界面已经能够打的开,但是点击每一个按钮都提示You do not have permissions to access the page.
Please consult with your System Administrator.这个该如何解决呢?困扰了很久了!
你登录后台了么?
前面所有都正常(弄了3天,出现各种问题),但是手机连接VPN始终无法建立(别问我电脑能不能连,没试过)
我这做流量总是不能按设定的时间间隔更新,请问老谢你的可以吗?请求指导
老谢你好,我所有的配置都已经做好了,用户也可以认证成功,PPTP也可以拨号成功。但是有一个问题就是一旦使用freeradius做认证以后,VPN用户无法访问国内和国外的网站,如果不使用freeradius认证,VPN可以正常访问所有的网站。请问您碰到过这样的问题吗?
暂时没遇到过,倒是遇到前几次连接验证失败,重复连接几次就好了
你好 我的没有/usr/local/apache/htdocs/这个目录是为什么 我安装了httpd(yum install httpd) 而且我的网站目录是/var/www/html 您的好像是/usr/share/ 这个是因为系统版本(centos6.7)不同还是Apache版本不同 麻烦指导下 自学中