TA的每日心情 | 开心 2016-5-12 14:23 |
---|
签到天数: 2 天 [LV.1]初来乍到
|
一、 软件需求:
. o) w% f& u9 epptpd-1.3.4、ppp-2.4.4、Apache、MySQL、freeradius(freeradius.org)
3 j. I0 U& y; y' h: ]二、 安装PPTP: L- q9 ?0 O9 c( u& }9 \0 J; h
1、操作系统使用RHEL5或者CENTOS5,内核版本为: 2.6.18-164.el5, 内核已支持MPPE,不用再安装。5 g4 B' Y- d/ N, L' b$ i) [2 k+ M
使用RPM方式安装pptpd和pppd
* h; b6 p1 W1 e$ I. Qrpm -ivh pptpd-1.3.4-.rhel5.1.i386.rpm
5 w7 f' b u0 } v2 q" Lrpm -ivh ppp-2.4.4-2.el5.1.i386.rpm5 A5 L3 w2 v$ A% N& \# n! s
2、修改/etc/pptpd.conf主配置文件:
Y$ q, f0 e& m& h; F$ Idebug 开启debug,方便检查错误。! w, H- v! W; x; P. u2 W. P
ppp /usr/sbin/pppd pppd程序位置
6 s- n* H w3 ^6 {option /etc/ppp/options.pptpd pptpd的参数配置文件 R- y7 z* B1 z
localip 172.16.10.1 服务器的IP地址0 W# g( E2 m, d/ c! u- W3 P4 ~1 D
remoteip 172.16.10.2-150 分配给客户端的IP地址池, u3 ?# S; T& W$ L$ f; z# x
3、修改/etc/ppp/options.pptpd
; @# M% k2 _8 ?# Q0 O: }7 _lock
4 x. W+ j# h4 U5 F( K, Z; H* o! \9 `debug% e1 R- b$ `: W
dump9 [0 X: R8 K* b
logfd 2
4 |4 U# o. [' W* |$ r( J$ x, Blogfile /var/log/pptpd.log) ~4 D8 w9 v, [# f6 K
name pptpd
4 N7 J8 D! k6 T5 i" g( dmtu 1450# N1 S. q( ^$ N# G) U, ]' o( i
mru 14509 j2 m8 ]4 `, @% p3 _ U' o* L
proxyarp( e- X7 O: T% a0 ^
auth
' n" p* B9 l+ J! G; j5 \$ U4 w1 cplugin /usr/local/lib/pppd/2.4.4/radius.so radius模块,若不需要radius可以注释掉
( @* j. b C8 x/ E, O A9 k9 t/ G! ~plugin /usr/local/lib/pppd/2.4.4/radattr.so radius属性模块
M8 c( I, u: d: C$ Inobsdcomp
- v9 F$ t/ J' k8 ~: T/ I% E- }ipcp-accept-local
2 w, s' u L3 }$ Mipcp-accept-remote V j3 H: P) \
lcp-echo-failure 3
8 @7 X# I5 v( V1 V6 a) ]5 k9 dlcp-echo-interval 5
, g) z6 c* b+ ^9 trefuse-pap
" I( c9 V. Y' K! ^refuse-chap/ L) T& O! o8 V Z: P+ K/ p6 L
refuse-mschap
* V W- M6 S) {9 Q" S0 u% I' O3 E2 Xrefuse-eap) w! e' U3 w+ p) a& \
require-mschap-v2
7 ~: q7 `8 P( t/ Hmultilink: U/ u, ^( Y; \8 l9 Z6 ?
require-mppe
( |( }6 y$ ?4 q9 I4 u( `( K2 h7 Yms-dns 202.98.96.68 客户端的DNS地址% [' V, V1 M3 L( u
ms-dns 61.139.2.69
: T/ K" w) U: K3 V* c! r4、启动PPTP
1 M: R0 {) E# R4 P使用service pptpd start启动服务* m* e2 a+ U4 X* V
使用chkconfig pptpd on 使重启生效' u% P8 t8 b6 q) v8 p
5、添加测试用户/etc/ppp/chap-secrets
: j7 c5 x& o7 ~, v0 }4 P" g8 x/ g 4 X0 S" k* L b. A) a7 V
# Secrets for authentication using CHAP
; B' a, H; g8 r9 C" u# client server secret IP addresses ; L/ N. H( u) P! g
test pptpd test *
3 q: Z" ^4 Q) W. @ 6、客户端设置
/ J$ l4 Y% ]- Z 在windows XP上创建vpn连接,并测试(略):
Z8 W% S! ^9 Y& ^1 w+ R0 W三、 RADIUS与MYSQL安装:
( j4 L( X+ r9 C6 [1、 安装与配置MySQL
9 g7 t ~' ?* L# j6 D使用yum方式安装MYSQL、php、Apache! x& M$ U& f+ u7 X7 y
启动MySQL:service mysqld start7 S6 b5 k- q: U; d3 _8 x
更改MySQL的root用户的密码0 h' a2 S/ T( @
# mysqladmin -u root -p password youpass
9 i6 |- s! |7 } n: w8 G9 Y; D, C1 ]#mysql -uroot -p youpass" W' e8 \5 k8 ~2 s% q+ _- G w
>create database radius; 创建一个名为radius的数据库9 F( `4 r) S/ A
>exit
& B/ w7 T6 a" X& M/ o+ [; |- x#chkconfig mysqld on 随系统启动
4 _1 |9 R" i3 _% \2、 radius安装- x3 ^5 n" T8 @/ [
从http://freeradius.org/ 获取 freeradius-server-2.1.7.tar.bz2: c* ?" p4 E) f1 E: Y3 v
#tar -xvf freeradius-server-2.1.7.tar.bz2
7 V- n' X6 d- @8 c* a1 Z; M#cd freeradius-server-2.1.71 l# h6 i, L) D
#./configure
- _- ]# s8 O9 K; @! F. j#make
; z5 S0 O( c+ x; L; |#make install; u: @4 i. {# d+ R3 `
#radiusd -X 使用debug模式运行radius
3 n; o. v6 Q/ }( b0 {如果看到 "Ready to process requests."表示安装成功。
+ |" I6 ?% g7 `( y: n" U e" a' b) Q3、修改freeradius支持MySQL。. V! u, T2 s! q, s* L+ d; d1 d5 c- D0 j& V
#cd /usr/local/etc/raddb/sites-available
) _) h$ n9 j6 I9 v- L2 v; \编辑default文件,把里面所有sql前面的#去掉。
: {9 h1 y4 |! D. j; V, K- s# cd /usr/local/radius/etc/raddb/
% H4 [( p4 P( j5 r# Z7 E% \8 {编辑radiusd.conf,去掉$INCLUDE sql.conf前面的#" W+ s; b; V% y) |8 C, n
编辑sql.conf,
! k, J" N- b5 _8 v9 O1 K' V, h$ Q7 J # Connection info:
5 _3 O" I; S) v# a6 v2 I. o# f server = "localhost"
% y& Q( H! [" ?/ F5 J #port = 3306
f* `, a( s# ^! `1 T7 W login = "root"' f" T2 V. E+ [5 V3 k
password = "youpass"
- Z5 {- f/ m# A3 m* l0 ]向mysql导入radius所需的数据库文件
0 h: g0 C5 `) O* V* Z#cd /usr/local/etc/raddb/sql/mysql
- {# c; Z5 f& E' H# mysql -uroot -p radius < schema.sql
' ~) }3 Y- t( H" ?, L( I再用debug模式运行freeradius.9 Q/ @" C$ m0 Y1 |: c+ E; [4 t! t
# /usr/local/sbin/radiusd -X8 z6 {3 n0 q4 h" ~% b3 I: T
有可能会出现' o/ G' \2 s3 g) L' o$ y) P" [
/usr/local/etc/raddb/sites-enabled/default[159]: Failed to find module "sql".
8 j6 a- e# S& _8 u1 f; k5 P0 X/ d; z9 Bradius没有找到驱动去连接mysql。% [1 y3 F5 T f8 O
编译rlm_sql_mysql.so驱动- d, g4 v5 X* x- C- T, P. r2 _
#cd freeradius-server-2.1.7/src/modules/rlm_sql/drivers/rlm_sql_mysql
* {# g$ m' E, Y! @( X% }+ W* X#./configure;make;make install& w8 y6 b2 N; A' p( I" B/ F
这个时候驱动会安装到/usr/local/lib目录下面,要把驱动复制到/usr/lib目录下0 ]" e _$ J; e. L/ ]7 f {# x
#cp /usr/local/lib/rlm_sql_mysql* /usr/lib4 W3 B! j6 v7 Q0 L0 P. k& \
接下来在数据库中添加测试用的用户, b! N) E; N/ r- M' y, n
#mysql -uroot -p radius
1 i) ~+ D# G. j1 l7 H> INSERT INTO `radusergroup` (`username`,`groupname`,`priority`) VALUES ('','test',1);
% F5 m5 h @: L5 h> INSERT INTO `radusergroup` (`username`,`groupname`,`priority`) VALUES ('test','test',1);
1 Z" J5 ]- k7 y+ c> INSERT INTO `radcheck` (`id`,`username`,`attribute`,`op`,`value`) VALUES (1,'test','User-Password',':=','test');3 m3 O4 ?- f* l; l
测试刚刚添加的用户能不能通过验证:
; g) R. Z% b9 Y5 I% Q6 F9 G同时开两个窗口,运行#radiusd -X& h8 T1 E: L1 R, r5 u
另一个窗口运行:#radtest freebsd freebsd localhost 0 testing123
" ^4 P7 K/ _( B2 N+ F如果看到:"rad_recv:Access-Accept packet from host 127.0.0.1 ……",就已经成功了。
6 s! K' B1 r4 e7 k4、 使用web界面管理radius用户8 P, s8 B- c1 V: b) W; q. H0 i
#cp -R ~/freeradius-server-2.1.7/dialup_admin /usr/local/
0 l) f. _9 S, x& i2 n! I #ln -s /usr/local/dialup_admin /var/www/html/dialup_admin( O( p* H5 y8 k- d2 N! U7 m3 L
#cd /var/www/html/dialup_admin/conf; @; ~; [7 f. l" _& }
编辑admin.conf,修改如下内容
# ]: Y- n" D- z3 b $ L' p! S+ b$ s0 D
general_encryption_method: clear
: K! J; i- E8 Nsql_type: mysql% }+ b1 T0 Z9 e$ d3 r" I U
sql_server: localhost
/ y) S2 v' I" K2 |. G( R" S( \1 xsql_port: 3306
4 j0 O/ Z4 V; m8 S! i) Q( d2 P6 Nsql_username: root9 N' P7 z) G- m1 _; m
sql_password: youpass
# K& C# @8 |2 X3 y4 Gsql_database: radius
9 {) }" M# E: O( u/ y( @2 n( Bsql_usergroup_table: radusergroup( `4 ^: F3 O- e4 z( n* T
# sql_debug: true u/ P% f1 ]4 M' b# b) g
配置Apache `8 a( O# r7 g
修改:/etc/httpd/conf.d/php.conf
* B( l$ w3 M8 H8 Q, g5 CAddHandler php5-script .php .php3
7 T0 S, v, h, X) y修改:/etc/httpd/conf/httpd.conf: J8 [& C$ z& M/ n
<Directory "/var/www/html/dialup_admin/htdocs">
( Z& l6 X' u% k2 t0 \启动apache:
# e! g: d# O4 v) ]#service httpd start1 [; W, p0 d4 ~: l0 d
#chkconfig httpd on0 r; }7 \9 {8 l9 C) H
打开浏览器就可以管理radius的用户了。
4 y* f* ~ q. s1 J$ z四、 使用radius验证pptpd用户 _# u! V6 K* P" E7 n3 R
使用radius验证用户,需要安装radius模块,: O- q5 x. |% O1 G
下载ppp-2.4.4.tar.gz源代码
' A7 ~* T& l5 d6 c) ~, J C: ?; U4 Y# tar -xvf ppp-2.4.4.tar.gz* R# B T" x) X+ W5 Y/ ]
# cd ppp-2.4.4
3 p# K% R- [# L1 U( ~" J) S' x/ P: A# ./configure //注意不要在这个地方编译安装。. U+ J* J3 ^( \; Q v: G; M) X
#cd pppd/plugins/radius L. w' ]: n5 h3 s1 o& r0 Z
#make
2 j( h- B1 o$ {8 g1 s: T7 l1 O#make install
2 {, \0 z* t4 B+ J$ K1 E3 J+ p# cp -R etc /usr/local/etc/radiusclient; S' h/ T* ?) T0 W
下面选项在使用radius验证时开启.需要注释掉local! q, R/ k& H% Z; p
#vim /etc/ppp/options.pptpd; p( ]/ W7 ^3 m
plugin /usr/local/lib/pppd/2.4.4/radius.so //必须先加载radius验证模块,再加载radattr.so
0 l# l g. P* ~! d- l2 Q! w4 pplugin /usr/local/lib/pppd/2.4.4/radattr.so
5 o1 ]& K" p, \$ {3 }$ [; k#cd /usr/local/radiusclient6 q" O4 _2 v4 }: F
#vim radiusclient.conf 编辑如下两行
/ B* R8 E/ f9 Y Y" E0 iauthserver 127.0.0.1:1812 //radius验证; g( ?& V5 q7 g0 a- z+ _
acctserver 127.0.0.1:1813 //radius计费" O4 X+ D5 l+ r5 _
# vim servers
4 V: U+ f1 g6 P# j% w5 I- q#Server Name or Client/Server pair Key
L% I7 g' A1 B3 V4 z+ u1 R#---------------- ---------------
# {+ {# d- l% e1 |: g& R#portmaster.elemental.net hardlyasecret% B( ]6 K8 y: E
#portmaster2.elemental.net donttellanyone
. g6 e0 I, D- P127.0.0.1 testing123& Z+ K( B' B3 c* P4 U) X. q: x/ Z' f
重启pptpd: service pptpd restart
) Y0 {5 e+ M4 n0 e五、带宽限制
4 I- _6 c7 W' B% c) {+ O) t使用radius传回限速信息对客户端限速: ?$ q- b! W! X( M& b) S
基本原理,radius根据数据库里面的限速字段的属性,下发给PPTP服务器,服务器再根据接收到的限速字段属性来限制用户带宽。
+ x0 P& e6 L- d5 f) M" O+ H由于Linux的PPTP 限速字段不在radius默认的列表中,需要手动添加该字段。
M% i# o' i p9 B8 |0 i3 p# ] C; ~PPTP服务器:
" V, o2 E9 ^! K& m( o, p1 [2 J#cd /usr/local/etc/radiusclient
7 Z) z! V5 Z+ l% Z#vim dictionary 添加如下两行
# ^6 ]7 ~; L. E' BATTRIBUTE PPPD-Upstream-Speed-Limit 230 integer$ C, d6 A/ W) j* G! @+ H
ATTRIBUTE PPPD-Downstream-Speed-Limit 231 integer" g2 l* A) @0 p" W; P
同样也需要在radius的dictionary中添加这两行。具体位置/usr/local/etc/raddb/
% e8 c9 j. b! Q' Q还需要在数据库中加入:
6 V: O) s H9 ^4 K9 eINSERT INTO `radgroupreply` VALUES (8,'test','PPPD-Upstream-Speed-Limit','=','512');
4 B8 m. B/ E" k) c- ?; ?INSERT INTO `radgroupreply` VALUES (9,'test','PPPD-Downstream-Speed-Limit','=','512');8 c" p+ `" o) O9 n
512是限制的带宽,单位是kbps
3 V9 [! \0 b! E# A9 C最后需要在/etc/ppp/目录下添加一个本地脚本,用TC来限制带宽:6 R# c. d( J. e9 F
脚本内容如下:
. [- f' G, r9 ^; h- |, @% d- u# S#cat ip-up.local //注意。该脚本必须要有可执行权限。
7 \* J( o7 F& I# x& r#!/bin/bash
9 |- A, X- x F7 xPATH=/sbin:/usr/sbin:/bin:/usr/bin
\2 E! N( ]6 l2 G1 M& H) Vexport PATH6 H* A7 T: ^! A/ c
# Get the attrbute from radius reply
& x3 [ b% @: |- jif [ -f /var/run/radattr. $1 ]& Y0 j* H9 \& I( p
then+ c; k1 I7 u& ?
DOWNSPEED=`/bin/awk '/PPPD-Downstream-Speed-Limit/ {print $2}' /var/run/radattr. $1`
% w* v+ d$ p- @5 O/ e3 W UPSPEED=`/bin/awk '/PPPD-Upstream-Speed-Limit/ {print $2}' /var/run/radattr. $1`
$ s" `4 g) J& }" _$ K7 Q# ofi* U1 A* e/ |. X
# End
0 e# N* l' |- {, \7 k8 z% V# ^# Start Bandwidth Limit/ A1 Q1 s7 a! O% O, ]# i
/sbin/tc qdisc del dev $1 root > /dev/null
' u0 Q' d" t2 k! n5 V/ I, H /sbin/tc qdisc del dev $1 ingress > /dev/null7 q; t2 a) _/ N2 E
##### speed server->client
; u( X; G; R# P ? P! e if [ "$DOWNSPEED" != "0" ] ;8 z4 A% {. p3 ~- G2 \2 `$ [
then) J! v7 q S8 A1 z. v& Q
/sbin/tc qdisc add dev $1 root handle 1: htb default 20 r2q 1" R! V9 l# E# E6 e* R9 C# \
/sbin/tc class add dev $1 parent 1: classid 1:1 htb rate ${DOWNSPEED}kbit burst 4k
: N+ X2 v2 g+ E6 s4 g- w* U% \ /sbin/tc class add dev $1 parent 1:1 classid 1:10 htb rate ${DOWNSPEED}kbit burst 4k prio 1
7 U0 i% m. q3 B. D" `1 i /sbin/tc class add dev $1 parent 1:1 classid 1:20 htb rate ${DOWNSPEED}kbit burst 4k prio 2: Z6 g7 p8 G d5 R2 ]& @) j
/sbin/tc qdisc add dev $1 parent 1:10 handle 10: sfq perturb 10 quantum 1500% d+ t9 ^" V O' l# X: w4 L
/sbin/tc qdisc add dev $1 parent 1:20 handle 20: sfq perturb 10 quantum 15003 T# r" ~* M, k4 l
/sbin/tc filter add dev $1 parent 1:0 protocol ip prio 10 u32 match ip tos 0x10 0xff flowid 1:10
8 ]; Z2 c& ?) J- l; B! O! x /sbin/tc filter add dev $1 parent 1:0 protocol ip prio 10 u32 match ip protocol 1 0xff flowid 1:10
& K2 G! G) t# k+ y- V4 d7 | /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( _, |# `5 e' \7 j! v
0xff at 33 flowid 1:10( |3 A6 O6 g" u _% w0 Q
fi2 q# G4 g) }+ T$ ]" r, r
##### speed client->server
, i9 I* Z2 s& Y5 [ if [ "$UPSPEED" != "0" ] ;
6 P! n- R \- R B: G then
# @% r, t& s6 \; P; U /sbin/tc qdisc add dev $1 handle ffff: ingress
u4 n5 _1 W' v, v/ S* M2 {" o9 I /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
' [; `4 r8 g9 a1 H* y' b! s fi
; \# z, j$ h; M# End
5 A6 u$ }! p: g4 O3 ]. H六、 系统优化
7 I2 g- O2 J' d6 s7 ]最后再做一些简单的系统优化,以满足较大的网络流量4 W* y+ S( i3 e
net.ipv4.ip_forward = 1
% m! R# x" H' x7 dnet.ipv4.conf.default.rp_filter = 1" C# S6 S4 ]# K& C
net.ipv4.conf.default.accept_source_route = 0+ F' h) x% V6 F: d
kernel.sysrq = 02 O% w" k/ _& [2 ~, \% ]
kernel.core_uses_pid = 10 I4 V# c! y7 }8 c
net.ipv4.tcp_syncookies = 1
+ {) u$ {; y& _ @) t* Z. n/ t' |( ]kernel.msgmnb = 65536+ e7 L! ]: U! O! V7 [7 h$ _
kernel.msgmax = 65536) M! e- q* q; N2 ? U% N% ?, b! t
kernel.shmmax = 42949672952 v- u( ~% H9 g' r# ]5 X
kernel.shmall = 268435456
8 g7 S4 j7 p3 M; q* c6 {- Wnet.core.rmem_max = 12582912
! _3 j7 v6 x( x7 q/ I5 enet.core.rmem_max = 12582912: j! T9 l& V2 l( q! P# m
net.ipv4.tcp_rmem = 10240 87380 12582912
1 e5 {( `5 x5 O$ {' l4 p/ mnet.ipv4.tcp_wmem = 10240 87380 12582912$ y: J9 K6 M/ E% I
net.ipv4.tcp_no_metrics_save = 1& J. _# U+ l6 s# K' h
net.core.netdev_max_backlog = 50004 {! o: J' N3 T0 p9 Q8 E
如果想要对拨入用户做NAT,可以使用IPTABLES做' P( K, {0 j& U# x3 t2 O
#iptables -t nat -A POSTROUTING -j MASQUERADE
4 |9 |0 k$ F: l1 s# V8 G
- Z1 o$ e7 G, W
% L! a: t3 T) @1 O8 k3 k* @) j' Z9 \& _) H8 D' [
) r9 f: t+ R/ }$ Y# K0 b( y* O9 v# ~7 h# d( w: q
& B- V0 y8 ^7 r0 I
, F7 t- X0 ?; K+ C: f3 b' s- w
% k0 C0 Z% _& \' I 0 }, M1 O( _1 I8 H4 s
( V) q3 k7 P7 D* ^/ v! G0 i |
|