一、 软件需求:: o; @+ |3 o# `+ @, K
pptpd-1.3.4、ppp-2.4.4、Apache、MySQL、freeradius(freeradius.org)8 [0 h6 w _0 Z) K4 ~2 u
二、 安装PPTP0 B) y4 P Z. h5 P2 ]2 [
1、操作系统使用RHEL5或者CENTOS5,内核版本为: 2.6.18-164.el5, 内核已支持MPPE,不用再安装。6 S, X7 p# i& }( b% k$ b: L# m
使用RPM方式安装pptpd和pppd1 m4 z ~1 P$ l( m, k% f
rpm -ivh pptpd-1.3.4-.rhel5.1.i386.rpm! q: \- f, H% E2 Z. Z% V! Y. a. M$ I
rpm -ivh ppp-2.4.4-2.el5.1.i386.rpm1 L ~) [3 J1 j$ h7 ?* B5 K
2、修改/etc/pptpd.conf主配置文件:
7 X8 n. F8 ]$ bdebug 开启debug,方便检查错误。
& v2 |/ [0 T! t! m! _* cppp /usr/sbin/pppd pppd程序位置
# @; m% ?# M3 voption /etc/ppp/options.pptpd pptpd的参数配置文件6 _1 S4 ]9 r* H
localip 172.16.10.1 服务器的IP地址
]; G1 E! h4 q* zremoteip 172.16.10.2-150 分配给客户端的IP地址池+ i8 c L' e+ y9 Q. M
3、修改/etc/ppp/options.pptpd( \; Z4 i$ g: O1 i
lock
9 p, ]. z2 k1 c1 _% `+ qdebug5 R; X- Q9 O% l6 t3 [
dump
$ G3 o6 x# I' K% w9 D& ilogfd 2
6 ^: z8 s9 g: G4 i- C" ~- wlogfile /var/log/pptpd.log% x- ~+ r/ `. J3 @9 D. p
name pptpd
, X3 o! v/ s, D7 ?" tmtu 1450
& Q4 h5 [- ^/ O2 `- e! umru 1450, }- L1 O) L# c
proxyarp) C5 S9 K. r; }' R8 S0 L
auth- K6 A) Z C/ n; ]: Z) a0 P* U
plugin /usr/local/lib/pppd/2.4.4/radius.so radius模块,若不需要radius可以注释掉7 h5 F0 f# c: V) @# y. G
plugin /usr/local/lib/pppd/2.4.4/radattr.so radius属性模块
, | E0 j- ]! w8 P* y" S+ dnobsdcomp* C9 ]2 f- }7 J1 @# `5 \
ipcp-accept-local
2 ~) j |5 R' v1 kipcp-accept-remote
: t7 a( i0 U/ D9 K X$ Qlcp-echo-failure 3
9 q! A- @& ^, f1 f' v$ \0 Llcp-echo-interval 5
0 s4 L( f+ W O" |- hrefuse-pap+ K: D; |$ I2 ]1 J6 i0 l. l
refuse-chap" X* Q9 t% d" M! c1 H
refuse-mschap
. t5 O" Q9 n; v6 @5 x& B" Hrefuse-eap
# r: l U( ]7 }0 Vrequire-mschap-v2
. j; V' Y5 V4 y! e8 tmultilink
& R, R" ~! ]5 U$ Erequire-mppe
9 e" M0 B' ?6 Q4 f+ v' zms-dns 202.98.96.68 客户端的DNS地址
4 j9 d) }' t1 y: B% ^ms-dns 61.139.2.69, [# k! G: V* A/ D% O
4、启动PPTP/ s$ S' Q9 |3 n9 r; S
使用service pptpd start启动服务; n; E: i% B4 D' ]
使用chkconfig pptpd on 使重启生效) E6 [: O0 m0 D+ P* y4 m: I" k5 m) H
5、添加测试用户/etc/ppp/chap-secrets4 d' A' ?3 |% a, a
( A+ i- F8 l& a+ r1 t- ^# Secrets for authentication using CHAP
, I! p: s7 ^8 z" V- D4 p& M9 {# client server secret IP addresses
# N% O5 ~% N/ s5 n$ Otest pptpd test */ ?$ P8 w k N# [( X2 r# d
6、客户端设置
, M$ i5 W, C' T I5 G0 ]' ] 在windows XP上创建vpn连接,并测试(略):/ A3 I+ x7 t( K1 h
三、 RADIUS与MYSQL安装:. V+ h! W/ f' L! ?% N2 ]& o1 F
1、 安装与配置MySQL+ a7 ~/ F) k. d
使用yum方式安装MYSQL、php、Apache: O2 ~/ R* Y( t8 `2 ~, h
启动MySQL:service mysqld start& K/ l' T4 R L `; f
更改MySQL的root用户的密码: b, z; f, V* v' v, v Z
# mysqladmin -u root -p password youpass d3 j4 j% f# m- o [3 h' e& C
#mysql -uroot -p youpass" s6 K( j0 p6 P- r/ K3 [
>create database radius; 创建一个名为radius的数据库0 y- |; u- A8 ^
>exit! X# _* @$ V/ k" ?- K0 U
#chkconfig mysqld on 随系统启动
* i8 ]# `, v& D1 a+ y2 M* `+ _2、 radius安装. ~8 U! X2 N; \! }0 L; q
从http://freeradius.org/ 获取 freeradius-server-2.1.7.tar.bz2
) @9 K. E5 K3 N0 x5 W' ]#tar -xvf freeradius-server-2.1.7.tar.bz2
# p) p% P# W4 \4 g2 @#cd freeradius-server-2.1.7
! Y* s- C2 M9 l: T& m5 l, {#./configure8 F6 C) L8 p" W+ ]# f! g
#make
$ w3 d. P, p2 {8 q#make install1 I/ X9 l o; |: a0 z
#radiusd -X 使用debug模式运行radius/ I: C9 n" h. x1 c* H- y
如果看到 "Ready to process requests."表示安装成功。
* u+ J* ^% Q* [" W" I3、修改freeradius支持MySQL。
3 q. U8 f5 d1 G* B0 M$ R/ f" L#cd /usr/local/etc/raddb/sites-available2 b; H4 z( }0 Y9 a4 I8 o
编辑default文件,把里面所有sql前面的#去掉。9 f# ~& u. P) i5 w3 L+ V' L
# cd /usr/local/radius/etc/raddb/
: N" V# j8 s* A编辑radiusd.conf,去掉$INCLUDE sql.conf前面的#8 G' N" d7 M3 f8 u
编辑sql.conf,; O4 ]" \; N4 M# x7 Y
# Connection info:
, X1 G4 g3 c2 }3 K0 ^4 |! y A server = "localhost"
: b0 e! `! _3 O' N; S& p #port = 3306
0 Y; A( A$ `2 M7 L0 P: m: A login = "root"! p5 c. ]- ^/ f' N- q6 C0 S) x
password = "youpass", \0 Z% C$ [: Z. p6 w. H6 W0 e/ L
向mysql导入radius所需的数据库文件
+ ?, u$ b2 I+ @! \- i6 e#cd /usr/local/etc/raddb/sql/mysql. p0 q5 \. R! Y7 N
# mysql -uroot -p radius < schema.sql t" M. O Q# U9 d& x- {6 a
再用debug模式运行freeradius.* f8 ~& V( d M5 ^& U+ [
# /usr/local/sbin/radiusd -X
, f: z( b8 W) n! I有可能会出现
; A8 @7 |( I! B1 O/usr/local/etc/raddb/sites-enabled/default[159]: Failed to find module "sql".
/ C. Q% ]: x- t* g sradius没有找到驱动去连接mysql。! x8 n8 _4 i9 F7 k6 q) S: [
编译rlm_sql_mysql.so驱动# B4 f1 L" s- x2 t# e" }0 ]; ~
#cd freeradius-server-2.1.7/src/modules/rlm_sql/drivers/rlm_sql_mysql
4 o) @/ L& h3 W, g& a#./configure;make;make install
9 C& L, r4 z! |& y! @8 V这个时候驱动会安装到/usr/local/lib目录下面,要把驱动复制到/usr/lib目录下
6 I# j% O9 ^( u4 n#cp /usr/local/lib/rlm_sql_mysql* /usr/lib. T" M- R+ L8 c. k
接下来在数据库中添加测试用的用户
- g' A# _/ `2 f#mysql -uroot -p radius2 \- T; |% E: G8 m$ ?
> INSERT INTO `radusergroup` (`username`,`groupname`,`priority`) VALUES ('','test',1);
, k2 T0 q. _1 y; ~) L' u8 c> INSERT INTO `radusergroup` (`username`,`groupname`,`priority`) VALUES ('test','test',1);
* q# Z! o/ r- `( p! s> INSERT INTO `radcheck` (`id`,`username`,`attribute`,`op`,`value`) VALUES (1,'test','User-Password',':=','test');4 x6 N$ Z/ _: d
测试刚刚添加的用户能不能通过验证:
, K4 H# ], W, _& l4 M同时开两个窗口,运行#radiusd -X4 n$ a) j0 G- V6 n2 f1 `
另一个窗口运行:#radtest freebsd freebsd localhost 0 testing123
$ _1 V1 t5 `& b* F/ O如果看到:"rad_recv:Access-Accept packet from host 127.0.0.1 ……",就已经成功了。- h& k: d- I( y! E; {6 z. S
4、 使用web界面管理radius用户5 T* T" `) O$ B2 e9 Q
#cp -R ~/freeradius-server-2.1.7/dialup_admin /usr/local/4 f3 N/ j! M4 s& S: e
#ln -s /usr/local/dialup_admin /var/www/html/dialup_admin) u& m5 _! j" o, N7 B- B6 W2 A
#cd /var/www/html/dialup_admin/conf: ?0 {: Q/ R7 t3 ^( O
编辑admin.conf,修改如下内容1 d3 K. Q/ W+ t5 f! c
0 ?/ k: d1 x7 p* @% W! o
general_encryption_method: clear
. C# ]+ M4 E3 e0 v' ]& x4 \+ C+ Esql_type: mysql* |) s3 X z0 k' ]) F
sql_server: localhost. h( ^9 ^ a1 Q' w9 P
sql_port: 33065 S8 C6 U% u! p
sql_username: root
( ^0 o6 ]0 c1 Z" b2 } Y! jsql_password: youpass5 a: P5 q% W+ p6 z" V
sql_database: radius
( K5 c/ @* _ G3 n; A: f8 csql_usergroup_table: radusergroup
# ]6 \( A6 s6 n& @1 P; ?& G# A2 a# sql_debug: true: s) P+ f* T o0 [- Y* k! K
配置Apache
! ?. C2 L- ~$ d9 R修改:/etc/httpd/conf.d/php.conf8 Z! B8 L2 \5 U/ R
AddHandler php5-script .php .php3
0 d4 V3 ?& A2 l+ Z% ^. |8 B修改:/etc/httpd/conf/httpd.conf' J$ l7 l% v; }% ^3 u( r% X$ h4 f
<Directory "/var/www/html/dialup_admin/htdocs">! I# I) i4 @# z0 y' C
启动apache:
" k" I6 E' n8 b, A0 p1 }#service httpd start1 v# q, m; g6 C; t0 W6 B, J5 @& t
#chkconfig httpd on, _' N5 v, `6 g/ B4 X/ j
打开浏览器就可以管理radius的用户了。1 y1 |" {! G6 S9 B7 [( [
四、 使用radius验证pptpd用户
) ~2 `5 X; U. @' U# g8 V使用radius验证用户,需要安装radius模块,% S, h D2 Q7 r7 x* F; ]% I) k
下载ppp-2.4.4.tar.gz源代码& _4 \3 Z. s, f5 K
# tar -xvf ppp-2.4.4.tar.gz1 `( {, ~! M# p& e
# cd ppp-2.4.4
4 M ^3 u; P' V- g, S# ./configure //注意不要在这个地方编译安装。
1 ] _7 v( G( z, f#cd pppd/plugins/radius
2 r* Z- J2 a! b- P5 E#make% e J E% G3 B$ \
#make install
) t1 B- W8 T5 P$ C5 _7 I# cp -R etc /usr/local/etc/radiusclient
4 m4 m4 p# y1 A8 |下面选项在使用radius验证时开启.需要注释掉local
" w. S7 s6 e0 E8 o2 ?) S3 V#vim /etc/ppp/options.pptpd6 G/ C* t/ b5 F1 i: ^7 |
plugin /usr/local/lib/pppd/2.4.4/radius.so //必须先加载radius验证模块,再加载radattr.so
, E3 P1 U+ q3 R9 B6 m) fplugin /usr/local/lib/pppd/2.4.4/radattr.so
% n5 x6 C( i, w- C* N- R) M#cd /usr/local/radiusclient, k' z: R( o1 K2 F" B T( ^
#vim radiusclient.conf 编辑如下两行
. z; o1 ]* O' y! o' g6 Y. M; D, zauthserver 127.0.0.1:1812 //radius验证* g: U8 D6 o1 a- j* ^5 M0 x% C/ Z
acctserver 127.0.0.1:1813 //radius计费+ S! Y l5 Z3 }+ `
# vim servers" _; D: h6 ~$ i$ h4 K+ L& N2 \$ V# _: T5 s
#Server Name or Client/Server pair Key
& x, E2 j: b P* Z, R#---------------- ---------------
# r6 w8 {1 Q1 Q% p) L, h4 d; p( K#portmaster.elemental.net hardlyasecret% ]) ]2 J4 _; y6 P! H6 z
#portmaster2.elemental.net donttellanyone
- l0 }, o9 i! T+ o: t127.0.0.1 testing123+ V% G/ U: q [$ z
重启pptpd: service pptpd restart
$ w% s- {: C- G5 z& N! h1 L& Z五、带宽限制
2 I/ U' O) Y+ W" h; n$ q6 x# n使用radius传回限速信息对客户端限速 T3 O& x& Z' y* |/ _
基本原理,radius根据数据库里面的限速字段的属性,下发给PPTP服务器,服务器再根据接收到的限速字段属性来限制用户带宽。; H5 a2 Z/ M4 z# v
由于Linux的PPTP 限速字段不在radius默认的列表中,需要手动添加该字段。
( Q( ]$ ~3 C! K9 s' U6 G) u; T7 P- lPPTP服务器:
- n. @7 H4 D8 l# I, a#cd /usr/local/etc/radiusclient! j2 I! T7 N; ~9 J( N$ G/ Y
#vim dictionary 添加如下两行- t: Y/ s( ^# B+ P
ATTRIBUTE PPPD-Upstream-Speed-Limit 230 integer( U r# C' T, i; X5 s: a/ h
ATTRIBUTE PPPD-Downstream-Speed-Limit 231 integer
& ]. ?+ s+ y+ P1 s同样也需要在radius的dictionary中添加这两行。具体位置/usr/local/etc/raddb/) ?: ~1 y; p6 D) P* L* f! O- S3 W
还需要在数据库中加入:3 b$ k8 `1 _& n% S8 ?
INSERT INTO `radgroupreply` VALUES (8,'test','PPPD-Upstream-Speed-Limit','=','512');
/ S* L. \+ X% e, I- e. K; F0 {' O. r6 F, QINSERT INTO `radgroupreply` VALUES (9,'test','PPPD-Downstream-Speed-Limit','=','512');
+ m7 Y; x C y) Y512是限制的带宽,单位是kbps; v$ T4 Q/ m3 s4 x
最后需要在/etc/ppp/目录下添加一个本地脚本,用TC来限制带宽:# U! w) G$ ]' ]
脚本内容如下:4 F- A9 J% S3 B
#cat ip-up.local //注意。该脚本必须要有可执行权限。4 T& I/ C8 Q, J. R# ^+ W
#!/bin/bash, H0 U3 `# u& Y1 V! v
PATH=/sbin:/usr/sbin:/bin:/usr/bin t4 R6 y2 g( m7 z
export PATH( s4 I d0 Q7 e; x0 m- \
# Get the attrbute from radius reply
) @8 f H" w# F; ^0 J8 v/ g9 T- nif [ -f /var/run/radattr. $1 ]
9 s" `( |6 H- L" E' zthen
. X; V g7 O( c& A DOWNSPEED=`/bin/awk '/PPPD-Downstream-Speed-Limit/ {print $2}' /var/run/radattr. $1`
4 W t1 G' L5 `* G UPSPEED=`/bin/awk '/PPPD-Upstream-Speed-Limit/ {print $2}' /var/run/radattr. $1`
) A' K1 n" O' _5 j cfi
4 H: D. R3 ~) o/ L9 [ g1 |# End1 t3 x! |: j N3 v! P
# Start Bandwidth Limit/ `4 B7 h7 Z- b; p' L$ k ^
/sbin/tc qdisc del dev $1 root > /dev/null$ m; s/ d, z2 r. x$ R
/sbin/tc qdisc del dev $1 ingress > /dev/null) ^) v6 d/ c' ]
##### speed server->client, n0 {& V3 ~/ Y6 @
if [ "$DOWNSPEED" != "0" ] ;
+ h- z8 \, o2 g/ l( @+ Y [$ V" P then8 X) k1 E. O$ I2 J
/sbin/tc qdisc add dev $1 root handle 1: htb default 20 r2q 1; f% Q' O* q2 p) u d
/sbin/tc class add dev $1 parent 1: classid 1:1 htb rate ${DOWNSPEED}kbit burst 4k3 c' A3 M' f* \
/sbin/tc class add dev $1 parent 1:1 classid 1:10 htb rate ${DOWNSPEED}kbit burst 4k prio 1
. t7 i: Q8 \- i4 f0 d; I3 A t /sbin/tc class add dev $1 parent 1:1 classid 1:20 htb rate ${DOWNSPEED}kbit burst 4k prio 2
4 u' N4 O2 J# j1 g+ g" h* C /sbin/tc qdisc add dev $1 parent 1:10 handle 10: sfq perturb 10 quantum 1500# q- v; T2 a7 G3 ?8 {
/sbin/tc qdisc add dev $1 parent 1:20 handle 20: sfq perturb 10 quantum 1500
& x, N" ^& I; m/ Y /sbin/tc filter add dev $1 parent 1:0 protocol ip prio 10 u32 match ip tos 0x10 0xff flowid 1:10 |/ T6 P( ^7 Q) J
/sbin/tc filter add dev $1 parent 1:0 protocol ip prio 10 u32 match ip protocol 1 0xff flowid 1:10
4 p% n" I! ?6 n0 H1 E6 x8 y /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 0x108 }% T& s! N6 W- y' |) {
0xff at 33 flowid 1:10
. }! c9 m1 z- g! H$ g0 p fi
8 B& }6 T5 K4 q' f; N z0 S0 f##### speed client->server
/ d4 \: M5 u, _, ?3 j* v if [ "$UPSPEED" != "0" ] ;
0 r) b, Z$ w/ Y( ^ then7 u1 S9 k. | S7 S' Y
/sbin/tc qdisc add dev $1 handle ffff: ingress
- ^4 u% ]& q I* ?7 m- [# h4 W /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( D6 z$ b: {. u/ M2 h6 U) j
fi3 `9 b: D4 ?. m1 b4 m% u' Y* b
# End* ?) I' h* S0 S
六、 系统优化 _# m/ V! G" e6 b$ e5 Q) W3 j5 L
最后再做一些简单的系统优化,以满足较大的网络流量
. @9 g4 M c! H% G9 T/ s& m( onet.ipv4.ip_forward = 1
) c R4 L2 u) Wnet.ipv4.conf.default.rp_filter = 1$ l9 `7 N* h( G! @2 \
net.ipv4.conf.default.accept_source_route = 01 b4 w! \( g9 {
kernel.sysrq = 0# Z/ T3 @9 @2 e( x- g
kernel.core_uses_pid = 1
/ t) F7 i, g. x+ k3 P; }8 wnet.ipv4.tcp_syncookies = 1+ R7 {4 l' x/ b0 Q: P7 i7 p
kernel.msgmnb = 65536
! \% O4 N9 b9 v- s: skernel.msgmax = 65536; ]; I& t4 R1 N1 J1 v3 P% I
kernel.shmmax = 4294967295
: s; V( _; L9 |6 d3 v* H5 rkernel.shmall = 268435456
" {0 Y8 m' l% @# M$ Pnet.core.rmem_max = 12582912) m+ q( ~4 D/ \# Y u( C
net.core.rmem_max = 12582912
& n( Q. }, Y3 v. o, s/ d7 unet.ipv4.tcp_rmem = 10240 87380 12582912
4 G" K8 Q; k1 s6 P# E& w2 ?1 @net.ipv4.tcp_wmem = 10240 87380 12582912
4 o% \( s8 m% S' Qnet.ipv4.tcp_no_metrics_save = 1, G3 V( R0 T! c5 g, b
net.core.netdev_max_backlog = 5000
8 Q1 e7 C5 ?, C1 U" m4 `如果想要对拨入用户做NAT,可以使用IPTABLES做
9 h) r3 k7 O: g" A4 v' D4 H- j8 R#iptables -t nat -A POSTROUTING -j MASQUERADE
1 H5 K3 j+ d* L+ l9 f! A$ n6 F8 S* j( N
& S* U; Z. \7 j- {
: R% h3 Z2 y) F7 S+ ]( u
- v [, V4 ]; n; [) u0 F6 Q$ _6 V# Q& R9 {' a
- Q) C$ g& N; W+ g6 ?
& x/ P, M0 J: w, C
, `" G3 {0 W0 G. B - l4 \0 A+ z6 a+ L; f& u0 S
) z, j" ]" Y0 {; _ |