TA的每日心情 | 开心 2016-5-12 14:23 |
---|
签到天数: 2 天 [LV.1]初来乍到
|
一、 软件需求:
5 N4 M/ b5 d; Q) v6 k* m- I* xpptpd-1.3.4、ppp-2.4.4、Apache、MySQL、freeradius(freeradius.org)
& A8 X0 ]$ B- S; @% K3 t/ ~二、 安装PPTP7 D* z9 b+ Z+ `# A) R
1、操作系统使用RHEL5或者CENTOS5,内核版本为: 2.6.18-164.el5, 内核已支持MPPE,不用再安装。
0 ~/ ]: k$ A7 y) `, j使用RPM方式安装pptpd和pppd# X- N( X: u5 g
rpm -ivh pptpd-1.3.4-.rhel5.1.i386.rpm, [ z* d& W" [
rpm -ivh ppp-2.4.4-2.el5.1.i386.rpm
5 R- h- X$ s1 z2、修改/etc/pptpd.conf主配置文件:
$ N( }# |6 x [, N7 jdebug 开启debug,方便检查错误。6 L- C# U5 k, A
ppp /usr/sbin/pppd pppd程序位置# _3 w+ k. X5 p. o
option /etc/ppp/options.pptpd pptpd的参数配置文件& `8 `3 I& W! y: n/ a8 j
localip 172.16.10.1 服务器的IP地址
* ?# X7 Y, Z% j$ y- z* Dremoteip 172.16.10.2-150 分配给客户端的IP地址池9 ~, J2 d: ]9 z) \" \
3、修改/etc/ppp/options.pptpd% c* H8 t, O! t' v. _* x
lock
. P% Z$ k: T' B3 @debug- M- \ J5 G2 a# L9 o" f- @
dump4 w: l1 a& r* y+ h; g- e9 t, r
logfd 2
: z4 ? p. t% D& T5 r% Blogfile /var/log/pptpd.log
8 b' f5 `0 r$ i$ r/ cname pptpd8 l% W7 A. ]! Q
mtu 1450/ x5 T U2 M% U/ Q) q
mru 1450
1 Z0 Y% O$ X2 d. n* yproxyarp
) n5 d8 M0 x, ?6 A* V8 R+ q$ Tauth( }4 ], x h! i: O; @2 v
plugin /usr/local/lib/pppd/2.4.4/radius.so radius模块,若不需要radius可以注释掉& h1 A+ E# J5 | S7 y) O5 v
plugin /usr/local/lib/pppd/2.4.4/radattr.so radius属性模块% ^$ H0 V, S: v* c
nobsdcomp
C, b2 e/ p9 d8 K E/ H1 K4 cipcp-accept-local
2 i3 J+ Z( D! mipcp-accept-remote
2 ^; _7 |/ d9 ^" \lcp-echo-failure 3, C* f) j7 h x% R7 S. v
lcp-echo-interval 5
$ Z, Y9 }# J# crefuse-pap
6 V7 Y9 Y1 ?/ h2 _- Lrefuse-chap7 |' G0 {8 F6 t1 }
refuse-mschap
# b0 o% [3 M* T8 n4 Crefuse-eap, P$ ?! p, Q: v+ f% w
require-mschap-v2) \& J/ z6 a! B) Z2 g: x: f
multilink
+ I3 q( n# j* grequire-mppe4 K& T* A& X7 q6 Z: ?) U# }
ms-dns 202.98.96.68 客户端的DNS地址3 s5 W. a. a+ D# C$ [3 M0 b
ms-dns 61.139.2.69, l* n1 J5 M' W2 G
4、启动PPTP N+ D' a& O r# l! b# X
使用service pptpd start启动服务! w5 i3 n0 n' W3 M, X9 p+ D
使用chkconfig pptpd on 使重启生效
) j! W8 E1 @7 G8 w0 U; Y7 o) A( @" A& V 5、添加测试用户/etc/ppp/chap-secrets2 Y. u3 P) F7 s7 D6 j
! h) k0 x7 C9 E9 v! H& l6 ~5 X# Secrets for authentication using CHAP
& r% e& {: C- f/ H* p6 W$ B, ~# client server secret IP addresses / a, l" b" ~& D/ V" o
test pptpd test *
8 R0 v6 g6 A" x1 o 6、客户端设置; m1 N- K0 K$ T& t) q0 h
在windows XP上创建vpn连接,并测试(略):; Z7 R; I* j$ B+ d
三、 RADIUS与MYSQL安装:
3 ? n0 g' A6 Y' l1、 安装与配置MySQL* Q. c* u& Q; n
使用yum方式安装MYSQL、php、Apache
0 \# x- ^4 Z! F$ k4 b0 X4 C 启动MySQL:service mysqld start. o9 Z8 {$ T( F
更改MySQL的root用户的密码
% L, s% f2 ~( w4 I# mysqladmin -u root -p password youpass) c+ d- P. g* _& D4 ^& a2 x
#mysql -uroot -p youpass5 M6 y1 v9 v- t
>create database radius; 创建一个名为radius的数据库8 S# |; g' N; J. u( m' ^9 U
>exit- u1 k; b" M5 ^
#chkconfig mysqld on 随系统启动, \+ z) ?. z+ a$ W! _, C
2、 radius安装# X0 f! ?* G& k' Y
从http://freeradius.org/ 获取 freeradius-server-2.1.7.tar.bz22 s- q* m: x8 [* ^ V3 i$ K
#tar -xvf freeradius-server-2.1.7.tar.bz2$ h9 h; {& B; B* q4 p% O
#cd freeradius-server-2.1.7
$ J7 F1 F x H' p#./configure! C# t" _) X+ X7 ]6 L h2 L
#make9 O% ?+ _* D( o$ w' c' h
#make install
& [9 {, C3 d9 i5 e3 i#radiusd -X 使用debug模式运行radius
/ [* D1 D* o0 {6 j如果看到 "Ready to process requests."表示安装成功。 N- B5 V. j- y8 Y+ _' `
3、修改freeradius支持MySQL。& U9 E; u' l) `1 m
#cd /usr/local/etc/raddb/sites-available* x# M# Q: O' q: R% ]# t
编辑default文件,把里面所有sql前面的#去掉。
, U$ g# c% |$ V* ]% X* H/ {/ O0 @# cd /usr/local/radius/etc/raddb/# r7 H% P, a, w4 d/ u K' E9 m' `
编辑radiusd.conf,去掉$INCLUDE sql.conf前面的## U- U9 M8 v5 O6 F+ u
编辑sql.conf,. v# c. {6 t; p# r7 B+ s8 h
# Connection info:* m! N A, _8 A3 A. M1 {( u
server = "localhost"
# {1 Q4 _; }9 n* w3 C8 p2 S #port = 33061 j* V& [, ?* G5 E
login = "root"3 W' Z+ n+ T) }+ m2 x0 i
password = "youpass"$ f8 C% k W/ x+ k* y
向mysql导入radius所需的数据库文件
7 k5 u% x2 S0 x- G, } ]#cd /usr/local/etc/raddb/sql/mysql
/ M% v$ V! c2 Z. H9 L+ a# mysql -uroot -p radius < schema.sql- }& L- I6 L) y, @: J- L
再用debug模式运行freeradius.8 d$ r% I, u5 H7 D- @0 Q/ ?
# /usr/local/sbin/radiusd -X
( [- J# I5 A, w3 Z- Q0 D有可能会出现0 n( ?: S \8 Y' N4 ^0 V
/usr/local/etc/raddb/sites-enabled/default[159]: Failed to find module "sql".5 ^/ }. K% A8 A6 `2 e; A% Q
radius没有找到驱动去连接mysql。
2 H' w" X0 r w! U& H" r编译rlm_sql_mysql.so驱动; W' m8 O" X8 I
#cd freeradius-server-2.1.7/src/modules/rlm_sql/drivers/rlm_sql_mysql( ]# @* V+ W7 [8 k
#./configure;make;make install
3 H0 N6 k" Y, e: ]$ Z3 u) j这个时候驱动会安装到/usr/local/lib目录下面,要把驱动复制到/usr/lib目录下
: D% p! k2 ~. a* q: `! ?; v1 n#cp /usr/local/lib/rlm_sql_mysql* /usr/lib
" k* j8 X; b) Y2 M8 P0 f' w接下来在数据库中添加测试用的用户, l' G5 B; G: b9 b/ w7 p% S
#mysql -uroot -p radius
- ]0 f d, s7 r, r1 }> INSERT INTO `radusergroup` (`username`,`groupname`,`priority`) VALUES ('','test',1);
# |4 r" S6 t! k> INSERT INTO `radusergroup` (`username`,`groupname`,`priority`) VALUES ('test','test',1);6 ~+ ? J) v4 _: `0 F
> INSERT INTO `radcheck` (`id`,`username`,`attribute`,`op`,`value`) VALUES (1,'test','User-Password',':=','test');& M- S) {9 g* `) r( k0 R
测试刚刚添加的用户能不能通过验证:% n9 b# a! t" h" R0 g% i! S
同时开两个窗口,运行#radiusd -X
9 r8 I, C1 `9 t1 `3 l2 p9 k0 E另一个窗口运行:#radtest freebsd freebsd localhost 0 testing123" ]3 q0 P5 i: |* A
如果看到:"rad_recv:Access-Accept packet from host 127.0.0.1 ……",就已经成功了。; Y, b" R* C/ F; S5 i% q; g4 g
4、 使用web界面管理radius用户, l5 s( i+ Q$ t! U( ]5 O
#cp -R ~/freeradius-server-2.1.7/dialup_admin /usr/local// u4 U& _0 T% X2 v/ h$ x
#ln -s /usr/local/dialup_admin /var/www/html/dialup_admin5 ~) `5 }- z5 Y! Q- D( ~
#cd /var/www/html/dialup_admin/conf
. t8 V6 _2 C! `6 W4 b& ? 编辑admin.conf,修改如下内容
% w3 Q4 O* y4 \. J + s" \9 U* k7 v7 R. y/ \" k
general_encryption_method: clear1 K) e* G9 x9 X0 n. Y( _
sql_type: mysql, [: c4 ?: J1 R. z
sql_server: localhost+ H$ [& P( V( u5 k! |$ t1 T$ m
sql_port: 3306
! V( K. B2 U9 h* c! a1 zsql_username: root
8 }% A$ L" {2 k3 D5 Psql_password: youpass$ q3 v' _ N$ }! T2 U
sql_database: radius
4 S( g ~6 l4 N2 esql_usergroup_table: radusergroup+ n. I9 D/ L6 z) k" G2 t
# sql_debug: true
7 K( W% W* ]; A4 H- Y配置Apache" N6 C/ R% V; i
修改:/etc/httpd/conf.d/php.conf
9 S/ A" n, b: a4 D& A- a9 XAddHandler php5-script .php .php3
2 O) R# B& e0 N9 X+ G W4 n# ]修改:/etc/httpd/conf/httpd.conf; s5 a$ [4 B# R% F* ^$ I" z0 x
<Directory "/var/www/html/dialup_admin/htdocs">
6 P" O/ t, D& b# |启动apache:, z" X2 q% d3 T( N0 B7 b5 ~. ]" ]
#service httpd start
: T) @7 I2 A, M6 D#chkconfig httpd on
' s( w) {0 `* K& [5 h打开浏览器就可以管理radius的用户了。8 h% I' Z( X# Q: {4 Z
四、 使用radius验证pptpd用户
( H6 \$ ~( R6 K4 h使用radius验证用户,需要安装radius模块,
7 ]% T) J' b6 r9 g+ ]下载ppp-2.4.4.tar.gz源代码: u& | o6 A; k% h1 \
# tar -xvf ppp-2.4.4.tar.gz
9 s& d: A+ e) Q# Q& M6 r# cd ppp-2.4.4 J3 B& {* U( P1 q) y
# ./configure //注意不要在这个地方编译安装。7 o& s* r: V8 s; ], |% q
#cd pppd/plugins/radius
* b1 z4 f$ W6 T: R#make
! Q1 V' L3 S$ {# |#make install
* j, V1 n9 I; z# cp -R etc /usr/local/etc/radiusclient( x4 ]! H, O0 V; B3 I5 k
下面选项在使用radius验证时开启.需要注释掉local
, R: O) r* Y' z: x+ c6 ~#vim /etc/ppp/options.pptpd& b6 V4 K+ P6 P- _: P w) `4 Y. y
plugin /usr/local/lib/pppd/2.4.4/radius.so //必须先加载radius验证模块,再加载radattr.so6 d+ p: W* E" A- g
plugin /usr/local/lib/pppd/2.4.4/radattr.so4 f8 ~- j/ {' ~# i: n1 T0 W
#cd /usr/local/radiusclient
9 _7 P" C. T q2 }- H3 f5 z$ A* |#vim radiusclient.conf 编辑如下两行
! \" [5 i4 ?# ]- g6 Dauthserver 127.0.0.1:1812 //radius验证
7 n8 \6 Y/ ?: {# Y8 jacctserver 127.0.0.1:1813 //radius计费) R* _0 U j9 S V( G5 m
# vim servers i% O1 B! b# ^" {
#Server Name or Client/Server pair Key
( x! W7 M1 \2 Z1 e1 X" ]#---------------- ---------------* c+ Z, t2 V Z/ [) q
#portmaster.elemental.net hardlyasecret
Y. @) ~: ~% }- p S2 s ^#portmaster2.elemental.net donttellanyone
2 h: w; k. F& R9 g; g. t127.0.0.1 testing123
" p- c/ O/ H) Z" }9 t. z- i重启pptpd: service pptpd restart
" K1 M$ K- W. P' {五、带宽限制
Q( U; E2 {+ N# X$ P4 ?使用radius传回限速信息对客户端限速
4 j2 x. W# V9 A0 y8 T$ A2 D基本原理,radius根据数据库里面的限速字段的属性,下发给PPTP服务器,服务器再根据接收到的限速字段属性来限制用户带宽。
$ [( G$ a( {- _7 o( {由于Linux的PPTP 限速字段不在radius默认的列表中,需要手动添加该字段。
+ o5 n1 D0 M# d- H, z3 BPPTP服务器:9 r/ F- Q& e4 i+ v& {
#cd /usr/local/etc/radiusclient
+ n, i; Z, M) l! `#vim dictionary 添加如下两行
& C+ R1 W; ?9 C" A+ w' {* QATTRIBUTE PPPD-Upstream-Speed-Limit 230 integer. p/ m6 n3 P" r3 l# }0 D4 Q# s, d
ATTRIBUTE PPPD-Downstream-Speed-Limit 231 integer- \: d+ k- Z% O# r. j7 S. q
同样也需要在radius的dictionary中添加这两行。具体位置/usr/local/etc/raddb/
, \+ c) u0 h/ Y2 \& u4 T: M4 n. d还需要在数据库中加入:
6 B1 z0 g( E# z( GINSERT INTO `radgroupreply` VALUES (8,'test','PPPD-Upstream-Speed-Limit','=','512');
/ v- A' W2 w3 b# V; r& E$ lINSERT INTO `radgroupreply` VALUES (9,'test','PPPD-Downstream-Speed-Limit','=','512');' }; t$ c8 M& u- |
512是限制的带宽,单位是kbps
+ C( s& F1 B; f! w% n最后需要在/etc/ppp/目录下添加一个本地脚本,用TC来限制带宽:
, y5 }% b1 r# s/ N# Q8 D脚本内容如下:
: ?- B* a$ l* u7 M0 Y- ~) O#cat ip-up.local //注意。该脚本必须要有可执行权限。
' z* x6 C# h0 G# F4 K& K#!/bin/bash
" @' p9 z A2 WPATH=/sbin:/usr/sbin:/bin:/usr/bin6 D2 X; Z! b9 V) B$ f9 y
export PATH
* x0 R1 i* f0 v9 M# Get the attrbute from radius reply9 `/ N g4 Y/ n2 K( \
if [ -f /var/run/radattr. $1 ]* p V& b' A" t& S0 |
then
- R3 D+ I7 f. c$ s; q DOWNSPEED=`/bin/awk '/PPPD-Downstream-Speed-Limit/ {print $2}' /var/run/radattr. $1`5 t# E* Z6 U3 W) f7 a/ b5 c
UPSPEED=`/bin/awk '/PPPD-Upstream-Speed-Limit/ {print $2}' /var/run/radattr. $1`0 A" V; h9 b ?: T( ?* K
fi
5 z, ^7 a8 W2 r c# End
, }. o. K+ u j; V3 d0 K# Start Bandwidth Limit/ ^ q( F' _: Q/ m3 z
/sbin/tc qdisc del dev $1 root > /dev/null
. v2 j- D$ H5 w" k /sbin/tc qdisc del dev $1 ingress > /dev/null
, T0 g2 [% P D2 S/ N##### speed server->client
$ H1 t ?( s" f0 V if [ "$DOWNSPEED" != "0" ] ;/ U7 y* p6 i& W0 A' N! t( y- G A
then
9 L! Q. {" V7 l. }# z /sbin/tc qdisc add dev $1 root handle 1: htb default 20 r2q 1
/ M) v# |2 V2 j/ F6 g# L ]+ h; u. H /sbin/tc class add dev $1 parent 1: classid 1:1 htb rate ${DOWNSPEED}kbit burst 4k9 f u/ H3 j' c) y' i) F E
/sbin/tc class add dev $1 parent 1:1 classid 1:10 htb rate ${DOWNSPEED}kbit burst 4k prio 1
2 p: P; h5 w* y; P- o /sbin/tc class add dev $1 parent 1:1 classid 1:20 htb rate ${DOWNSPEED}kbit burst 4k prio 2( f) F2 ~: E S
/sbin/tc qdisc add dev $1 parent 1:10 handle 10: sfq perturb 10 quantum 1500# p) d9 W7 U9 `" a( m
/sbin/tc qdisc add dev $1 parent 1:20 handle 20: sfq perturb 10 quantum 1500
; z" o! q' ]* e& I: y) g /sbin/tc filter add dev $1 parent 1:0 protocol ip prio 10 u32 match ip tos 0x10 0xff flowid 1:10* ~7 K3 p2 V8 ?2 R
/sbin/tc filter add dev $1 parent 1:0 protocol ip prio 10 u32 match ip protocol 1 0xff flowid 1:10: Q8 u9 A; ?- N, c: \; m) O) J" e
/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 0x107 r2 d9 Q, y) q' d( Q4 k
0xff at 33 flowid 1:10( N3 @0 W* P+ G- j( p
fi
! v9 l2 A9 e# H, u# P. b# V0 b" V##### speed client->server
: ^1 U, O( ]; L if [ "$UPSPEED" != "0" ] ;
: I8 A. s2 Z4 F5 K! P then
* ]4 a1 D9 ^% Z9 a /sbin/tc qdisc add dev $1 handle ffff: ingress
; N7 l; K4 ^: B1 @ L. H /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
5 s" s4 P# ^! h9 P y4 q" C5 E4 e fi5 o3 W/ _0 M9 ]3 P! c" j. C
# End9 ?, c& ]7 i+ L. ?3 Z/ T' ? h( Z
六、 系统优化% N7 ]) p7 D8 M" v& Y
最后再做一些简单的系统优化,以满足较大的网络流量
7 O A9 T1 K8 P qnet.ipv4.ip_forward = 1; A) ^ M% O7 b9 w% p; u
net.ipv4.conf.default.rp_filter = 1
) u: e+ u: b4 ]8 A1 k* x- L7 Xnet.ipv4.conf.default.accept_source_route = 06 u7 o: h, l0 M0 X4 @
kernel.sysrq = 0: B2 P! S+ V. v0 k: \5 u V
kernel.core_uses_pid = 1
. V ?- p9 T+ t8 O/ ynet.ipv4.tcp_syncookies = 14 @# }- J+ \6 w7 \2 _# [$ s& ~
kernel.msgmnb = 65536( p) U. K: {; J3 Q8 l$ v
kernel.msgmax = 65536
2 N2 p! w$ H8 J9 a5 |kernel.shmmax = 4294967295
4 j2 I1 W* R- `7 T- A+ B( A1 S! dkernel.shmall = 268435456
' v# D2 ~/ E, H) o! ^3 a, Gnet.core.rmem_max = 12582912
/ j5 Y0 }# v; O( y+ c. mnet.core.rmem_max = 12582912
% l1 @( p# n4 {4 ^0 q! H" Vnet.ipv4.tcp_rmem = 10240 87380 12582912
1 r$ F9 m7 S3 W/ t7 O8 b" ?# B0 e. nnet.ipv4.tcp_wmem = 10240 87380 12582912
d6 i8 L3 R/ N4 jnet.ipv4.tcp_no_metrics_save = 11 r# T2 c$ {$ @! r
net.core.netdev_max_backlog = 5000
+ D6 a: G4 N8 l$ y$ ]如果想要对拨入用户做NAT,可以使用IPTABLES做* z$ I6 f* |! d$ ?3 U
#iptables -t nat -A POSTROUTING -j MASQUERADE
) n: ?, w; {8 W- u' e
2 b* W. S# N3 B
; q& I" c, s' z1 F" d$ {! t$ d5 k4 M8 B# {( _2 Q
7 s+ u U1 B2 F; L3 W8 q! n
( A6 i) f4 \4 [0 S6 Z. e- k: ?0 a% H3 c% B# z2 Y
% B/ o" u; R3 D7 K& d; f# K |! I6 P9 l" J
" ?+ Z* B T% F* P- P( b, X
! ~7 e# N1 a( I |
|