admin 发表于 2013-9-10 17:56:14

PPTPD+MYSQL+FREERADIUS+限速方案

一、      软件需求:
pptpd-1.3.4、ppp-2.4.4、Apache、MySQL、freeradius(freeradius.org)
二、      安装PPTP
1、操作系统使用RHEL5或者CENTOS5,内核版本为: 2.6.18-164.el5, 内核已支持MPPE,不用再安装。
使用RPM方式安装pptpd和pppd
rpm -ivh pptpd-1.3.4-.rhel5.1.i386.rpm
rpm -ivh ppp-2.4.4-2.el5.1.i386.rpm
2、修改/etc/pptpd.conf主配置文件:
debug                                                          开启debug,方便检查错误。
ppp/usr/sbin/pppd                              pppd程序位置
option /etc/ppp/options.pptpd      pptpd的参数配置文件
localip 172.16.10.1                                        服务器的IP地址
remoteip 172.16.10.2-150         分配给客户端的IP地址池
      3、修改/etc/ppp/options.pptpd
lock
debug
dump
logfd 2
logfile /var/log/pptpd.log
name pptpd
mtu 1450
mru 1450
proxyarp
auth
plugin /usr/local/lib/pppd/2.4.4/radius.so   radius模块,若不需要radius可以注释掉
plugin /usr/local/lib/pppd/2.4.4/radattr.so   radius属性模块
nobsdcomp
ipcp-accept-local
ipcp-accept-remote
lcp-echo-failure 3
lcp-echo-interval 5
refuse-pap
refuse-chap
refuse-mschap
refuse-eap
require-mschap-v2
multilink
require-mppe
ms-dns 202.98.96.68                     客户端的DNS地址
ms-dns 61.139.2.69
4、启动PPTP
使用service pptpd start启动服务
使用chkconfig pptpd on 使重启生效
      5、添加测试用户/etc/ppp/chap-secrets
   
# Secrets for authentication using CHAP
# client      serversecret                  IP addresses
test pptpd test *
      6、客户端设置
      在windows XP上创建vpn连接,并测试(略):
三、      RADIUS与MYSQL安装:
1、      安装与配置MySQL
使用yum方式安装MYSQL、php、Apache
      启动MySQL:service mysqld start
更改MySQL的root用户的密码
# mysqladmin -u root -p password youpass
#mysql -uroot -p youpass
>create database radius;创建一个名为radius的数据库
>exit
#chkconfig mysqld on 随系统启动
2、      radius安装
从http://freeradius.org/ 获取 freeradius-server-2.1.7.tar.bz2
#tar -xvf freeradius-server-2.1.7.tar.bz2
#cd freeradius-server-2.1.7
#./configure
#make
#make install
#radiusd -X 使用debug模式运行radius
如果看到 "Ready to process requests."表示安装成功。
3、修改freeradius支持MySQL。
#cd /usr/local/etc/raddb/sites-available
编辑default文件,把里面所有sql前面的#去掉。
# cd /usr/local/radius/etc/raddb/
编辑radiusd.conf,去掉$INCLUDE sql.conf前面的#
编辑sql.conf,
      # Connection info:
      server = "localhost"
      #port = 3306
      login = "root"
      password = "youpass"
向mysql导入radius所需的数据库文件
#cd /usr/local/etc/raddb/sql/mysql
# mysql -uroot -p radius < schema.sql
再用debug模式运行freeradius.
# /usr/local/sbin/radiusd -X
有可能会出现
/usr/local/etc/raddb/sites-enabled/default: Failed to find module "sql".
radius没有找到驱动去连接mysql。
编译rlm_sql_mysql.so驱动
#cd freeradius-server-2.1.7/src/modules/rlm_sql/drivers/rlm_sql_mysql
#./configure;make;make install
这个时候驱动会安装到/usr/local/lib目录下面,要把驱动复制到/usr/lib目录下
#cp /usr/local/lib/rlm_sql_mysql* /usr/lib
接下来在数据库中添加测试用的用户
#mysql -uroot -p radius
> INSERT INTO `radusergroup` (`username`,`groupname`,`priority`) VALUES ('','test',1);
> INSERT INTO `radusergroup` (`username`,`groupname`,`priority`) VALUES ('test','test',1);
> INSERT INTO `radcheck` (`id`,`username`,`attribute`,`op`,`value`) VALUES (1,'test','User-Password',':=','test');
测试刚刚添加的用户能不能通过验证:
同时开两个窗口,运行#radiusd -X
另一个窗口运行:#radtest freebsd freebsd localhost 0 testing123
如果看到:"rad_recv:Access-Accept packet from host 127.0.0.1 ……",就已经成功了。
4、      使用web界面管理radius用户
   #cp -R ~/freeradius-server-2.1.7/dialup_admin /usr/local/
   #ln -s /usr/local/dialup_admin /var/www/html/dialup_admin
   #cd /var/www/html/dialup_admin/conf
      编辑admin.conf,修改如下内容
   
general_encryption_method: clear
sql_type: mysql
sql_server: localhost
sql_port: 3306
sql_username: root
sql_password: youpass
sql_database: radius
sql_usergroup_table: radusergroup
# sql_debug: true
配置Apache
修改:/etc/httpd/conf.d/php.conf
AddHandler php5-script .php .php3
修改:/etc/httpd/conf/httpd.conf
<Directory "/var/www/html/dialup_admin/htdocs">
启动apache:
#service httpd start
#chkconfig httpd on
打开浏览器就可以管理radius的用户了。
四、      使用radius验证pptpd用户
使用radius验证用户,需要安装radius模块,
下载ppp-2.4.4.tar.gz源代码
# tar -xvf ppp-2.4.4.tar.gz
# cd ppp-2.4.4
# ./configure   //注意不要在这个地方编译安装。
#cd pppd/plugins/radius
#make
#make install
# cp -Retc   /usr/local/etc/radiusclient
下面选项在使用radius验证时开启.需要注释掉local
#vim /etc/ppp/options.pptpd
plugin /usr/local/lib/pppd/2.4.4/radius.so   //必须先加载radius验证模块,再加载radattr.so
plugin /usr/local/lib/pppd/2.4.4/radattr.so
#cd /usr/local/radiusclient
#vim radiusclient.conf编辑如下两行
authserver      127.0.0.1:1812         //radius验证
acctserver      127.0.0.1:1813         //radius计费
# vim servers
#Server Name or Client/Server pair            Key
#----------------                               ---------------
#portmaster.elemental.net                     hardlyasecret
#portmaster2.elemental.net                      donttellanyone
127.0.0.1                        testing123
重启pptpd: servicepptpd restart
五、带宽限制
使用radius传回限速信息对客户端限速
基本原理,radius根据数据库里面的限速字段的属性,下发给PPTP服务器,服务器再根据接收到的限速字段属性来限制用户带宽。
由于Linux的PPTP 限速字段不在radius默认的列表中,需要手动添加该字段。
PPTP服务器:
#cd /usr/local/etc/radiusclient
#vim dictionary 添加如下两行
ATTRIBUTE       PPPD-Upstream-Speed-Limit       230   integer
ATTRIBUTE       PPPD-Downstream-Speed-Limit   231   integer
同样也需要在radius的dictionary中添加这两行。具体位置/usr/local/etc/raddb/
还需要在数据库中加入:
INSERT INTO `radgroupreply` VALUES (8,'test','PPPD-Upstream-Speed-Limit','=','512');
INSERT INTO `radgroupreply` VALUES (9,'test','PPPD-Downstream-Speed-Limit','=','512');
512是限制的带宽,单位是kbps
最后需要在/etc/ppp/目录下添加一个本地脚本,用TC来限制带宽:
脚本内容如下:
#cat ip-up.local   //注意。该脚本必须要有可执行权限。
#!/bin/bash
PATH=/sbin:/usr/sbin:/bin:/usr/bin
export PATH
# Get the attrbute from radius reply
if [ -f /var/run/radattr. $1 ]
then
   DOWNSPEED=`/bin/awk'/PPPD-Downstream-Speed-Limit/ {print $2}'/var/run/radattr. $1`
   UPSPEED=`/bin/awk'/PPPD-Upstream-Speed-Limit/ {print $2}'/var/run/radattr. $1`
fi
# End
# Start Bandwidth Limit
   /sbin/tc qdisc del dev $1 root    > /dev/null
   /sbin/tc qdisc del dev $1 ingress > /dev/null
##### speed server->client
if [ "$DOWNSPEED" != "0" ] ;
then
    /sbin/tc qdisc add dev $1 root handle 1: htb default 20 r2q 1
    /sbin/tc class add dev $1 parent 1: classid 1:1 htb rate ${DOWNSPEED}kbit burst 4k
    /sbin/tc class add dev $1 parent 1:1 classid 1:10 htb rate ${DOWNSPEED}kbit burst 4k prio 1
    /sbin/tc class add dev $1 parent 1:1 classid 1:20 htb rate ${DOWNSPEED}kbit burst 4k prio 2
    /sbin/tc qdisc add dev $1 parent 1:10 handle 10: sfq perturb 10 quantum 1500
    /sbin/tc qdisc add dev $1 parent 1:20 handle 20: sfq perturb 10 quantum 1500
    /sbin/tc filter add dev $1 parent 1:0 protocol ip prio 10 u32 match ip tos 0x10 0xff flowid 1:10
    /sbin/tc filter add dev $1 parent 1:0 protocol ip prio 10 u32 match ip protocol 1 0xff flowid 1:10
    /sbin/tc filter add dev $1 parent 1: protocol ip prio 10 u32 match ip protocol 6 0xff match u8 0x05 0x0f at 0 match u160x0000 0xffc0 at 2 match u8 0x10
0xff at 33 flowid 1:10
fi
##### speed client->server
if [ "$UPSPEED" != "0" ] ;
then
    /sbin/tc qdisc add dev $1 handle ffff: ingress
    /sbin/tc filter add dev $1 parent ffff: protocol ip prio 50 u32 match ip src 0.0.0.0/0 police rate ${UPSPEED}kbit burst 12k drop flowid :1
fi
# End
六、      系统优化
最后再做一些简单的系统优化,以满足较大的网络流量
net.ipv4.ip_forward = 1
net.ipv4.conf.default.rp_filter = 1
net.ipv4.conf.default.accept_source_route = 0
kernel.sysrq = 0
kernel.core_uses_pid = 1
net.ipv4.tcp_syncookies = 1
kernel.msgmnb = 65536
kernel.msgmax = 65536
kernel.shmmax = 4294967295
kernel.shmall = 268435456
net.core.rmem_max = 12582912
net.core.rmem_max = 12582912
net.ipv4.tcp_rmem = 10240 87380 12582912
net.ipv4.tcp_wmem = 10240 87380 12582912
net.ipv4.tcp_no_metrics_save = 1
net.core.netdev_max_backlog = 5000
如果想要对拨入用户做NAT,可以使用IPTABLES做
#iptables -t nat -A POSTROUTING-j MASQUERADE










页: [1]
查看完整版本: PPTPD+MYSQL+FREERADIUS+限速方案