TA的每日心情 | 开心 2016-5-12 14:23 |
---|
签到天数: 2 天 [LV.1]初来乍到
|
一、 软件需求:' _! R# c! }: f* O
pptpd-1.3.4、ppp-2.4.4、Apache、MySQL、freeradius(freeradius.org)4 y: U# ?: P1 |; h, E$ I
二、 安装PPTP
! i8 W" ]% k8 r) ~4 e: M1、操作系统使用RHEL5或者CENTOS5,内核版本为: 2.6.18-164.el5, 内核已支持MPPE,不用再安装。
! P5 F9 \- z4 n0 m2 B$ X% y4 m( U使用RPM方式安装pptpd和pppd" N7 Q! F* H4 L& p
rpm -ivh pptpd-1.3.4-.rhel5.1.i386.rpm
% o+ ]' M) B# zrpm -ivh ppp-2.4.4-2.el5.1.i386.rpm
( I, W' `, E) F G! Q) y* d- w2、修改/etc/pptpd.conf主配置文件:7 V! _0 o- q9 R2 e8 D( ~
debug 开启debug,方便检查错误。
5 p. W% C$ K; \9 P4 m, Ippp /usr/sbin/pppd pppd程序位置
8 `* V# e( ]! i- {* u! [option /etc/ppp/options.pptpd pptpd的参数配置文件8 F7 s. E# ?" a/ \4 [" T
localip 172.16.10.1 服务器的IP地址; ?% ~; }, V3 {% G4 o
remoteip 172.16.10.2-150 分配给客户端的IP地址池6 E% z) g# e3 g- e1 \
3、修改/etc/ppp/options.pptpd
' G, F! C; L8 y0 T, @8 llock: S. l0 W! t; J
debug
& J1 S; b% A: odump7 g9 r4 V/ {6 o: R* s" ^
logfd 2
0 G5 B R+ E$ w% S7 p9 o- v' R6 nlogfile /var/log/pptpd.log. q$ ~- j& v5 A" j" F+ G
name pptpd2 c7 l# f) \) \+ d' z
mtu 14504 U1 |- U' Y; E0 T
mru 1450
^6 J( y3 _8 mproxyarp
8 p+ ]/ k7 ~6 B5 fauth& B2 I% E, t( x2 J$ r% A6 K! d
plugin /usr/local/lib/pppd/2.4.4/radius.so radius模块,若不需要radius可以注释掉) y5 J, c6 m+ D2 c: L6 Z
plugin /usr/local/lib/pppd/2.4.4/radattr.so radius属性模块7 |, N# A3 G* P3 t
nobsdcomp
$ Z% z s9 W4 w# z9 S3 H, zipcp-accept-local
4 h, R. a5 ?7 x+ V) I4 _ipcp-accept-remote/ W% {* {' e0 G5 r( {- B, f) j
lcp-echo-failure 3
1 Y( s! S( Y+ t1 {* _lcp-echo-interval 59 k! S$ u& [) q' U; w b o
refuse-pap: P% m1 N, O7 t- ?
refuse-chap
4 s2 E4 o ]# s( e8 N( {1 irefuse-mschap
( a$ h" j1 d5 w+ O- p1 W: M- Srefuse-eap
! g- w J- z0 y5 p4 Z% Mrequire-mschap-v2) r- h8 f1 X, A
multilink
$ k# A8 y+ T/ w9 A/ M, f) jrequire-mppe m3 w$ Q/ O6 w3 A f" t* [, v9 q+ E
ms-dns 202.98.96.68 客户端的DNS地址; h; t {3 ^. v! s6 B3 r9 R
ms-dns 61.139.2.69
2 H4 w& D/ n/ G: P( u* ?4、启动PPTP3 _& f a! `; A. T# B3 n
使用service pptpd start启动服务
9 [; E4 [8 U$ x- S" U% n使用chkconfig pptpd on 使重启生效
u. r+ ]" p& ` g9 K* H 5、添加测试用户/etc/ppp/chap-secrets1 N/ `& t m, h) Y6 g9 i
2 x7 y- s% t9 q9 B. `, t# Secrets for authentication using CHAP
4 ~1 K8 o+ h$ B/ m# client server secret IP addresses ( t% f; r! O. Y3 [& j
test pptpd test *
0 } W: x" |; J* K$ K. S 6、客户端设置
1 [: S& G/ n. c 在windows XP上创建vpn连接,并测试(略):
: c7 W2 M: x- F7 Z7 Q& @三、 RADIUS与MYSQL安装:
1 S2 n9 r& C" R7 A" o0 d) u0 `* C1、 安装与配置MySQL$ q: Y. K Z7 T& p
使用yum方式安装MYSQL、php、Apache4 B$ O g* j# B3 r! Z
启动MySQL:service mysqld start9 y0 X' d7 l8 P2 P
更改MySQL的root用户的密码
! M' x: b, \2 O# L/ ?5 [* Q- B# mysqladmin -u root -p password youpass. o; @1 N1 k/ E$ N8 K1 j
#mysql -uroot -p youpass# [ j! j) f. E+ F/ N% H ^' N! h
>create database radius; 创建一个名为radius的数据库, m4 B/ |8 B9 G- i1 f
>exit
% B) f( c1 Z+ ]$ L0 g- t0 ^#chkconfig mysqld on 随系统启动, N4 ~2 r5 J o! p
2、 radius安装( `/ p1 M* e/ V; C) q
从http://freeradius.org/ 获取 freeradius-server-2.1.7.tar.bz2) M; B5 h* o+ H& |8 R
#tar -xvf freeradius-server-2.1.7.tar.bz2
) V0 J/ c! k. ]9 X#cd freeradius-server-2.1.72 `+ v t7 r( j5 M! L( R
#./configure. k" T( J. H! r7 N' [/ |2 }6 z% u/ B
#make
# F& \( e& T4 f7 f8 { G* w1 j#make install' ^' |: X/ D0 G4 o7 ]. E. A% ]' B
#radiusd -X 使用debug模式运行radius
3 F6 H- k- W3 d, ~8 h4 U/ V如果看到 "Ready to process requests."表示安装成功。
0 X9 }0 I" Y* ]& V9 x3、修改freeradius支持MySQL。
4 _: _7 B2 e6 B# o7 t) c3 w#cd /usr/local/etc/raddb/sites-available
0 u: D1 t0 w$ R3 f9 f( U6 P编辑default文件,把里面所有sql前面的#去掉。- U/ c; _ R* F) h4 a
# cd /usr/local/radius/etc/raddb/
$ H. p! k+ b! t1 v" E+ m1 K编辑radiusd.conf,去掉$INCLUDE sql.conf前面的#
' o( X' p M' q编辑sql.conf,3 h' ]9 V8 G( m, M# A( \4 D
# Connection info:
0 A5 x$ }3 f3 G: ~& V server = "localhost"
& D! v! b/ ?3 q6 q #port = 3306
3 E$ _# X! K# ~5 {' E! H# I login = "root"- c: `' J) A$ I4 b) l4 ?8 X* q
password = "youpass"0 U. G; T) s+ p$ o- ~+ O- j( ^- T
向mysql导入radius所需的数据库文件
O$ K$ f, ]# i) {& F% n#cd /usr/local/etc/raddb/sql/mysql
& G3 O# C( J! ^/ x6 {$ c5 Y# mysql -uroot -p radius < schema.sql
, ?; _/ s; s. c" P+ K; m再用debug模式运行freeradius.4 F* x7 i& S2 |+ k
# /usr/local/sbin/radiusd -X
9 t, s7 Q: b$ Q( A$ x0 m7 J }有可能会出现8 A. t. q6 t4 N
/usr/local/etc/raddb/sites-enabled/default[159]: Failed to find module "sql".4 w, F) _8 K! {1 h0 Z# M
radius没有找到驱动去连接mysql。0 F4 O1 S( ?8 x; [
编译rlm_sql_mysql.so驱动9 c2 W( ]* g0 [. M3 a' V* A# `
#cd freeradius-server-2.1.7/src/modules/rlm_sql/drivers/rlm_sql_mysql1 P' J; k# F5 }* u0 U) p
#./configure;make;make install. V4 F5 _8 @+ I8 J- h7 p p
这个时候驱动会安装到/usr/local/lib目录下面,要把驱动复制到/usr/lib目录下
0 `8 e t8 T% H- j#cp /usr/local/lib/rlm_sql_mysql* /usr/lib3 v* N. A6 E, X, w% L
接下来在数据库中添加测试用的用户
. Z* q9 v7 b# ?9 X, u/ ^#mysql -uroot -p radius
( I/ @8 E- g' A$ b2 _> INSERT INTO `radusergroup` (`username`,`groupname`,`priority`) VALUES ('','test',1);) p: d9 b" c+ I3 A
> INSERT INTO `radusergroup` (`username`,`groupname`,`priority`) VALUES ('test','test',1);
/ u. R9 Z0 @7 E* V8 N& b> INSERT INTO `radcheck` (`id`,`username`,`attribute`,`op`,`value`) VALUES (1,'test','User-Password',':=','test');
' D, d# y& ^ n, ], @$ O/ J) G测试刚刚添加的用户能不能通过验证:+ G i2 G2 X: ^. ^1 p+ m; j; A
同时开两个窗口,运行#radiusd -X2 x; W# ]% a! o
另一个窗口运行:#radtest freebsd freebsd localhost 0 testing1233 a4 i8 {8 l- D
如果看到:"rad_recv:Access-Accept packet from host 127.0.0.1 ……",就已经成功了。
/ m: B% _+ N" k% Q2 ^( Y4、 使用web界面管理radius用户
. n! @) M! u. L. N #cp -R ~/freeradius-server-2.1.7/dialup_admin /usr/local/
. L, Q# }/ ~6 R2 x0 |& ~8 \1 } #ln -s /usr/local/dialup_admin /var/www/html/dialup_admin
9 |6 B8 |& Y, ~9 {$ o, A #cd /var/www/html/dialup_admin/conf) Y( J+ a$ _' O
编辑admin.conf,修改如下内容
. w. P6 K( e2 J9 A- w ' \; e2 Z3 B8 c( n: S: X) {0 g' y
general_encryption_method: clear
0 n: R' B$ y% v, zsql_type: mysql6 Y* @( F/ {' c
sql_server: localhost0 y/ O( u/ W; M* L
sql_port: 3306
" f$ j: w9 ?; R; g' \sql_username: root
9 O V, S$ f5 S. ?9 gsql_password: youpass$ B% r2 W2 M& m. o- A6 V, U# @
sql_database: radius2 q5 C0 @5 W; C/ Y; ^6 _ U$ n
sql_usergroup_table: radusergroup1 S) `- z$ N2 x* J" f/ ?
# sql_debug: true
7 Y8 Y' n w: Z. _$ C配置Apache4 T: C; ^: o; V" p* W
修改:/etc/httpd/conf.d/php.conf
- }9 v" L# A8 p& \AddHandler php5-script .php .php30 ]2 a7 D, ?0 o9 |9 o
修改:/etc/httpd/conf/httpd.conf
- O9 H9 }) j6 M7 {. T2 F<Directory "/var/www/html/dialup_admin/htdocs">* z4 M8 }$ G, r) b& U2 ~2 j m
启动apache:
& T1 S5 B1 M6 x$ u0 `#service httpd start
. m. E x4 n: F#chkconfig httpd on. k4 y5 M. u" P& Z
打开浏览器就可以管理radius的用户了。
- \& r2 i! T# a# `四、 使用radius验证pptpd用户
0 Y2 N) h9 o! v, \$ Z' @9 I9 w使用radius验证用户,需要安装radius模块,3 ]* P: v0 o; C! L
下载ppp-2.4.4.tar.gz源代码. U5 Y2 R2 E0 M5 E9 y
# tar -xvf ppp-2.4.4.tar.gz
$ R; P9 L, ~8 R' W% i# cd ppp-2.4.47 x' \# ]9 D1 r# S
# ./configure //注意不要在这个地方编译安装。8 y) E, I7 x# u) u# Y/ x
#cd pppd/plugins/radius
% i) y. `; O/ ~( [% W$ B#make( v) Q: `5 [6 d2 i: x' h
#make install
2 a2 w2 @" m* C- [$ T, N' S, N# cp -R etc /usr/local/etc/radiusclient
% R8 ]- _$ k$ _& c; j下面选项在使用radius验证时开启.需要注释掉local
" f0 [2 {5 n, h( [( E#vim /etc/ppp/options.pptpd
2 E8 V- x# Y2 m2 A* W& bplugin /usr/local/lib/pppd/2.4.4/radius.so //必须先加载radius验证模块,再加载radattr.so6 o$ N+ W+ ^6 L
plugin /usr/local/lib/pppd/2.4.4/radattr.so
% ~6 t- c* J/ a6 g2 e#cd /usr/local/radiusclient' k! j/ X% G3 Z: {
#vim radiusclient.conf 编辑如下两行
2 e/ S4 D: ~9 A1 S7 i8 F) cauthserver 127.0.0.1:1812 //radius验证8 P/ b0 V' o3 I3 ]6 g8 U
acctserver 127.0.0.1:1813 //radius计费0 T0 }8 w$ X- B6 a8 d0 _
# vim servers4 U9 \8 `& f) m% C7 T0 \7 A% o% E
#Server Name or Client/Server pair Key
( a+ P3 ?; v/ O# ~2 R( Y#---------------- ---------------2 \3 \0 A. ]' Q" e* t
#portmaster.elemental.net hardlyasecret- r% G p) z/ K
#portmaster2.elemental.net donttellanyone4 c4 X3 E; J7 P4 }. o
127.0.0.1 testing123
9 \: T. B8 L* U重启pptpd: service pptpd restart
2 H. F8 T, j0 |! _, V$ w五、带宽限制
# v9 a- F/ r" q) ~使用radius传回限速信息对客户端限速5 f1 M+ g8 F- @3 d& Y; U
基本原理,radius根据数据库里面的限速字段的属性,下发给PPTP服务器,服务器再根据接收到的限速字段属性来限制用户带宽。
, Z! o n8 `8 F$ a由于Linux的PPTP 限速字段不在radius默认的列表中,需要手动添加该字段。 m8 P2 y! H. U2 G
PPTP服务器:' E5 ?7 z8 l! c& k4 Q
#cd /usr/local/etc/radiusclient1 {3 P5 z! L' X; C1 _5 _5 d6 y6 T, x
#vim dictionary 添加如下两行, t3 G' |4 K/ g6 R: z4 K! i1 c/ k
ATTRIBUTE PPPD-Upstream-Speed-Limit 230 integer
- h l# X+ z+ XATTRIBUTE PPPD-Downstream-Speed-Limit 231 integer
, m1 V7 c, L% u, m同样也需要在radius的dictionary中添加这两行。具体位置/usr/local/etc/raddb/
, J: S( [ K: {) X/ `# k还需要在数据库中加入:
5 ?1 g4 _" i4 h; W( a6 NINSERT INTO `radgroupreply` VALUES (8,'test','PPPD-Upstream-Speed-Limit','=','512');
! U- o, V! q, B) n. l9 A. nINSERT INTO `radgroupreply` VALUES (9,'test','PPPD-Downstream-Speed-Limit','=','512');
c! j6 R; `" `* M* U512是限制的带宽,单位是kbps% ~7 L/ m' }4 l9 o
最后需要在/etc/ppp/目录下添加一个本地脚本,用TC来限制带宽:
1 J' I8 b0 p4 k; Z1 q9 d5 x脚本内容如下:
8 S. ]- p$ Y# u! g0 C. h5 g% o#cat ip-up.local //注意。该脚本必须要有可执行权限。
8 K; y- s) X3 A H1 d& W#!/bin/bash
0 f0 I( p/ w9 M5 R7 HPATH=/sbin:/usr/sbin:/bin:/usr/bin
: ~0 x9 Z, B6 U" b! S( wexport PATH* W1 [. d$ ~5 `
# Get the attrbute from radius reply( v! [) _, j2 v3 y9 _+ z& p
if [ -f /var/run/radattr. $1 ]7 z+ b+ R! d$ d- ~( S- D3 p& I
then
4 d/ q7 n2 a7 g! x& {7 j+ n0 k9 b DOWNSPEED=`/bin/awk '/PPPD-Downstream-Speed-Limit/ {print $2}' /var/run/radattr. $1`! E, h5 D" B+ W
UPSPEED=`/bin/awk '/PPPD-Upstream-Speed-Limit/ {print $2}' /var/run/radattr. $1`
$ w; r" r$ S8 v3 w+ Ufi
5 }" b, Y6 f) D$ B9 v) Q' K# End
& c8 L6 t. l) [9 I' o8 F# Start Bandwidth Limit! m, w" A* |8 B, `: G3 \* T
/sbin/tc qdisc del dev $1 root > /dev/null
2 N2 w9 z- ?8 R5 H /sbin/tc qdisc del dev $1 ingress > /dev/null( {" Y4 D2 w$ k
##### speed server->client8 E4 Y, ~; e# W
if [ "$DOWNSPEED" != "0" ] ;8 I/ o7 V F" M6 j
then
* U/ N4 e$ {6 F /sbin/tc qdisc add dev $1 root handle 1: htb default 20 r2q 1; D/ x) {% O: W: @
/sbin/tc class add dev $1 parent 1: classid 1:1 htb rate ${DOWNSPEED}kbit burst 4k8 ]7 k j5 o, l3 \# F7 m
/sbin/tc class add dev $1 parent 1:1 classid 1:10 htb rate ${DOWNSPEED}kbit burst 4k prio 1
& k. a; \% W( ^5 a /sbin/tc class add dev $1 parent 1:1 classid 1:20 htb rate ${DOWNSPEED}kbit burst 4k prio 2( S3 V1 \" t' n: X
/sbin/tc qdisc add dev $1 parent 1:10 handle 10: sfq perturb 10 quantum 1500
; J; N8 W; X D3 Z* [; H1 } /sbin/tc qdisc add dev $1 parent 1:20 handle 20: sfq perturb 10 quantum 1500
+ s- n. T k9 a- \2 y /sbin/tc filter add dev $1 parent 1:0 protocol ip prio 10 u32 match ip tos 0x10 0xff flowid 1:10
b8 p- A5 w* ~; H5 V /sbin/tc filter add dev $1 parent 1:0 protocol ip prio 10 u32 match ip protocol 1 0xff flowid 1:10
! X6 i5 j) M* {4 t7 ^1 }; 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 0x10% ^8 L" ~* e! {0 w' R
0xff at 33 flowid 1:10
- j6 q3 _ n+ @3 R8 l+ b fi: k/ S1 x4 F* t. X& ]3 W5 O0 @' [5 N
##### speed client->server' _$ R, r* u7 F! m5 q' M6 o9 R
if [ "$UPSPEED" != "0" ] ;
8 \- A# H! ~8 u- m then& O% F3 K: ~1 _. B4 A
/sbin/tc qdisc add dev $1 handle ffff: ingress
; }; X5 r6 h% }0 C /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
/ m; }1 ^9 C3 X' C& Z# G+ H# i* k fi
/ J3 |2 J' e( n# End
( b1 Q' U2 P: Q# J: \六、 系统优化. u2 H. w) P$ p. X, U* f
最后再做一些简单的系统优化,以满足较大的网络流量
+ H3 c7 E0 [; o& I5 ], Ynet.ipv4.ip_forward = 1
9 E1 H7 C& J# e. l) ~- u4 x3 Snet.ipv4.conf.default.rp_filter = 16 `0 \" X# j3 [1 W, L, H6 \- e1 o
net.ipv4.conf.default.accept_source_route = 01 A! ]! }9 C, I' P
kernel.sysrq = 0
; Q. r( b/ [, B5 B1 }6 Hkernel.core_uses_pid = 1
' ~0 P4 o3 N9 e: z& F4 T/ N1 fnet.ipv4.tcp_syncookies = 1
* \) y, }! I9 E* C0 ?# q- H# u k' Gkernel.msgmnb = 65536# e/ i$ q$ J$ o# I
kernel.msgmax = 65536+ ?1 S8 Q/ z! H
kernel.shmmax = 4294967295/ H/ G% O; d! l" l% Q
kernel.shmall = 268435456
7 s8 q4 d# f3 [# W: [5 Qnet.core.rmem_max = 12582912
* T% L3 z; O% }1 Z- Y# S& a5 T( Wnet.core.rmem_max = 12582912/ Y [) e( u# K3 ^# \
net.ipv4.tcp_rmem = 10240 87380 12582912( `5 c7 Z8 N5 P4 O* ? T
net.ipv4.tcp_wmem = 10240 87380 12582912
* \% \: @* W8 k1 ?net.ipv4.tcp_no_metrics_save = 1
3 Q* j3 h+ D7 K+ C Wnet.core.netdev_max_backlog = 5000
8 V3 @0 [" a% A H* o; S' L" u如果想要对拨入用户做NAT,可以使用IPTABLES做
2 `! w9 e; _5 k# W" D#iptables -t nat -A POSTROUTING -j MASQUERADE4 |0 R3 V2 r# X0 L8 n1 S2 s
w0 @5 o( @4 M: f. K. w9 Z6 H
, X. K( M- X# }8 \8 ^/ \- Z- V8 Y, T6 e8 ~. l' j
$ L+ ?6 F& G1 `6 l0 a5 f
" ^ j' u+ Q5 W( i
2 W S* q: n# \7 }. ~4 h
- z' {, d- W0 R; T6 M3 h
2 a: ?0 L# X8 J9 @. F* C( [
' g" h, p3 z6 @6 p0 b! s6 h5 O4 e ?/ t; U3 k
|
|