TA的每日心情 | 开心 2016-5-12 14:23 |
---|
签到天数: 2 天 [LV.1]初来乍到
|
一、 软件需求:! P" E# v* B3 g5 ^% N8 }
pptpd-1.3.4、ppp-2.4.4、Apache、MySQL、freeradius(freeradius.org)! N' `1 a9 i, o, j1 K
二、 安装PPTP
) U! V2 Z+ |4 Q3 T1 l+ J1、操作系统使用RHEL5或者CENTOS5,内核版本为: 2.6.18-164.el5, 内核已支持MPPE,不用再安装。2 r% `: {4 s# s7 X6 `, @! M
使用RPM方式安装pptpd和pppd
9 P+ D$ b6 e- l3 ^0 mrpm -ivh pptpd-1.3.4-.rhel5.1.i386.rpm
' W% i- G8 a1 h; n8 t/ J/ v( n$ frpm -ivh ppp-2.4.4-2.el5.1.i386.rpm
7 `5 {' B8 F7 g# N* D2、修改/etc/pptpd.conf主配置文件:; u6 W' l; G$ a3 x g: M; I' k
debug 开启debug,方便检查错误。& m- I( L/ a% m6 P$ X) N$ |. m" J, ~
ppp /usr/sbin/pppd pppd程序位置
$ n; A7 Y+ I$ j# k4 }! b: Coption /etc/ppp/options.pptpd pptpd的参数配置文件# z( J% D4 ?5 Y+ B
localip 172.16.10.1 服务器的IP地址! }: m0 W, S- H6 o) [4 J- v, H
remoteip 172.16.10.2-150 分配给客户端的IP地址池' u# E! `. P0 F" I; |7 C
3、修改/etc/ppp/options.pptpd& R) B) O3 L$ X! f v" U7 G c
lock9 e7 a3 k& I |4 n L0 |2 o7 S, U
debug
/ n, X0 `2 h$ v3 K" Q- edump+ U! E' x8 w8 q
logfd 23 m, T h9 n. u8 C4 y$ }6 S4 r
logfile /var/log/pptpd.log
. l% _" [& k. E/ ename pptpd
$ v9 k+ ^4 `% f7 Y7 y& n# W- @mtu 1450
" g/ A" ~$ _8 k8 ]mru 1450
6 `$ |( S6 _, C4 c7 U0 R' G& f4 M* k4 hproxyarp' J: d# g0 T! m8 n" [$ I2 L
auth
x& f0 L6 n. g3 lplugin /usr/local/lib/pppd/2.4.4/radius.so radius模块,若不需要radius可以注释掉2 v1 q. Z, `5 k4 x2 [ d, C
plugin /usr/local/lib/pppd/2.4.4/radattr.so radius属性模块
3 K) R' L/ q, Y& Z* L4 ^- U) J' Knobsdcomp8 B$ g3 T: i0 L: B
ipcp-accept-local8 |* F$ v' g; R( @" y/ \5 a
ipcp-accept-remote K/ p# `" j8 ~* ?2 K
lcp-echo-failure 3
( }; i v4 f7 j9 |$ `# xlcp-echo-interval 5
% |$ z' c8 R. e3 w" J# K0 I4 O1 Grefuse-pap" N2 M- z* w. A! E
refuse-chap& S* T3 A( `( Q/ U3 _; y. @2 ?
refuse-mschap
! a2 E4 k& Q) o$ g4 Grefuse-eap: Q8 s" k+ h0 @6 X; j( f
require-mschap-v2
$ v# W2 Q( h! R( F& pmultilink
) I" Y1 h @+ [7 L# Z6 vrequire-mppe
y0 H: H( d" D4 b6 N# hms-dns 202.98.96.68 客户端的DNS地址
' b/ I8 P" Q2 o8 U7 U" p7 O' ~$ {1 jms-dns 61.139.2.69
. q/ C D9 W+ x- D4、启动PPTP
% b9 ~! @/ i- _( b1 B7 L; r使用service pptpd start启动服务7 n0 m& x3 V7 ?8 Q2 u& ?' Q
使用chkconfig pptpd on 使重启生效+ B9 j% j+ a' f% Z. L
5、添加测试用户/etc/ppp/chap-secrets
' U0 O6 x9 Q+ c+ J% v + g) A* @9 o+ S! T: k5 g
# Secrets for authentication using CHAP - U* Y& K9 R0 o/ W1 C1 {5 c
# client server secret IP addresses
# X# H0 Q1 Y# D4 E! f1 ptest pptpd test ** Q0 R" \9 r1 O& R, P- X5 J0 x
6、客户端设置8 [0 Y. U' @, T
在windows XP上创建vpn连接,并测试(略):
7 {8 L$ F) f4 p. ]1 L# |4 w+ E三、 RADIUS与MYSQL安装:
& P4 ]9 r" d! I/ U1、 安装与配置MySQL6 d# @1 P" F8 O, N% G0 X6 T
使用yum方式安装MYSQL、php、Apache2 W0 v f9 ~4 k9 M0 x9 m
启动MySQL:service mysqld start
2 f1 C- u$ q- X更改MySQL的root用户的密码
3 T: A' e* H; Z9 z2 P! z# mysqladmin -u root -p password youpass! Y7 P4 n. x; j" j
#mysql -uroot -p youpass
. m6 a/ J5 u$ |; D# ~4 }>create database radius; 创建一个名为radius的数据库. ^2 Z7 U3 Q+ [8 F" C' `4 R7 b
>exit* x2 `" Q: |& Z! u4 p6 [
#chkconfig mysqld on 随系统启动
' Y9 ^4 q; I, _- }; @2、 radius安装6 L/ d, {9 x1 k4 w0 K
从http://freeradius.org/ 获取 freeradius-server-2.1.7.tar.bz23 \* y0 C% j$ n
#tar -xvf freeradius-server-2.1.7.tar.bz2
+ I Y; ]( p, s" z#cd freeradius-server-2.1.7
% O8 C) w* o% P7 j' w' c! y8 k#./configure6 Q: |+ P) k' b- N! o0 ]
#make
8 b/ [+ o# L! o; G. o#make install
* J7 Y; J9 P0 `1 E; x( O#radiusd -X 使用debug模式运行radius
" L$ I' }1 W- F; W5 h, N3 y K& Y如果看到 "Ready to process requests."表示安装成功。
- A. ^0 P% O2 Y$ i& E3 d: v3、修改freeradius支持MySQL。
* F6 M" O9 r+ u* r#cd /usr/local/etc/raddb/sites-available
1 e1 z6 }, D5 Y& G Q2 ]编辑default文件,把里面所有sql前面的#去掉。5 Y) k* ^! x5 m! _
# cd /usr/local/radius/etc/raddb/6 z N* R) y1 M1 g( b
编辑radiusd.conf,去掉$INCLUDE sql.conf前面的#2 y+ X K0 D# R" D2 {
编辑sql.conf,3 P/ M; g/ x ?9 S9 u4 U6 a8 K( s# G; a3 f
# Connection info:
" {; O- i1 B7 D/ R- n5 i# B server = "localhost"* Q% u/ n% g. G1 ]* F
#port = 3306% L/ y! j5 _8 \0 G, E
login = "root"+ i" S' L0 f% u4 R+ R& B; o0 k6 |
password = "youpass"1 j& U1 x7 |* Z! R. d( t1 {0 \
向mysql导入radius所需的数据库文件0 |7 e, L8 S) E, I. D$ H
#cd /usr/local/etc/raddb/sql/mysql
& n/ C" j: s. O3 w% [# mysql -uroot -p radius < schema.sql
3 d& ? E" Y- m7 H3 E4 S再用debug模式运行freeradius.
% M, T0 a$ a A# /usr/local/sbin/radiusd -X4 \, V1 m! M! }5 r) p6 B1 k% G5 b
有可能会出现# a. |$ Q z' G% ?
/usr/local/etc/raddb/sites-enabled/default[159]: Failed to find module "sql".) U/ f4 C) e" s. a) b+ Q3 k/ y
radius没有找到驱动去连接mysql。- K6 d$ t q# p# [
编译rlm_sql_mysql.so驱动& Y" Y) _5 i1 }0 P4 P
#cd freeradius-server-2.1.7/src/modules/rlm_sql/drivers/rlm_sql_mysql
$ y# k, l) ~, x. m& ~#./configure;make;make install
1 O3 v# L! \- A/ V q- ^( F/ I. i这个时候驱动会安装到/usr/local/lib目录下面,要把驱动复制到/usr/lib目录下
% O1 D. H4 x# I9 t; W( s; g2 D#cp /usr/local/lib/rlm_sql_mysql* /usr/lib
" Y( E( T( o' z. S7 P, h6 c7 v z接下来在数据库中添加测试用的用户
% {# C! w/ g4 ?( Q; q#mysql -uroot -p radius! J% G' C5 ?1 f) `" e) e, V# c7 V
> INSERT INTO `radusergroup` (`username`,`groupname`,`priority`) VALUES ('','test',1);
( `9 u4 Q# {$ g$ }1 r> INSERT INTO `radusergroup` (`username`,`groupname`,`priority`) VALUES ('test','test',1);' U0 \( _9 P3 y8 E
> INSERT INTO `radcheck` (`id`,`username`,`attribute`,`op`,`value`) VALUES (1,'test','User-Password',':=','test');7 e% \: C+ M$ N! _
测试刚刚添加的用户能不能通过验证:, Y5 w8 [" A* X' {1 A
同时开两个窗口,运行#radiusd -X' b5 @7 Y0 j/ ]" a/ W
另一个窗口运行:#radtest freebsd freebsd localhost 0 testing123# i9 @: M/ N' D/ V2 \
如果看到:"rad_recv:Access-Accept packet from host 127.0.0.1 ……",就已经成功了。
. J8 J0 _+ A9 V1 G/ r6 g3 x4、 使用web界面管理radius用户# g; r5 o) Q, Q% v' b5 i
#cp -R ~/freeradius-server-2.1.7/dialup_admin /usr/local/) x0 |/ Q u. J9 A8 q Z
#ln -s /usr/local/dialup_admin /var/www/html/dialup_admin; X2 h8 `9 M1 B( @0 f
#cd /var/www/html/dialup_admin/conf
% F; |, A! V. Y, F9 C1 |3 o4 L# M% m' ? 编辑admin.conf,修改如下内容4 s& d( b$ P: u- I
) [ ^0 f8 C# q5 {; T/ c+ N, Y& x Sgeneral_encryption_method: clear6 Y( b( K6 A" T3 q
sql_type: mysql; L4 u9 X, ]0 ]0 _
sql_server: localhost
0 B7 w8 _8 y, g8 ?* p2 K9 usql_port: 33066 @7 d, k+ z; b8 x( X
sql_username: root
3 F' v2 o" L8 s- A+ Z1 s' gsql_password: youpass
% i9 U/ r8 e8 q) r, g4 Y) Ysql_database: radius
1 d( W$ q& C0 Y, M `' C$ U8 tsql_usergroup_table: radusergroup
) a8 b8 \7 H) F+ x1 E: B; n3 T# sql_debug: true3 Z) d* \6 \ D$ v- {1 Q
配置Apache
. r( l8 x) I u: r' v修改:/etc/httpd/conf.d/php.conf
0 h3 w" s* g6 e TAddHandler php5-script .php .php3
q1 G2 |8 o% C8 {; O' U0 V修改:/etc/httpd/conf/httpd.conf D- A% t% a1 ?* ]
<Directory "/var/www/html/dialup_admin/htdocs">
0 P+ ^4 K x' h, I* _5 g0 F启动apache:
0 r- R& p2 l7 C8 l- j* J7 `; I#service httpd start
- s: j' A% {* X# K5 E, u#chkconfig httpd on
# N' o) m0 p& U& }; z$ X# O打开浏览器就可以管理radius的用户了。
3 A* t1 d6 T& g5 R* X四、 使用radius验证pptpd用户
( Z: h% z/ ?3 m& ~/ e+ g使用radius验证用户,需要安装radius模块,+ g! V. H' s2 R0 R* R- F8 E. M
下载ppp-2.4.4.tar.gz源代码, k2 {5 _; V. w7 ?* n
# tar -xvf ppp-2.4.4.tar.gz: x/ `1 u) G- B8 g" [
# cd ppp-2.4.4
+ @9 O* J4 [# N2 ]; P3 O3 G# ./configure //注意不要在这个地方编译安装。( _6 J. H3 {4 c5 j3 S) f
#cd pppd/plugins/radius
- A4 s7 o6 T+ s3 [+ a+ B" m/ {#make
' z$ } D! R- b# P8 ~! p#make install
]8 E1 X: z4 K# cp -R etc /usr/local/etc/radiusclient
$ }% F( W; B+ s0 J3 D& G下面选项在使用radius验证时开启.需要注释掉local" m4 p7 t" P W
#vim /etc/ppp/options.pptpd5 i, J$ c1 l8 ~! `$ o6 T
plugin /usr/local/lib/pppd/2.4.4/radius.so //必须先加载radius验证模块,再加载radattr.so
- G, i+ M' c% G" [. fplugin /usr/local/lib/pppd/2.4.4/radattr.so
8 u! Y. q: ]6 n- X#cd /usr/local/radiusclient
& Y! e7 M3 X7 a* c2 w7 G: u1 T) c#vim radiusclient.conf 编辑如下两行
. p/ m( o) B$ j& q5 |- Bauthserver 127.0.0.1:1812 //radius验证8 c& `" l1 |7 v3 P' o- C6 o
acctserver 127.0.0.1:1813 //radius计费# t! c, n( P( o* A8 j) J( l4 ]
# vim servers
/ p& s& ~0 o7 E% l' R, u% R0 Z' ]; b#Server Name or Client/Server pair Key* f, k8 z! `7 F
#---------------- ---------------+ O5 r8 Y" h; z4 P3 q2 `
#portmaster.elemental.net hardlyasecret
1 }' E: t7 q+ E0 R7 C8 G8 Z. x#portmaster2.elemental.net donttellanyone$ i, U! B3 k1 x& L& d1 ?$ C' S
127.0.0.1 testing1233 u& C0 E" I8 ~( F" N6 |5 C# `3 q
重启pptpd: service pptpd restart8 X" K) c% B7 c' \+ ~
五、带宽限制
+ _: P+ S( I7 c使用radius传回限速信息对客户端限速9 ^' d. ?# Z$ |, A$ i
基本原理,radius根据数据库里面的限速字段的属性,下发给PPTP服务器,服务器再根据接收到的限速字段属性来限制用户带宽。
E* E, C, L+ j: r% K: }由于Linux的PPTP 限速字段不在radius默认的列表中,需要手动添加该字段。8 t6 n$ p6 g4 q0 A; h$ g
PPTP服务器:
4 D/ m+ q7 D' @( _" M+ a; D/ Y4 r#cd /usr/local/etc/radiusclient
( z5 y- u, ?* }8 `' B#vim dictionary 添加如下两行 Y" ?- j% ]/ G+ Z) l7 H
ATTRIBUTE PPPD-Upstream-Speed-Limit 230 integer
& ^9 c9 M% x! a* L+ E/ sATTRIBUTE PPPD-Downstream-Speed-Limit 231 integer
5 r+ ~4 n+ F/ q/ h' O7 E同样也需要在radius的dictionary中添加这两行。具体位置/usr/local/etc/raddb/9 u7 n8 O- @; W$ ]5 u1 h" ?
还需要在数据库中加入:
& e7 l4 a3 O* u! A- iINSERT INTO `radgroupreply` VALUES (8,'test','PPPD-Upstream-Speed-Limit','=','512');
+ y! c( f5 W8 O9 \4 P+ Y) aINSERT INTO `radgroupreply` VALUES (9,'test','PPPD-Downstream-Speed-Limit','=','512');* y: N7 w8 r5 y5 P' U
512是限制的带宽,单位是kbps
6 S% T0 [' U# q) j最后需要在/etc/ppp/目录下添加一个本地脚本,用TC来限制带宽:: M% o5 l$ M# B7 h
脚本内容如下:7 t1 o1 y7 [/ Q
#cat ip-up.local //注意。该脚本必须要有可执行权限。7 R0 H+ J+ K9 h+ j2 a
#!/bin/bash
* r+ x9 |$ @7 t. mPATH=/sbin:/usr/sbin:/bin:/usr/bin6 L. g( ]3 V& ?1 Y% D9 L; o! a- s
export PATH7 U$ u; y( Q `; r& i3 E
# Get the attrbute from radius reply. A6 T$ _# a0 g! B$ J
if [ -f /var/run/radattr. $1 ]
+ |# X$ u, g& ~; W1 ?then, H. D% }& Y/ C3 ?8 {7 a
DOWNSPEED=`/bin/awk '/PPPD-Downstream-Speed-Limit/ {print $2}' /var/run/radattr. $1`
% E' v0 G' Y, N0 s6 P UPSPEED=`/bin/awk '/PPPD-Upstream-Speed-Limit/ {print $2}' /var/run/radattr. $1`/ K, K8 \; \* ?; Z9 r( C9 K* t
fi. V h! i/ L% S1 D
# End
5 q/ b/ y" a8 P* }# Start Bandwidth Limit! ?# a6 c/ l- b
/sbin/tc qdisc del dev $1 root > /dev/null( R# T1 q8 g! _( O: f- ~
/sbin/tc qdisc del dev $1 ingress > /dev/null5 }6 s/ h5 ]- |
##### speed server->client
% s# w- w# ?% H$ C0 w. \ if [ "$DOWNSPEED" != "0" ] ;
) [: r: n8 X+ y/ h1 J8 n! d then6 F3 p) A' g$ x7 _" ~! i) J5 r7 b. M
/sbin/tc qdisc add dev $1 root handle 1: htb default 20 r2q 1
, W! x r6 { E# |# Y N /sbin/tc class add dev $1 parent 1: classid 1:1 htb rate ${DOWNSPEED}kbit burst 4k
8 F$ m# s" \/ ~. j1 `/ O5 @. h) A. Q" W /sbin/tc class add dev $1 parent 1:1 classid 1:10 htb rate ${DOWNSPEED}kbit burst 4k prio 1
9 B6 O; z$ p" @1 K6 d6 S2 r7 z /sbin/tc class add dev $1 parent 1:1 classid 1:20 htb rate ${DOWNSPEED}kbit burst 4k prio 20 T! \) c$ Q3 ]& G- v0 q* T; v
/sbin/tc qdisc add dev $1 parent 1:10 handle 10: sfq perturb 10 quantum 15009 {# c1 V$ a0 b9 j
/sbin/tc qdisc add dev $1 parent 1:20 handle 20: sfq perturb 10 quantum 1500! y( w" b0 C4 n4 e1 L; R
/sbin/tc filter add dev $1 parent 1:0 protocol ip prio 10 u32 match ip tos 0x10 0xff flowid 1:10
w8 b4 b9 G- { /sbin/tc filter add dev $1 parent 1:0 protocol ip prio 10 u32 match ip protocol 1 0xff flowid 1:10
7 v+ J5 P% ^2 }6 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
1 w, J* d# ^: g9 t& h+ {$ G0xff at 33 flowid 1:10
6 G5 G/ F' a% a4 b$ F3 c! X0 [6 Q fi
3 ~$ K: L' C+ ? O! x##### speed client->server
$ W6 e1 M8 H5 j+ i0 V8 q0 Z if [ "$UPSPEED" != "0" ] ;3 M' P+ N5 K) H* m5 O5 u3 i
then
1 B6 v9 k$ K' v2 N7 l; [3 y; [6 | /sbin/tc qdisc add dev $1 handle ffff: ingress( T& L8 Q, Q: @" `' P: q4 O
/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
8 p: T+ G7 @9 q8 D2 l fi- Q5 `- J! r8 m$ m
# End3 {: k% s9 ^- V0 H! ~
六、 系统优化
/ r7 v6 e" `5 F& I" q最后再做一些简单的系统优化,以满足较大的网络流量/ J+ r, N, B. t2 w& w+ n( x
net.ipv4.ip_forward = 1( d) T. Y& h2 h" q3 P
net.ipv4.conf.default.rp_filter = 11 D) q& i. b9 k) ?2 w. q5 C
net.ipv4.conf.default.accept_source_route = 05 x3 V* V Y% `0 \) u2 G' u
kernel.sysrq = 0
, ^0 O* p7 g& G0 s0 q5 nkernel.core_uses_pid = 1
: w! }6 E$ t9 U, l4 V2 mnet.ipv4.tcp_syncookies = 16 U7 U' ~& ?- o/ g
kernel.msgmnb = 65536; \; L# g' Q8 a7 C
kernel.msgmax = 65536# Z& B0 s* C! o
kernel.shmmax = 42949672956 M) z( w* y9 v! H5 K* S
kernel.shmall = 268435456
% g' H3 j! @; V% }net.core.rmem_max = 12582912; h& J6 p* T7 R0 ?; n
net.core.rmem_max = 125829121 X% j& u3 r) M
net.ipv4.tcp_rmem = 10240 87380 12582912
1 s! @4 p. L. J7 Hnet.ipv4.tcp_wmem = 10240 87380 12582912+ u+ X6 E- }! W, z: s9 x7 o
net.ipv4.tcp_no_metrics_save = 1
4 L. k3 ]% e& Bnet.core.netdev_max_backlog = 5000
2 r2 F* S$ o$ t1 g) ^如果想要对拨入用户做NAT,可以使用IPTABLES做
' g7 j3 ]9 O" ]5 ~/ M5 \#iptables -t nat -A POSTROUTING -j MASQUERADE
' I! `2 P5 m' V% K+ L9 D( r5 l' o! @; k- r/ k
4 g6 n% G% c# N* s+ i8 G9 H1 o" M" w" E# Q
% M4 `: ~ ]. I. ?; z9 R4 J1 e9 ?$ J
+ X+ X+ R0 a6 ]* L6 a" \ n. B& J6 a
5 D" q& W9 l7 q0 |# J " r# ?. j$ |$ h3 \: K
9 E: p" n! F4 f/ J! j# z
|
|