HKeSP - 香港易事泊

标题: PPTPD+MYSQL+FREERADIUS+限速方案 [打印本页]

作者: admin    时间: 2013-9-10 17:56
标题: PPTPD+MYSQL+FREERADIUS+限速方案
一、        软件需求:
. z, L/ I5 Q; w( s( w9 Tpptpd-1.3.4、ppp-2.4.4、Apache、MySQL、freeradius(freeradius.org)* `; v8 h' E! s" T  b$ G  c9 v
二、        安装PPTP% f/ s7 @; [! x
1、操作系统使用RHEL5或者CENTOS5,内核版本为: 2.6.18-164.el5, 内核已支持MPPE,不用再安装。
) P( u/ s% a# f1 k使用RPM方式安装pptpd和pppd6 B% Y; V/ |- e5 f; E7 @4 q
rpm -ivh pptpd-1.3.4-.rhel5.1.i386.rpm
* g7 p1 S- {& q2 H2 R' }7 b* c  ?rpm -ivh ppp-2.4.4-2.el5.1.i386.rpm5 j  Q5 f( b5 A" v+ v8 x
2、修改/etc/pptpd.conf主配置文件:
" e4 W6 ]6 P6 U. A9 W9 ]9 F% e: cdebug                                                          开启debug,方便检查错误。
, v! s/ J$ W. Y, U, h/ c* k4 ~' kppp  /usr/sbin/pppd                                pppd程序位置
/ G6 e" s, _$ v% g* n. x) D- @option /etc/ppp/options.pptpd        pptpd的参数配置文件
  \7 O8 N' j  F7 plocalip 172.16.10.1                                        服务器的IP地址4 u$ c) j9 E/ u  i$ e8 M
remoteip 172.16.10.2-150           分配给客户端的IP地址池1 D; j1 e6 M1 ]( M* L% \
        3、修改/etc/ppp/options.pptpd% @4 M- ^1 ?0 R8 A5 J* y
lock. ?0 a& b4 O( m, g/ u
debug8 h0 |, b2 g# U# q' n( ?- B
dump( c. \2 r# p( _2 S  ?3 ~
logfd 25 ]4 i! p9 _6 v* k. H3 y' D0 h
logfile /var/log/pptpd.log
) g; L" z$ Y6 [' H( Wname pptpd! x8 h2 d, L4 D
mtu 1450# w$ [' B- z, q4 j  U
mru 1450
- \8 Q6 x5 C- R+ hproxyarp5 L' E9 y- h" v
auth
2 U# q( C" u# F& \6 i9 T( o2 Iplugin /usr/local/lib/pppd/2.4.4/radius.so     radius模块,若不需要radius可以注释掉
4 j. Z8 E: p* m; i8 ?plugin /usr/local/lib/pppd/2.4.4/radattr.so     radius属性模块3 O' h  r* [. y* `! K
nobsdcomp. H4 [& i( U7 b" @0 Y
ipcp-accept-local
. l" ?8 e1 b/ y, T6 E' |ipcp-accept-remote
% g) B- v* S) _8 R: C' |  c9 klcp-echo-failure 3& |# Y( F8 k/ C8 c: I  I% K
lcp-echo-interval 5# ?: b. H, P* t5 @; f4 g3 b
refuse-pap5 u& D5 r4 n/ ]) T
refuse-chap  I3 R3 W( ^2 W0 N
refuse-mschap
3 ?3 I. s7 ^5 ?+ {3 T, p' ^  Lrefuse-eap
5 I7 D  Z: H; H& zrequire-mschap-v2
  L# f% n5 F' V# t# X1 rmultilink0 i' Z: p2 O$ b1 m7 C
require-mppe6 U5 {8 O' {5 i  ?( n) m5 {- d
ms-dns 202.98.96.68                     客户端的DNS地址/ |7 K1 o% b6 Z8 m
ms-dns 61.139.2.69( f8 C( m2 d$ e+ c; G$ ~# s
4、启动PPTP
) N8 V# M8 e% E) R- N% A. [使用service pptpd start启动服务: }7 _" f2 q! [- f% J8 b$ i/ C
使用chkconfig pptpd on 使重启生效
; N, R: o" c: J! ]2 c. h        5、添加测试用户/etc/ppp/chap-secrets
$ E& g1 o! {/ C% R    ; L5 R9 J1 a8 ?# L" z
# Secrets for authentication using CHAP ' F+ h  g9 N( |+ ^( ]3 y
# client        server  secret                  IP addresses 7 n- r) p! Z4 {) t& N1 r/ y( t
test pptpd test *
% A3 _! \9 m' d) E        6、客户端设置
! h- w/ C  M) S# j8 i        在windows XP上创建vpn连接,并测试(略):/ E; A' t" K- c7 s) S% Q  ~
三、        RADIUS与MYSQL安装:+ N: h4 \. @, l9 \8 c: j
1、        安装与配置MySQL
& ]1 u- u7 ^0 _; d" @使用yum方式安装MYSQL、php、Apache' z: R! t, A+ X( L$ g# W
        启动MySQL:service mysqld start
9 k' o: A) h7 _5 r5 d  B3 g& m更改MySQL的root用户的密码1 e/ f* O3 J5 M9 _: w6 d
# mysqladmin -u root -p password youpass% H$ [& E8 }2 e
#mysql -uroot -p youpass
9 l! Y; N4 ~) R" b; Y3 s>create database radius;  创建一个名为radius的数据库
3 w+ c% x5 s6 \+ A8 k>exit
; {. ~6 o2 j+ d) [9 t#chkconfig mysqld on 随系统启动( G) a+ M3 ]7 K7 W8 W$ X
2、        radius安装
- O2 `+ p  z! Vhttp://freeradius.org/ 获取 freeradius-server-2.1.7.tar.bz2
+ x' _* x! N2 K2 x( a0 F3 |#tar -xvf freeradius-server-2.1.7.tar.bz2+ _- V. c) |! Y4 S
#cd freeradius-server-2.1.7* e! F  B: ~% S$ C3 i* X7 W
#./configure0 p& g, P/ u0 s4 H4 D
#make
- V) ]# I5 @% D+ v2 T- ]! G- O% X#make install
$ E- V9 z' y: D5 T: y! I) R#radiusd -X 使用debug模式运行radius
% g9 J+ |7 E3 |2 W( _+ \+ o如果看到 "Ready to process requests."表示安装成功。
6 T  C( U5 y" E; X3、修改freeradius支持MySQL。
4 \8 b, \2 `8 g& T/ m#cd /usr/local/etc/raddb/sites-available. K$ E$ H  J4 S9 ]
编辑default文件,把里面所有sql前面的#去掉。
/ ]4 c8 _2 L; K. Q4 J( r/ e# cd /usr/local/radius/etc/raddb/
' [0 R4 x/ e+ e! }% O编辑radiusd.conf,去掉$INCLUDE sql.conf前面的#
+ |! v- k% [. n, V编辑sql.conf,
& E+ X- @& m! b9 C        # Connection info:( x  A0 F8 @4 a0 j
        server = "localhost"
* y' W% w+ M; y  K( T0 j2 B9 Y        #port = 3306) R' j* }% b- y# u1 t, S
        login = "root") N/ m* [6 ]: ^1 S
        password = "youpass"7 w- W1 z- n, D9 t/ f! T  z
向mysql导入radius所需的数据库文件
2 ]  p* i5 R. L3 e#cd /usr/local/etc/raddb/sql/mysql
5 x$ V' c1 I2 [' I% |# mysql -uroot -p radius < schema.sql
( E/ g% e- }' h再用debug模式运行freeradius.
+ M0 K8 F$ O6 R4 Q0 y7 Q. A# /usr/local/sbin/radiusd -X4 S4 i4 K( Q/ t# s# s
有可能会出现8 y% G6 p* S* @* O0 X* G& [
/usr/local/etc/raddb/sites-enabled/default[159]: Failed to find module "sql".8 ]: f& n' L1 o" P4 z' T
radius没有找到驱动去连接mysql。/ P2 u' B4 {4 T5 q
编译rlm_sql_mysql.so驱动' z8 @& U3 e0 U& d2 H+ V
#cd freeradius-server-2.1.7/src/modules/rlm_sql/drivers/rlm_sql_mysql
  ]* o/ l8 X  [% l9 r7 w2 x  r' e#./configure;make;make install% J& K1 N3 g8 T6 A# a% f
这个时候驱动会安装到/usr/local/lib目录下面,要把驱动复制到/usr/lib目录下
* g  @" g5 W. A4 {9 j#cp /usr/local/lib/rlm_sql_mysql* /usr/lib) v( h/ O) b2 q2 C2 E
接下来在数据库中添加测试用的用户
& a8 f  U, T5 \0 @4 e& `( ~- D#mysql -uroot -p radius
' l: v& e4 ~5 |. ~; C> INSERT INTO `radusergroup` (`username`,`groupname`,`priority`) VALUES ('','test',1);4 R" e; z9 y7 l/ a
> INSERT INTO `radusergroup` (`username`,`groupname`,`priority`) VALUES ('test','test',1);6 y4 {1 ]8 }6 V1 n2 l0 W
> INSERT INTO `radcheck` (`id`,`username`,`attribute`,`op`,`value`) VALUES (1,'test','User-Password',':=','test');
' C3 n9 ]3 U' p, S$ H测试刚刚添加的用户能不能通过验证:
/ ^9 r7 Y7 u: c: o* O9 E6 `同时开两个窗口,运行#radiusd -X
' Q. c& J3 x0 h) f/ i另一个窗口运行:#radtest freebsd freebsd localhost 0 testing123
" p! b8 o! D7 J* R8 u如果看到:"rad_recv:Access-Accept packet from host 127.0.0.1 ……",就已经成功了。! J$ V0 [: C, n' Z  f
4、        使用web界面管理radius用户
" v/ a1 a% f6 B( q7 c' Q   #cp -R ~/freeradius-server-2.1.7/dialup_admin /usr/local/' s4 R9 j5 ]8 g5 l, @6 H
   #ln -s /usr/local/dialup_admin /var/www/html/dialup_admin
5 Y0 I) ^9 r# L+ ^   #cd /var/www/html/dialup_admin/conf
* }$ h1 D. T+ _8 n4 c        编辑admin.conf,修改如下内容
) A, |- ?' G. y   
: o) c0 g5 g$ P. g0 V) W, P& k: Ngeneral_encryption_method: clear
1 w. O6 B2 z  j6 a; Zsql_type: mysql
  c/ n; \' u3 x+ G9 bsql_server: localhost( {: C: b+ d, l4 J9 ^) q
sql_port: 3306  v2 X$ z6 ~  Z9 }" d$ x( s
sql_username: root
: s5 X8 v$ r; e2 w6 b2 b: Msql_password: youpass  e% W0 w) p, R$ M4 ~
sql_database: radius
1 q0 N% w8 C: c" ?4 A' U6 Q! P( _sql_usergroup_table: radusergroup- |$ C* M* p, y6 _& x5 C- [
# sql_debug: true
5 Z/ `( D% l4 ^; ~. o7 L8 X配置Apache
4 a+ t/ @* Z; N2 ]& Y. u) L7 P* @修改:/etc/httpd/conf.d/php.conf
4 n/ q) @9 y1 L# S& R( g0 N4 EAddHandler php5-script .php .php3
# u  N0 V% N: _6 O1 i修改:/etc/httpd/conf/httpd.conf; ?: E* }* q2 h
<Directory "/var/www/html/dialup_admin/htdocs">
! E5 N& P, r8 j+ A( J1 w% Y启动apache:
; b3 Z$ L0 G4 q0 |#service httpd start
1 M2 J* I7 _% h7 e! C$ r#chkconfig httpd on
! n& v3 }: Q3 o& S+ A2 D" j打开浏览器就可以管理radius的用户了。
' X3 ^0 j. f6 [6 t+ I四、        使用radius验证pptpd用户
; Y5 ?! J1 [; o8 ~使用radius验证用户,需要安装radius模块,
4 h. o* f# k2 K; T. E下载ppp-2.4.4.tar.gz源代码1 i& w: k: r) |$ b% C
# tar -xvf ppp-2.4.4.tar.gz1 ~2 h) m# X; H# j" K" h
# cd ppp-2.4.42 N5 `* i! T8 A- M! x
# ./configure     //注意不要在这个地方编译安装。
; s2 ?( y7 i+ l" D8 [1 d#cd pppd/plugins/radius  
% K0 c; s* A( J, d- ^( u6 P. f#make
4 A" a4 F/ j$ q6 @+ p( Y* Q5 e: l( k/ N#make install
" I2 D, W$ S& ?. B6 C% j# cp -R  etc   /usr/local/etc/radiusclient9 R( J" t5 F" ^; m) ]
下面选项在使用radius验证时开启.需要注释掉local6 w: u+ ~: C3 j: d' X
#vim /etc/ppp/options.pptpd
( z9 x- c4 b8 G1 L/ vplugin /usr/local/lib/pppd/2.4.4/radius.so   //必须先加载radius验证模块,再加载radattr.so
# `' e2 ^: U( B3 M- X% c( x- y- x+ zplugin /usr/local/lib/pppd/2.4.4/radattr.so
: ~0 j3 W6 ?( S5 n#cd /usr/local/radiusclient6 S1 W+ z) s; P; V8 P
#vim radiusclient.conf  编辑如下两行
, F: S+ o+ g+ Q9 `& N/ A; yauthserver      127.0.0.1:1812         //radius验证7 j3 G+ u9 N# K) A+ C/ C2 D) H
acctserver      127.0.0.1:1813         //radius计费
8 i' I7 B0 n% p, v) o9 h1 [8 P# vim servers3 r/ ~7 ^" j/ `; |! F
#Server Name or Client/Server pair              Key
# h5 H+ @5 ^3 L#----------------                               ---------------
* t' U8 P% b8 K' t7 P8 ?# s#portmaster.elemental.net                       hardlyasecret- ?7 U1 `- B1 u: I/ {# K
#portmaster2.elemental.net                      donttellanyone
% B: Q' _% T; C2 B! L$ R+ \- c127.0.0.1                        testing123
1 r  T+ [9 }/ w9 N; }; h重启pptpd: service  pptpd restart
8 L' Z  P6 o% b. e五、带宽限制6 s; j$ E2 R% K
使用radius传回限速信息对客户端限速5 X* u4 ~# U+ U
基本原理,radius根据数据库里面的限速字段的属性,下发给PPTP服务器,服务器再根据接收到的限速字段属性来限制用户带宽。0 h% u: @3 W7 O! K7 ^# J& V% P
由于Linux的PPTP 限速字段不在radius默认的列表中,需要手动添加该字段。
- k: z0 D. L( C+ V0 M; }' {: Z* I/ YPPTP服务器:* d3 z8 n; y0 F+ i2 j5 v$ {, e
#cd /usr/local/etc/radiusclient. b9 z% N# D+ h' X0 k
#vim dictionary 添加如下两行  u- Q$ R0 d$ C- i
ATTRIBUTE       PPPD-Upstream-Speed-Limit       230     integer' J+ L2 q  }* A( ]
ATTRIBUTE       PPPD-Downstream-Speed-Limit     231     integer/ p) j: b: v$ S+ r, q/ o- B! l
同样也需要在radius的dictionary中添加这两行。具体位置/usr/local/etc/raddb/$ h; ?* s& n) x
还需要在数据库中加入:* P: f- S5 G: W. B" H  p
INSERT INTO `radgroupreply` VALUES (8,'test','PPPD-Upstream-Speed-Limit','=','512');3 F8 V: W, `4 y% ~  }) d  `
INSERT INTO `radgroupreply` VALUES (9,'test','PPPD-Downstream-Speed-Limit','=','512');5 [( L! Q7 |: U2 N1 ]' ]: ]
512是限制的带宽,单位是kbps/ C0 L/ s, ]7 ~& ]5 f4 }3 L  j
最后需要在/etc/ppp/目录下添加一个本地脚本,用TC来限制带宽:
( O) g( W( Z+ l/ s; t0 }2 G" m脚本内容如下:3 O! d( u2 Z, F$ I5 o- d+ d
#cat ip-up.local   //注意。该脚本必须要有可执行权限。
' W, v, \- N" {( X#!/bin/bash
6 A4 h' K( R2 E$ L4 ?PATH=/sbin:/usr/sbin:/bin:/usr/bin
, O5 t  q! U1 t. Jexport PATH
3 p2 k" U9 F- k! e& h- ^+ R# Get the attrbute from radius reply; b/ \3 H- Q& P" W# K( C4 @8 e3 J
if [ -f /var/run/radattr. $1 ]. W( d* z, m0 }, _0 ]
then# n0 [. d! n# u! p
   DOWNSPEED=`/bin/awk  '/PPPD-Downstream-Speed-Limit/ {print $2}'  /var/run/radattr. $1`( n5 B  X; \7 T6 d
   UPSPEED=`/bin/awk  '/PPPD-Upstream-Speed-Limit/ {print $2}'  /var/run/radattr. $1`
9 M- z# W# ]2 y9 d# _; K+ Z- q7 bfi9 Q$ h* a; W& p
# End
' a( i- G+ d0 r9 d# Start Bandwidth Limit# I5 o& t! u* l2 O- G5 p, {+ i
   /sbin/tc qdisc del dev $1 root    > /dev/null9 [, H/ {: h& Z% E( D
   /sbin/tc qdisc del dev $1 ingress > /dev/null
2 c8 h  N# ]2 E##### speed server->client
/ m( f! [+ Y& E  [7 I8 B, e* z& T  if [ "$DOWNSPEED" != "0" ] ;1 M: X) L6 l' S( K/ t* h3 C& v& \
  then" v, F3 \4 |6 @: _- C
    /sbin/tc qdisc add dev $1 root handle 1: htb default 20 r2q 1+ O+ Q/ h2 V- P9 n/ T! q
    /sbin/tc class add dev $1 parent 1: classid 1:1 htb rate ${DOWNSPEED}kbit burst 4k1 J2 j* r* J' Z0 _; B9 S- R1 m' U9 g
    /sbin/tc class add dev $1 parent 1:1 classid 1:10 htb rate ${DOWNSPEED}kbit burst 4k prio 1
/ |; X2 e  u* m# D7 ?; T: V    /sbin/tc class add dev $1 parent 1:1 classid 1:20 htb rate ${DOWNSPEED}kbit burst 4k prio 22 n; X- S; ^# M
    /sbin/tc qdisc add dev $1 parent 1:10 handle 10: sfq perturb 10 quantum 1500
2 k4 H! d/ M( M' W9 e    /sbin/tc qdisc add dev $1 parent 1:20 handle 20: sfq perturb 10 quantum 1500, K% b: V( b3 x
    /sbin/tc filter add dev $1 parent 1:0 protocol ip prio 10 u32 match ip tos 0x10 0xff flowid 1:100 ?/ O: V; K/ y3 g" x/ b3 T
    /sbin/tc filter add dev $1 parent 1:0 protocol ip prio 10 u32 match ip protocol 1 0xff flowid 1:10
" m4 T4 g1 \1 y) m    /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
- H9 H) r0 I2 i; w6 X& z; }) N0xff at 33 flowid 1:10: ?+ N! K$ t* A" n" ^5 z0 z6 L
  fi, \1 @+ W& K. b$ f. i7 y5 o$ m; d
##### speed client->server
+ c' G6 g- t+ L  if [ "$UPSPEED" != "0" ] ;, g1 \: c+ o) j7 f4 z. g1 b
  then
5 }$ ]3 ^. N9 v1 b( i: ~0 ~    /sbin/tc qdisc add dev $1 handle ffff: ingress! ?) \! w1 v% u: f
    /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* u) f* Z, P& s* }+ |) Q
  fi
5 ^; m9 m/ p- z8 P5 X1 e7 N# End- p# @, M% m& u* |% G
六、        系统优化" {" `% x; X6 ~' s+ }" e( l
最后再做一些简单的系统优化,以满足较大的网络流量
' ^8 p% H/ l+ B$ x" H- ^3 l0 Y) wnet.ipv4.ip_forward = 1
; F, W, {/ n) L0 f) B& ]9 Onet.ipv4.conf.default.rp_filter = 1: E: @8 o; E5 Q
net.ipv4.conf.default.accept_source_route = 06 o  \, N, q7 z: [9 w7 Y/ t% K- z
kernel.sysrq = 0
! ~: u/ l4 j' ^( w6 M# h3 w$ [7 z2 c+ E5 mkernel.core_uses_pid = 1
- Z% z; D7 `/ d6 S* u" h1 h; V" Y, t. c  Wnet.ipv4.tcp_syncookies = 1" Q$ g* F6 a) u" i
kernel.msgmnb = 65536+ b6 y! i) ^9 Z% |+ M- J
kernel.msgmax = 65536! e6 C  D: G& F
kernel.shmmax = 4294967295
, l" [, v* e; r: @; w0 tkernel.shmall = 2684354562 y* c6 ]) p6 z; Q
net.core.rmem_max = 125829120 u4 q" I/ X* S+ B6 T
net.core.rmem_max = 12582912' I$ y8 |0 Y; _" k# H
net.ipv4.tcp_rmem = 10240 87380 12582912+ H- q' w# W* c' z2 O- p
net.ipv4.tcp_wmem = 10240 87380 12582912! t. W" h7 T6 {7 r% g
net.ipv4.tcp_no_metrics_save = 19 ^; P$ U! R! L" E1 j
net.core.netdev_max_backlog = 5000
$ }8 k. W$ l! \4 N如果想要对拨入用户做NAT,可以使用IPTABLES做
5 u9 T' V7 e  x6 C#iptables -t nat -A POSTROUTING  -j MASQUERADE
! W( [& |2 g0 W, r8 [

0 N4 f2 `! E. M3 ~* K5 ]5 e% _! e3 Z& n
) |3 p" I" w1 H% ^* Z
, h3 z: v: e7 |

; v+ d" ~! N$ f' S. H
5 n- r1 o1 D; C  }$ W# w. `
" v1 n; Q& K# p, \9 i  }8 S

& b7 Z4 I7 q6 g4 b" L
& R3 G/ s6 |1 v  ~$ h8 l( @
; T5 v8 p; k% k- g





欢迎光临 HKeSP - 香港易事泊 (http://bbs.hkesp.com/) Powered by Discuz! X3.2