TA的每日心情 | 开心 2016-5-12 14:23 |
---|
签到天数: 2 天 [LV.1]初来乍到
|
一、 软件需求:8 J8 F2 D$ X: G$ B
pptpd-1.3.4、ppp-2.4.4、Apache、MySQL、freeradius(freeradius.org)
6 W d$ H s7 ~7 c$ H二、 安装PPTP) b/ s* H7 B- w9 J# J4 C Z
1、操作系统使用RHEL5或者CENTOS5,内核版本为: 2.6.18-164.el5, 内核已支持MPPE,不用再安装。
( U8 C. P* v8 D O6 j1 }5 V% C& K# F使用RPM方式安装pptpd和pppd: |0 S; _% c5 T
rpm -ivh pptpd-1.3.4-.rhel5.1.i386.rpm+ T* _0 R6 d1 Z9 K0 }. ]- G- I) O
rpm -ivh ppp-2.4.4-2.el5.1.i386.rpm
- ]4 Q- n+ }5 ]! ^ r2、修改/etc/pptpd.conf主配置文件:
( W8 B* s0 u Rdebug 开启debug,方便检查错误。
! r* E. A# \. b! Eppp /usr/sbin/pppd pppd程序位置4 b$ ^+ _) ?4 ?( j
option /etc/ppp/options.pptpd pptpd的参数配置文件
- Y/ |! x& a( ]! D$ W6 N: olocalip 172.16.10.1 服务器的IP地址
- E z0 L1 E! F. y% Hremoteip 172.16.10.2-150 分配给客户端的IP地址池8 h# G k& X6 t# m
3、修改/etc/ppp/options.pptpd
. i9 u; _2 Q; J: x' v Glock; {" a' T; y( ~& F: c( J5 i/ P
debug1 {9 u% [' S8 k$ }
dump( T0 P# R9 U5 u3 x
logfd 20 T! c4 \4 q1 E3 g
logfile /var/log/pptpd.log
6 P! U! Y# U3 B1 N0 Z% T7 pname pptpd
' \9 P7 O& f9 i2 b" ^! u# {mtu 14505 V0 `& x. L3 u4 R
mru 14500 ]6 X2 v2 ?) {# O/ o
proxyarp/ V0 v j7 M! [# E
auth
) D! w$ `1 F7 t4 C( Z' splugin /usr/local/lib/pppd/2.4.4/radius.so radius模块,若不需要radius可以注释掉
" Z: H8 y- F1 U- D# f R; P( Bplugin /usr/local/lib/pppd/2.4.4/radattr.so radius属性模块
+ y2 ~" [* C2 w4 E7 a6 h$ ynobsdcomp( g. o# V4 N9 X4 _% `
ipcp-accept-local
. i2 W, F' f' X, wipcp-accept-remote
|6 v7 I* g0 I0 Slcp-echo-failure 3
' j# e# R6 A3 y, X' Y3 W% alcp-echo-interval 5
2 Z1 z/ p" d( I3 arefuse-pap
- y7 ~( \. b* ~% ~# grefuse-chap
* o9 ~) f8 n+ P/ t- ~6 o3 U7 M% Srefuse-mschap
+ |' L2 l" [( M6 K1 g+ I2 O" ?- arefuse-eap
+ J/ z8 P$ Q9 H5 @; D5 Zrequire-mschap-v2
0 ^0 c& P4 b. u$ hmultilink7 e6 L5 z! C/ E) N
require-mppe4 c& g' p+ h% H+ O+ o# t. V
ms-dns 202.98.96.68 客户端的DNS地址
% ^4 I' k5 p3 hms-dns 61.139.2.69 J, A$ `# G& d0 D5 n! ~6 }% v! ?
4、启动PPTP
2 P& C- @1 E1 E使用service pptpd start启动服务: e8 O* `& z( h+ O/ [& B
使用chkconfig pptpd on 使重启生效3 Z- N7 ~& f& d& q( f
5、添加测试用户/etc/ppp/chap-secrets
. L6 [9 b" ]. M q- w
; U, P& b6 f7 m u. U) q- c! U1 Y. y# Secrets for authentication using CHAP
7 n+ L0 w6 {) S; @# client server secret IP addresses ( \2 U' }% S$ {0 v4 _
test pptpd test *9 U2 H9 j4 d; s, t2 r
6、客户端设置
! I6 Z. Z8 T# q 在windows XP上创建vpn连接,并测试(略):9 U" ] V) i. L
三、 RADIUS与MYSQL安装:7 u" M) x$ O. y: p. P
1、 安装与配置MySQL! s* o3 S& {( T7 ~2 F% {: t
使用yum方式安装MYSQL、php、Apache! u s& }+ q" Z4 z6 `
启动MySQL:service mysqld start2 W; ?' Q. X7 T$ ~, n0 {
更改MySQL的root用户的密码; s; i# D3 ]- p9 }- D; j$ y
# mysqladmin -u root -p password youpass
5 A- t* q3 A! B2 K4 Z$ O6 ?( x#mysql -uroot -p youpass) {' |4 O9 V- _7 V! c( J7 ^7 ^) m
>create database radius; 创建一个名为radius的数据库
2 y( n2 B( H0 V8 t- O* j>exit
0 A( `- m$ |- |6 ]5 a#chkconfig mysqld on 随系统启动+ q a- ~* V. B! J3 F
2、 radius安装
+ H5 ?; q( b3 P) O& ?0 N9 F* `( J: _0 H从http://freeradius.org/ 获取 freeradius-server-2.1.7.tar.bz2# d# T* e9 X7 @
#tar -xvf freeradius-server-2.1.7.tar.bz2
( Q( h8 f9 _$ M#cd freeradius-server-2.1.7% ? [ W7 R, B( L" l* B
#./configure. D& t1 L$ T+ c8 k; z
#make
" v7 u6 ^, @" R$ N7 F8 V: k5 N/ W#make install
! z5 ?( R2 v) E/ }5 d# R) p#radiusd -X 使用debug模式运行radius
: Q( w3 m& Z3 \5 n如果看到 "Ready to process requests."表示安装成功。) s G. g6 O" I+ G6 Z& C: J$ w
3、修改freeradius支持MySQL。/ p; o; Q0 o) _" \4 d5 b4 U
#cd /usr/local/etc/raddb/sites-available) ]2 n/ L& Q% e! ]
编辑default文件,把里面所有sql前面的#去掉。5 g% q7 p; {" E& ?6 {5 F
# cd /usr/local/radius/etc/raddb/. X. n4 L" L: T# j; c' y
编辑radiusd.conf,去掉$INCLUDE sql.conf前面的#7 t( s5 Y" c# E4 a
编辑sql.conf,
6 S! _% Q! f) [3 c # Connection info:5 ~* c* ?+ [& G7 e- f7 C
server = "localhost"5 }) }7 _: P& i3 V! d% d% i
#port = 3306
+ T7 A: Q' }- J, { login = "root"1 |1 ]$ }( r9 W& i! D+ t8 s
password = "youpass"
/ H* e2 v2 _% |9 _向mysql导入radius所需的数据库文件
$ B# {1 B8 f7 Z( L#cd /usr/local/etc/raddb/sql/mysql
3 j4 y2 }2 k+ A6 D3 c8 I# mysql -uroot -p radius < schema.sql3 B: p3 T! d% K5 }- c! x( G. u
再用debug模式运行freeradius.
# h3 y+ j# l% a3 t1 Y' s+ _ n) c2 |# /usr/local/sbin/radiusd -X# z/ x% ~2 H2 @6 V
有可能会出现
' ~" v0 L3 Q% g/usr/local/etc/raddb/sites-enabled/default[159]: Failed to find module "sql".
6 j3 w/ a% `/ P- Y0 c9 Nradius没有找到驱动去连接mysql。
, L: F" c4 g& K; F. W+ q5 P+ T编译rlm_sql_mysql.so驱动% G; x0 q6 c* |+ z8 B' i W
#cd freeradius-server-2.1.7/src/modules/rlm_sql/drivers/rlm_sql_mysql) W/ |( I6 t" I6 b4 C% z8 F
#./configure;make;make install
$ P/ T0 q/ F$ S. m/ D- a, a. n这个时候驱动会安装到/usr/local/lib目录下面,要把驱动复制到/usr/lib目录下
( {4 b# X- i( P3 e#cp /usr/local/lib/rlm_sql_mysql* /usr/lib7 X/ D% P5 D- v6 o8 @9 z
接下来在数据库中添加测试用的用户1 r* G3 s2 f6 p# l( `3 L9 S3 |
#mysql -uroot -p radius
8 t/ u3 w4 M5 `: c8 c3 v) a0 R> INSERT INTO `radusergroup` (`username`,`groupname`,`priority`) VALUES ('','test',1);
3 |, Z( L ]2 G* p> INSERT INTO `radusergroup` (`username`,`groupname`,`priority`) VALUES ('test','test',1);
3 r6 ]$ Z0 Z6 _% p8 K5 Z* y) a> INSERT INTO `radcheck` (`id`,`username`,`attribute`,`op`,`value`) VALUES (1,'test','User-Password',':=','test');
; C* g$ ^) q3 M9 q2 H测试刚刚添加的用户能不能通过验证:
9 k# b0 [* w) q- r6 s# j9 z同时开两个窗口,运行#radiusd -X1 E) C. _$ X. [
另一个窗口运行:#radtest freebsd freebsd localhost 0 testing1236 T3 u z6 @7 P+ a* @! p
如果看到:"rad_recv:Access-Accept packet from host 127.0.0.1 ……",就已经成功了。
^6 D; U3 M2 a' V2 i4、 使用web界面管理radius用户. i5 B: f- M ~& y& E- ~
#cp -R ~/freeradius-server-2.1.7/dialup_admin /usr/local/; ^# f" \2 M2 ^/ W+ H& N
#ln -s /usr/local/dialup_admin /var/www/html/dialup_admin* V: Y b! g6 i* s( `" V. V2 q! u
#cd /var/www/html/dialup_admin/conf( s* K. M/ T1 `' _
编辑admin.conf,修改如下内容2 F, u/ }/ g! T5 S6 f2 y
0 y7 p1 f% f0 Q i, Hgeneral_encryption_method: clear6 @6 L( n3 D1 @- u& T. C3 ?; a$ ^
sql_type: mysql2 t) r; l: _/ O
sql_server: localhost7 ]; H7 z* j, _# F' k& _8 L8 ]
sql_port: 3306' S# N5 Y4 O, j0 `
sql_username: root: Z, x6 b1 E# ]' z# e5 x6 O
sql_password: youpass
9 O! P. V' g4 ?sql_database: radius
* w. m& {# B1 Lsql_usergroup_table: radusergroup
0 t: [% @$ I4 i6 u4 ~# sql_debug: true7 r! X/ O2 t+ E5 Q+ E* s
配置Apache
, b. @" \$ l1 j2 p0 b修改:/etc/httpd/conf.d/php.conf
2 W% j7 N3 I$ E6 hAddHandler php5-script .php .php3
! Q. O. @1 p' ?! R8 B修改:/etc/httpd/conf/httpd.conf
! Z$ Z$ h+ |8 z9 Z& |* r1 P1 f* c8 c<Directory "/var/www/html/dialup_admin/htdocs">( G- Y5 z5 E% }# t
启动apache:
& q8 i6 |& K$ a# W+ c. q#service httpd start
6 u' p- L s8 B4 f4 B: B#chkconfig httpd on
' ^5 e( X2 r8 P9 t6 \' q& ? O8 q2 j3 {打开浏览器就可以管理radius的用户了。6 }& l1 o2 N, f5 v$ x
四、 使用radius验证pptpd用户
% T! g; u5 [2 c& { @+ \4 D$ {使用radius验证用户,需要安装radius模块,: ]" @ v, M0 o& C) k0 I# S5 B" y
下载ppp-2.4.4.tar.gz源代码
, `- X0 M9 L4 d+ U: }' A9 T7 m2 S# tar -xvf ppp-2.4.4.tar.gz& D* m' L+ W) J5 B% B
# cd ppp-2.4.4 o1 q# K" i1 o. O5 J9 d
# ./configure //注意不要在这个地方编译安装。, {2 a7 G5 f) D* J# k) a* a
#cd pppd/plugins/radius 2 S, ?/ O4 s" Q( {. S
#make
5 B7 @; d* j+ }#make install
% k- X7 ]$ i: R9 M( g5 F9 ?; [/ J; C# cp -R etc /usr/local/etc/radiusclient
2 Q" A L7 X( E下面选项在使用radius验证时开启.需要注释掉local
`' d0 J/ L! A6 i6 `- C4 S#vim /etc/ppp/options.pptpd
2 ~" C, d/ i; R2 y* k1 [$ Hplugin /usr/local/lib/pppd/2.4.4/radius.so //必须先加载radius验证模块,再加载radattr.so2 ?& ^9 j1 }- Q6 j, r7 e( }
plugin /usr/local/lib/pppd/2.4.4/radattr.so1 a8 u& M$ X) d3 w6 K
#cd /usr/local/radiusclient
; ^. I1 ^! [; Z% E- T) ]' e5 h#vim radiusclient.conf 编辑如下两行
$ w' E$ z3 S) U" g0 Z* ?authserver 127.0.0.1:1812 //radius验证
: T$ F9 q) h/ ~( Cacctserver 127.0.0.1:1813 //radius计费2 @5 ?& m. ~; W% i' T: l* {
# vim servers
0 i+ U" B+ m2 z+ k/ Z* B8 D2 V#Server Name or Client/Server pair Key8 U! t4 `& a! `1 y3 ? X
#---------------- ---------------8 _$ }1 P8 Q0 m
#portmaster.elemental.net hardlyasecret
, h0 t& t) P: c. q) a+ X#portmaster2.elemental.net donttellanyone# G K/ S8 `3 d3 `( X/ u; p4 _4 n1 k
127.0.0.1 testing1238 ?4 v z1 n7 [. u& K% E' ^0 f
重启pptpd: service pptpd restart
- I7 N6 t* o. x$ P' U五、带宽限制" k8 d3 M" T- N- v4 o2 u Y
使用radius传回限速信息对客户端限速+ p8 O3 d: i+ S) u. e
基本原理,radius根据数据库里面的限速字段的属性,下发给PPTP服务器,服务器再根据接收到的限速字段属性来限制用户带宽。
9 x, o+ L: _ Y; q/ d& J由于Linux的PPTP 限速字段不在radius默认的列表中,需要手动添加该字段。( n9 C1 y8 l7 X7 {1 Y$ e
PPTP服务器:
" @6 K, o$ @" F8 N#cd /usr/local/etc/radiusclient6 s; ~2 E; i/ S1 q
#vim dictionary 添加如下两行
, d( Q$ u! I3 U2 w" k$ TATTRIBUTE PPPD-Upstream-Speed-Limit 230 integer
; \0 Y# V. w2 O, S s3 M: JATTRIBUTE PPPD-Downstream-Speed-Limit 231 integer: j0 P2 }! P8 B J( i- e% @! j
同样也需要在radius的dictionary中添加这两行。具体位置/usr/local/etc/raddb/
+ A M2 S: p8 S3 w0 @, l% q, l# w还需要在数据库中加入:
3 a1 X1 N2 |# I/ v- k: k0 V/ ?; XINSERT INTO `radgroupreply` VALUES (8,'test','PPPD-Upstream-Speed-Limit','=','512');
7 @/ Z: l; @8 }. DINSERT INTO `radgroupreply` VALUES (9,'test','PPPD-Downstream-Speed-Limit','=','512');
; ^1 `' b* q# d512是限制的带宽,单位是kbps: |- }5 L4 s1 h
最后需要在/etc/ppp/目录下添加一个本地脚本,用TC来限制带宽:+ y5 ]$ d; l* j+ w# ^5 z9 l8 n6 h
脚本内容如下:
; V9 c( r0 ]" n% y#cat ip-up.local //注意。该脚本必须要有可执行权限。
4 M$ z- W& x; L0 o* k" c5 G+ G ]#!/bin/bash0 m2 y8 J& @" m2 Y! P
PATH=/sbin:/usr/sbin:/bin:/usr/bin
4 [5 _9 @& l, l. `' o# u1 {! C6 gexport PATH
. L1 {6 d2 x i! v: z; p# Get the attrbute from radius reply' _9 Y9 c& y6 `% x' h( |
if [ -f /var/run/radattr. $1 ]
0 b' h1 A; F. t" q& Ethen: Q# j% }5 b: `* _* w
DOWNSPEED=`/bin/awk '/PPPD-Downstream-Speed-Limit/ {print $2}' /var/run/radattr. $1`9 Y: W$ L, {. Q
UPSPEED=`/bin/awk '/PPPD-Upstream-Speed-Limit/ {print $2}' /var/run/radattr. $1`
1 _6 C3 S7 }9 H2 K* R% vfi
" G+ i0 B8 ~+ @# End
& [5 H( P+ g% g8 |# Start Bandwidth Limit1 D7 u. ]% N+ Q; q! c% {& a
/sbin/tc qdisc del dev $1 root > /dev/null3 x# I: M& F3 }
/sbin/tc qdisc del dev $1 ingress > /dev/null
]5 d6 v, N5 p7 E##### speed server->client
" P, @* N( r! @4 f9 e if [ "$DOWNSPEED" != "0" ] ;, ^* Y2 E8 ~: i/ K$ r
then3 T) Y" |' S* u7 u
/sbin/tc qdisc add dev $1 root handle 1: htb default 20 r2q 1
6 z0 d" g6 y+ `; W4 B5 Q7 |; [ /sbin/tc class add dev $1 parent 1: classid 1:1 htb rate ${DOWNSPEED}kbit burst 4k/ o7 I; w1 g2 n
/sbin/tc class add dev $1 parent 1:1 classid 1:10 htb rate ${DOWNSPEED}kbit burst 4k prio 1 g* v6 s ]) P3 _
/sbin/tc class add dev $1 parent 1:1 classid 1:20 htb rate ${DOWNSPEED}kbit burst 4k prio 2
. ^$ F- y' X7 {0 ^! w5 T. D3 S7 o /sbin/tc qdisc add dev $1 parent 1:10 handle 10: sfq perturb 10 quantum 1500$ s1 s* W2 l. f; q' c- J' h
/sbin/tc qdisc add dev $1 parent 1:20 handle 20: sfq perturb 10 quantum 1500. e, v a. d8 F$ S
/sbin/tc filter add dev $1 parent 1:0 protocol ip prio 10 u32 match ip tos 0x10 0xff flowid 1:10% f* {) e- {4 d
/sbin/tc filter add dev $1 parent 1:0 protocol ip prio 10 u32 match ip protocol 1 0xff flowid 1:10" _! a( S/ J1 t. g+ n
/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 W- c0 ` N; d0 w
0xff at 33 flowid 1:10
" y& x) C- s1 }7 |+ | fi" d3 r6 G; F' ~- B/ X. j& ?3 g, a
##### speed client->server
5 f x2 C6 V7 z8 p6 \/ Y. q! e if [ "$UPSPEED" != "0" ] ;
2 h8 A! ?) z0 [& l r* Y then% B, x% f9 n! Q1 S5 y* C' K
/sbin/tc qdisc add dev $1 handle ffff: ingress
- o+ \) c6 u$ [+ i r7 g: u, P /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
- A4 ^, R; ~% d' t% w& H fi
' f) c% s% y$ q5 \6 }# End( f: Y7 F4 q$ v" X0 F- y1 T/ z
六、 系统优化
- c& e/ {* B, v* j& a最后再做一些简单的系统优化,以满足较大的网络流量
8 S4 ?3 n& {' Z2 o: S: Cnet.ipv4.ip_forward = 1
6 E4 j. K/ F5 v" M* mnet.ipv4.conf.default.rp_filter = 1( J2 c# Y7 N/ F5 p- ~4 ?& r
net.ipv4.conf.default.accept_source_route = 0
% i+ k6 H0 o$ r8 hkernel.sysrq = 0) Y4 ]; y7 ?/ C( B( r. \1 g4 U. e
kernel.core_uses_pid = 11 @. g: _1 a+ h7 M
net.ipv4.tcp_syncookies = 12 {# t& g4 `7 z" Y0 M, N" |
kernel.msgmnb = 65536
# @2 `# ?" M `4 X9 q. L+ C5 Y/ k( @kernel.msgmax = 65536
' d3 Q* q4 d5 X. `" Okernel.shmmax = 4294967295
* h4 y; Y- \" h: v- N: @2 @- R4 T; O6 hkernel.shmall = 268435456) d0 f$ K+ c9 D7 m' R
net.core.rmem_max = 12582912
% H% L) r$ L0 v% O, M1 knet.core.rmem_max = 12582912
/ v" u# `( S$ Y2 m t) Dnet.ipv4.tcp_rmem = 10240 87380 12582912
% L! p9 m6 r1 f0 W, \2 a7 k3 vnet.ipv4.tcp_wmem = 10240 87380 125829120 f1 C# f; N& G4 v0 C
net.ipv4.tcp_no_metrics_save = 16 F: z6 h8 T U0 s, R8 T
net.core.netdev_max_backlog = 5000
0 e1 {. ?# B$ W' K如果想要对拨入用户做NAT,可以使用IPTABLES做% r! s8 m. ]$ [5 v
#iptables -t nat -A POSTROUTING -j MASQUERADE8 W( C W; R+ Z9 M3 l
A4 T# s7 u8 w) }/ z) F$ z2 l& L
, |# L" N* X# ?3 E" X
" X: C0 P. J- N! E! V# ?
4 p( d; s3 c r" w9 b
. j" l# D9 ~9 P: A' h
' g) K5 @) p, u2 Z7 A" ?# t# r6 Q
! `5 o% s! j* \! F 7 o6 K+ B2 ]& z$ p4 W; M! W/ T
) ^% D% w9 S* U1 ?
|
|