Press "Enter" to skip to content

CentOS 6安装lnmp+pptp+freeradius+daloradius

本文记录了在CentOS 6系统上安装lnmp + pptp + freeradius + daloradius的过程,已在原生CentOS 6、Linode、digitalocen等VPS上测试过均无问题。

一,安装LNMP
地址见http://lnmp.org/install.html,发布本文时,博主本人安装的是lnmp1.0版

安装完成需要作一些简单的优化,DaloRADIUS需要PEAR的DB插件,原生的LNMP并未安装pear,故这里也需要安装

编辑/usr/local/php/etc/php.ini,找到disable_functions,去掉scandir、fsockopen函数
ln -s /usr/local/php/etc/php.ini /etc/php.ini
wget http://pear.php.net/go-pear.phar
php -f go-pear.phar
按1(修改Installation base),输入/usr/local/pear
按5(修改PHP code directory),输入/usr/local/php/share/pear
按9(修改Public Web Files directory),输入/home/wwwroot
然后回车,提示alter php.ini,选择Y,一路回车

检查一下/usr/local/php/etc/php.ini,检查如下一行,如果没有就加上
include_path=".:/usr/local/php/share/pear"

ln -s /usr/local/pear/bin/pear /usr/bin/pear
pear install DB
/etc/init.d/php-fpm reload

二,安装pptp vpn

wget http://dl.fedoraproject.org/pub/epel/6/i386/epel-release-6-8.noarch.rpm
rpm -ivh epel-release-6-8.noarch.rpm
yum install pptpd ppp dkms

mknod /dev/ppp c 108 0
echo "mknod /dev/ppp c 108 0" >> /etc/rc.local

编辑/etc/sysctl.conf
修改net.ipv4.ip_forward = 1
sysctl -p
echo "echo 1 > /proc/sys/net/ipv4/ip_forward" >> /etc/rc.local

echo "localip 172.16.36.1" >> /etc/pptpd.conf
echo "remoteip 172.16.36.2-254" >> /etc/pptpd.conf
echo "ms-dns 8.8.8.8" >> /etc/ppp/options.pptpd
echo "ms-dns 8.8.4.4" >> /etc/ppp/options.pptpd

iptables -F
iptables -X
iptables -Z
iptables -t nat -A POSTROUTING -s 172.16.36.0/24 -j SNAT --to-source `ifconfig  | grep 'inet addr:'| grep -v '127.0.0.1' | cut -d: -f2 | awk 'NR==1 { print $1}'`
iptables -A FORWARD -p tcp --syn -s 172.16.36.0/24 -j TCPMSS --set-mss 1356
/etc/init.d/iptables save
/etc/init.d/iptables restart

/etc/init.d/pptpd start
chkconfig --level 2345 pptpd on

三,安装FreeRADIUS

FreeRADIUS:是一个实现RADIUS协议的软件,基于GPLv2开源。它是目前部署最广泛的开源RADIUS软件。
daloRADIUS:是一个FreeRADIUS的Web管理接口,使用PHP编写。

yum install perl-DBI freeradius freeradius-mysql freeradius-utils

编辑/etc/raddb/users,文件开头加上
testing Cleartext-Password := "password"
注意,这里就是password,不要把password改成testing123或者其它的密码

打开radius的测试模式,执行radiusd -X
然后打开一个新终端,执行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
测试连接成功后,可以把/etc/raddb/users里临时加上去的第一行删除

下载ppp源码,因为要用到其中的配置文件
wget https://download.samba.org/pub/ppp/ppp-2.4.7.tar.gz
tar zxvf ppp-2.4.7.tar.gz
cp -R ppp-2.4.7/pppd/plugins/radius/etc/ /usr/local/etc/radiusclient

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

编辑/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 USER 'radius'@'localhost' IDENTIFIED BY '密码';
CREATE DATABASE IF NOT EXISTS `radius` ;
GRANT ALL PRIVILEGES ON `radius` . * TO 'radius'@'localhost';
flush privileges;
编辑/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

mkdir /usr/share/daloradius

wget http://sourceforge.net/projects/daloradius/files/daloradius/daloradius0.9-9/daloradius-0.9-9.tar.gz
tar -zxvf daloradius-0.9-9.tar.gz
mv daloradius-0.9-9/* /usr/share/daloradius/
rm -rf daloradius-0.9-9

将daloRADIUS中附带的sql文件导入MySQL数据库
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的路径
$configValues['CONFIG_PATH_DALO_VARIABLE_DATA'] = '/usr/share/daloradius/var';

将daloRADIUS接入nginx
ln -s /usr/share/daloradius/ /home/wwwroot/default/admin
chown -R www:www /home/wwwroot/default/admin

/etc/init.d/nginx restart
/etc/init.d/mysql restart

打开浏览器,进入daloRADIUS的管理页面(本例中为http://your.ip/admin),使用默认用户名administrator和密码radius登录;
点击Login以后有可能出现“HTTP 500内部服务器错误”或者一片空白,
可能原因:
1,pear未正确安装;
2,php.ini中的pear配置不要放到最底端;
3,设置display_errors = On,观察错误日志;
4,从LNMP1.2开始,多了一个防跨站的文件/home/wwwroot/default/.user.ini

chattr -i /home/wwwroot/default/.user.ini
vim /home/wwwroot/default/.user.ini  #把open_basedir后面加上/usr/local/php/share/pear/(注意不要少了冒号分隔符)

chattr +i /home/wwwroot/default/.user.ini
/etc/init.d/php-fpm reload
/etc/init.d/nginx reload

登陆成功以后,建议立即到“Config”-“Operators”中修改密码
注意在Management中添加的用户,注意密码类型选择Cleartext-Password

再一次测试
在终端里启动radiusd -X(需要先停止radiusd服务)
打开另一个终端,运行radtest username password localhost 0 bear123
正常情况应该出现Access-Reject packet from……

添加用户测试
打开daloRADIUS的管理页面,点击“Management”-“Users”添加一个用户(假设用户名zhang3,密码12345)
在终端里启动radiusd -X(需要先停止radiusd服务)
打开另一个终端,运行radtest zhang3 12345 localhost 0 bear123
正常情况应该出现Access-Accept packet from……

五,设置RADIUS与PPP对接

编辑/etc/ppp/options.pptpd,确保有以下配置项
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
/etc/init.d/pptpd restart && chkconfig --level 2345 pptpd on
/etc/init.d/radiusd start && chkconfig --level 2345 radiusd on

六,设置流量控制
1,修改数据库

use radius;
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 radgroupcheck (groupname,attribute,op,value) VALUES ('user','Max-Monthly-Traffic',':=','1024');
INSERT INTO radgroupcheck (groupname,attribute,op,VALUE) VALUES ('user','Simultaneous-Use',':=','1');

以上前四行不用改动,acct-interim-interval是计算流量的间隔(600秒),意味着每隔10分钟记录当前流量
Max-Monthly-Traffic是每月最大流量,这里是1024M,Simultaneous-Use是允许每个用户同时连接的客户端数量
然后在Management中添加的新用户,注意密码类型选择Cleartext-Password,用户组选择user

2、修改配置

编辑/etc/raddb/sql/mysql/dialup.conf
注释sql_user_name = "%{%{Stripped-User-Name}:-%{%{User-Name}:-DEFAULT}}"
并取消注释sql_user_name = "%{User-Name}"
如果需要打开simultanoues-use(控制同时在线用户数)的话需要把simul_count_query取消注释
注意:我这里注释了simul_count_query,但在数据库radgroupcheck表里设定的用户数量限制仍然有效,原因未知

编辑/etc/raddb/dictionary,添加如下两行
ATTRIBUTE       Max-Monthly-Traffic     3003    integer
ATTRIBUTE       Monthly-Traffic-Limit   3004    integer

编辑/etc/raddb/sites-enabled/default,找到authorize
在该区域的尾部(即“}”前一行)添加一行monthlytrafficcounter

编辑/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) DIV 1048576 FROM radacct WHERE UserName='%{%k}' AND UNIX_TIMESTAMP(AcctStartTime) > '%b'"
}

3、向数据库中添加一个测试用户

INSERT INTO radcheck (username,attribute,op,VALUE) VALUES ('用户名','Cleartext-Password',':=','密码');
INSERT INTO radusergroup (username,groupname) VALUES ('用户名','user');

4、初步测试

/etc/init.d/radiusd stop

在终端里启动radiusd -X
重新打开一个终端运行radtest 用户名 密码 localhost 0 bear123,有Access-Accept就代表成功
按Ctrl+C取消测试

5,设置radiusclient

编辑/usr/local/etc/radiusclient/radiusclient.conf,修改
authserver localhost:1812
acctserver localhost:1813
编辑/usr/local/etc/radiusclient/servers,最后加上localhost bear123(就是/etc/raddb/clients.conf里面定义的secret)
编辑/usr/local/etc/radiusclient/dictionary,最后加上
INCLUDE /usr/local/etc/radiusclient/dictionary.merit
INCLUDE /usr/local/etc/radiusclient/dictionary.microsoft

6,重启服务

/etc/init.d/radiusd restart

七,补充内容

查询月流量限制
SELECT value FROM radgroupreply WHERE groupname='user' AND attribute='Max-Monthly-Traffic';

查询用户当月总流量
SELECT SUM(acctinputoctets+acctoutputoctets) FROM radacct WHERE username='用户名' AND date_format(acctstarttime, '%Y-%m-%d') >= date_format(now(),'%Y-%m-01') AND date_format(acctstoptime, '%Y-%m-%d') <= last_day(now());

查询用户当月总流量(以MB显示)
SELECT ROUND(SUM(acctinputoctets+acctoutputoctets)/1024/1024,2) AS 'acctinputoctets+acctoutputoctets(MB)' FROM radacct WHERE username='用户名' AND date_format(acctstarttime, '%Y-%m-%d') >= date_format(now(),'%Y-%m-01') AND date_format(acctstoptime, '%Y-%m-%d') <= last_day(now());

查询用户当月详情(每次登入登出时间,发送和接收的流量)
SELECT username,acctstarttime,acctstoptime,acctinputoctets,acctoutputoctets FROM radacct WHERE username='用户名' AND date_format(acctstarttime, '%Y-%m-%d') >= date_format(now(),'%Y-%m-01') AND date_format(acctstoptime, '%Y-%m-%d') <= last_day(now());

查询用户当月详情(每次登入登出时间,发送和接收的流量),并将流量转化为MB来显示
SELECT username,acctstarttime,acctstoptime, ROUND(acctinputoctets/1024/1024,2) '(acctinputoctets(MB))',ROUND(acctoutputoctets/1024/1024,2) '(acctoutputoctets(MB))' FROM radacct WHERE username='用户名' AND date_format(acctstarttime, '%Y-%m-%d') >= date_format(now(),'%Y-%m-01') AND date_format(acctstoptime, '%Y-%m-%d') <= last_day(now());

查询用户当月详情(每次登入登出时间,发送和接收的流量),并将流量转化为GB来显示
SELECT username,acctstarttime,acctstoptime, ROUND(acctinputoctets/1024/1024/1024,2) '(acctinputoctets(GB))',ROUND(acctoutputoctets/1024/1024/1024,2) '(acctoutputoctets(GB))' FROM radacct WHERE username='用户名' AND date_format(acctstarttime, '%Y-%m-%d') >= date_format(now(),'%Y-%m-01') AND date_format(acctstoptime, '%Y-%m-%d') <= last_day(now());

注意:
1,如果单次登陆流量不足10M,转化为GB以后显示为0.00
2,通过MYSQL更改总流量限制以后,无需重启radiusd服务,流量超限的用户立即就可以重新登陆
3,如果需要需要限制用户上传、下载速度,可以参考http://www.zhukun.net/archives/7406

可能遇到的问题:

1,执行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

8 Comments

  1. 张刚 2014-09-08

    这是准备开始销售vpn帐号了吗?

    • bear 2014-09-08

      豪无疑问!哈哈!

  2. Dicky 2015-05-04

    你好,設定好後,在daloRAIUDS 新設帳號,在radtest 結果正常,但無論使用PPTP或L2TP連接,都出現驗證錯誤,請問有方法解決嗎

  3. Ricks 2015-09-29

    输入ip/admin显示no input file specified, 怎么破?
    谢谢。

    • Anonymous 2015-10-14

      那个admin是个快捷方式,把daloradius的整个文件夹复制到/home/wwwroot/default/ 然后访问 ip/daloradius

      • admin 2016-04-02

        我也碰到类似问题
        1.输入ip/admin显示no input file specified,

        2.把daloradius的整个文件夹复制到/home/wwwroot/default/ 然后访问 ip/daloradius 出现“HTTP 500内部服务器错误”或者一片空白

        各种方法试验了 求解救 谢谢

        • Anonymous 2016-09-14

          把fastcgi.conf的

          fastcgi_param DOCUMENT_ROOT $document_root;

          注释掉。

  4. Anonymous 2016-11-07

    [root@FreeRadius ~]# radtest testing password 127.0.0.1 0 testing123
    Sending Access-Request of id 251 to 127.0.0.1 port 1812
    User-Name = “testing”
    User-Password = “password”
    NAS-IP-Address = 127.0.0.1
    NAS-Port = 0
    Message-Authenticator = 0x00000000000000000000000000000000
    rad_recv: Access-Reject packet from host 127.0.0.1 port 1812, id=251, length=20
    测试的时候出现这个是什么原因啊

Leave a Reply to Ricks Cancel reply

Your email address will not be published. Required fields are marked *