查看: 2405|回复: 0

PPTPD+MYSQL+FREERADIUS+限速方案

[复制链接]
  • TA的每日心情
    开心
    2016-5-12 14:23
  • 签到天数: 2 天

    [LV.1]初来乍到

    发表于 2013-9-10 17:56:14 | 显示全部楼层 |阅读模式
    一、        软件需求:- J8 G/ G$ k; T1 r& h
    pptpd-1.3.4、ppp-2.4.4、Apache、MySQL、freeradius(freeradius.org)& k1 h% V! S) H& c7 d
    二、        安装PPTP
    * [- D) z/ B' I1、操作系统使用RHEL5或者CENTOS5,内核版本为: 2.6.18-164.el5, 内核已支持MPPE,不用再安装。
    + Y1 B5 p  }2 ?( _5 N8 D3 x  q使用RPM方式安装pptpd和pppd# C, Y: o9 A' X; A7 h; d) n1 Y
    rpm -ivh pptpd-1.3.4-.rhel5.1.i386.rpm8 p" L3 t' u2 L9 o
    rpm -ivh ppp-2.4.4-2.el5.1.i386.rpm3 w7 v* ]: y( b2 @# p% ?' t2 d  }
    2、修改/etc/pptpd.conf主配置文件:" O; h/ A3 ?& `! q3 S
    debug                                                          开启debug,方便检查错误。) e/ t% {7 \" y/ V/ E9 W- E
    ppp  /usr/sbin/pppd                                pppd程序位置
    0 r8 B& t8 \* roption /etc/ppp/options.pptpd        pptpd的参数配置文件
    ! K2 a% |5 B7 `. s: t+ flocalip 172.16.10.1                                        服务器的IP地址: B3 c' T0 `& N- x; W, d$ @5 w
    remoteip 172.16.10.2-150           分配给客户端的IP地址池6 L: y8 _8 J: {  _( g9 d+ z
            3、修改/etc/ppp/options.pptpd
    4 H7 ?. E5 ~6 q. nlock
    - s% n6 f- T/ i6 c: tdebug' P1 d. V+ ?  {
    dump$ @2 h6 `% |- D
    logfd 2$ t2 Q/ o7 \# v5 |4 r
    logfile /var/log/pptpd.log7 [( h! V$ R' O+ ]- U
    name pptpd; A( i+ o8 s# k8 O5 `$ C, E3 F7 {
    mtu 1450
    ) Q! Q8 x0 L) B4 lmru 14509 x; {, t* `7 \7 B+ x# D
    proxyarp2 X4 Q$ |: U% _! ~' z
    auth3 E- d$ a( k* q, I1 Y) K1 b
    plugin /usr/local/lib/pppd/2.4.4/radius.so     radius模块,若不需要radius可以注释掉, y4 ~5 a9 r4 }6 O
    plugin /usr/local/lib/pppd/2.4.4/radattr.so     radius属性模块
    . f: W/ v1 m! h1 T2 u- ~2 v9 Anobsdcomp1 L. O8 x! ?6 ]% Y. T2 N
    ipcp-accept-local! v, E5 o& a7 I6 q; u% I' j
    ipcp-accept-remote
    7 G5 X' ^7 O* r0 G( V9 @+ Dlcp-echo-failure 3+ y" c: O* s" Y$ x+ V
    lcp-echo-interval 5  Y! w  h7 s/ W* p# p; U% P3 C! y
    refuse-pap9 L& {5 C) m. k% j. h" P
    refuse-chap
    : C7 v6 ^* g$ A6 prefuse-mschap
    . @3 J8 P. D% A+ @. k- R0 yrefuse-eap
    & G/ N: u7 }, _9 ]- Krequire-mschap-v2
    ; H3 o& L3 I0 s5 ?multilink0 I" Z- v' I# |
    require-mppe1 d" D) `8 ]' D8 y. e0 q
    ms-dns 202.98.96.68                     客户端的DNS地址
    % t* g0 k9 H6 y4 `5 k9 x# j$ fms-dns 61.139.2.69* Z7 |0 y$ E( `
    4、启动PPTP- W+ g0 u! U& H( J% ~- D
    使用service pptpd start启动服务
    # e3 K4 B( o' C- c- v4 w: y( v使用chkconfig pptpd on 使重启生效7 c- m( D1 t; f2 k1 G
            5、添加测试用户/etc/ppp/chap-secrets
    - f# S0 a( p; V" Q3 f    * c/ u( {0 g6 J& H$ v* x0 B
    # Secrets for authentication using CHAP
    3 O  L+ A0 ]$ L/ N0 g# client        server  secret                  IP addresses 5 Q+ n& n9 {# b6 D- O
    test pptpd test *. B6 k. E3 y' Z! h
            6、客户端设置) R* o; m# _; G, e% P4 c
            在windows XP上创建vpn连接,并测试(略):5 S+ i& W3 E: L
    三、        RADIUS与MYSQL安装:
      W6 X) i# s" T9 u1、        安装与配置MySQL
    - ^. ]( u. B2 ~! v! H使用yum方式安装MYSQL、php、Apache" \; @# M3 y- S- e2 j0 I4 t: T9 q2 r, h
            启动MySQL:service mysqld start4 M" i* Z% H7 M$ S; s. t
    更改MySQL的root用户的密码
    6 ]1 l. j9 g+ D8 p4 r# mysqladmin -u root -p password youpass
      I) f) ^( ?+ K: Z9 N2 _8 b#mysql -uroot -p youpass# K, g% v7 B6 l6 n2 z
    >create database radius;  创建一个名为radius的数据库& U+ e  W" l, F- Q/ f: q
    >exit
    . K1 w2 l6 E- y#chkconfig mysqld on 随系统启动
      j+ E/ Q' k8 F; J2、        radius安装" ^2 Q$ W- l1 N! V6 B+ i
    http://freeradius.org/ 获取 freeradius-server-2.1.7.tar.bz2
    # h# {4 e8 D6 |! s/ W#tar -xvf freeradius-server-2.1.7.tar.bz2
    2 {& ~, l- Y7 t% h#cd freeradius-server-2.1.7' ^" K( m% e6 S  o" Y& _% K; [
    #./configure( a( n( l+ k' }& R
    #make# m1 ~* Z0 u8 i! d4 i
    #make install
    % k; N) X* K2 C: g) L#radiusd -X 使用debug模式运行radius
    4 D6 C% I' X3 v5 |/ A2 T如果看到 "Ready to process requests."表示安装成功。4 N$ Q$ `% @+ X8 Y
    3、修改freeradius支持MySQL。9 ?# y; ]# Y& V: O- g& \
    #cd /usr/local/etc/raddb/sites-available
    7 B/ |! M7 |" @$ c+ D编辑default文件,把里面所有sql前面的#去掉。
    6 c) {; }' g2 u# b6 o  B# cd /usr/local/radius/etc/raddb/% P8 v3 U& L# V$ ~2 P$ u3 Q3 J
    编辑radiusd.conf,去掉$INCLUDE sql.conf前面的#) ~/ H+ a) M. q6 }8 l- R9 Z7 e
    编辑sql.conf,
    6 R9 b( m! Z4 X        # Connection info:' C5 d- n: p! y
            server = "localhost"$ W$ D/ G5 s7 I. |  P. c6 e
            #port = 3306% g% a/ k  G/ u- |: U' p
            login = "root"
    $ z% \9 e& |7 l8 S        password = "youpass"9 \( t6 A- ^* N# Y$ a$ P( e
    向mysql导入radius所需的数据库文件
    * Y6 @1 }7 S3 s6 @7 x#cd /usr/local/etc/raddb/sql/mysql1 U+ q" l  f) e. ]& U/ c6 q3 o* r
    # mysql -uroot -p radius < schema.sql
    . S' Y: E. k8 i& K再用debug模式运行freeradius.
    $ _2 ^/ z& Y" L* E# /usr/local/sbin/radiusd -X
    6 a6 _( P" y. v( C( W有可能会出现) b9 U6 y5 ?: @8 e1 \
    /usr/local/etc/raddb/sites-enabled/default[159]: Failed to find module "sql".
    , `) h9 F+ B" {radius没有找到驱动去连接mysql。
    ; ^9 a4 @/ X$ |( P$ b$ n编译rlm_sql_mysql.so驱动" i+ ^8 B( D, ?/ Q
    #cd freeradius-server-2.1.7/src/modules/rlm_sql/drivers/rlm_sql_mysql8 ~& j  u- J7 Y$ b$ J" [
    #./configure;make;make install" U$ a7 u8 p2 k9 K
    这个时候驱动会安装到/usr/local/lib目录下面,要把驱动复制到/usr/lib目录下4 W! q* s' ^& J! c9 R, K- I/ q
    #cp /usr/local/lib/rlm_sql_mysql* /usr/lib
    $ i9 t4 s2 \4 D: W/ {; A6 ~接下来在数据库中添加测试用的用户# l. d' U6 _5 U3 L" h
    #mysql -uroot -p radius
    7 C& Z( j8 K9 D" ?2 k> INSERT INTO `radusergroup` (`username`,`groupname`,`priority`) VALUES ('','test',1);
    ' s- n- I+ ^+ B1 _; ~! e> INSERT INTO `radusergroup` (`username`,`groupname`,`priority`) VALUES ('test','test',1);9 U. Q& Z) v0 z) K* Q: b1 u0 Q; x
    > INSERT INTO `radcheck` (`id`,`username`,`attribute`,`op`,`value`) VALUES (1,'test','User-Password',':=','test');
    * h& k/ H$ W- h- C测试刚刚添加的用户能不能通过验证:
    0 R' A' c5 E* t0 @7 T同时开两个窗口,运行#radiusd -X0 b& I! K$ Y  v' s: s- ?
    另一个窗口运行:#radtest freebsd freebsd localhost 0 testing123: Y5 _, \* ?" f) S5 E
    如果看到:"rad_recv:Access-Accept packet from host 127.0.0.1 ……",就已经成功了。) M+ D+ u( I4 T9 C
    4、        使用web界面管理radius用户
    9 o3 T  u$ d% s, O5 X4 Z! C   #cp -R ~/freeradius-server-2.1.7/dialup_admin /usr/local/4 e! d0 k  N0 p& B8 u, r
       #ln -s /usr/local/dialup_admin /var/www/html/dialup_admin
    3 j! M: K3 A& D   #cd /var/www/html/dialup_admin/conf! L( O' r& R0 k8 l$ h
            编辑admin.conf,修改如下内容+ v$ `, g+ i* z4 f
       
    7 v6 u! F9 n; B( e7 Ogeneral_encryption_method: clear0 B5 E9 i: V: Q  c# k# ?. a
    sql_type: mysql
    / n% S1 A! Q2 @sql_server: localhost$ f, m3 C! W- ?* X1 [) R3 g8 d
    sql_port: 3306
    6 J! P* W0 y! n" r: wsql_username: root
    7 V# f" a, z0 \! X4 h( a0 p1 isql_password: youpass9 H3 q- x, z, W2 g* l' s
    sql_database: radius
    9 S# x) A$ P4 |7 d7 h7 K4 M1 ^sql_usergroup_table: radusergroup  c1 X) S7 Y8 b' A) g7 Q5 }8 X
    # sql_debug: true
    " K. F) b& S$ l$ h. W$ |! {  [! b配置Apache
    $ Y1 Q' r) u5 @. D修改:/etc/httpd/conf.d/php.conf% a; T  p$ I" u  c6 J
    AddHandler php5-script .php .php30 U) w  Z. D/ k: [
    修改:/etc/httpd/conf/httpd.conf& t- n) J2 L* i- O% R4 R
    <Directory "/var/www/html/dialup_admin/htdocs">
    ! B' U+ k7 p# F+ \* T8 M* H8 J6 Z启动apache:  P" N% f- |& k
    #service httpd start
    $ E1 ]+ U! \, I9 y#chkconfig httpd on
    & f1 @% ?( I: V$ |2 j. ^打开浏览器就可以管理radius的用户了。
    & t. w2 Q7 D- ?; E* _& Z; H: s7 {四、        使用radius验证pptpd用户3 V+ a  u% E6 b3 s. M8 e' r6 W2 k
    使用radius验证用户,需要安装radius模块,7 E# ~5 o- ]9 X1 j( f
    下载ppp-2.4.4.tar.gz源代码
    0 M" }% L( |( m- w% i; c; H# tar -xvf ppp-2.4.4.tar.gz! M& F( w! @% D; n3 y' Z5 e* O. t3 q
    # cd ppp-2.4.4
    + `! g9 _7 Z: B# H; o# ./configure     //注意不要在这个地方编译安装。# W' P1 @3 d  R5 k
    #cd pppd/plugins/radius  
    1 p9 e- g! D" c; d" k! q#make
    ( p" R2 a6 U; y! w* O0 V: S- u+ h#make install
    7 y/ d6 d$ z9 L: S8 }# C# cp -R  etc   /usr/local/etc/radiusclient
    3 o# E' f) v8 g2 s% _% h3 a- x4 O下面选项在使用radius验证时开启.需要注释掉local* z& y0 P4 T" w3 x7 O9 e
    #vim /etc/ppp/options.pptpd
    % [  t6 m$ E4 |6 H4 `; ]plugin /usr/local/lib/pppd/2.4.4/radius.so   //必须先加载radius验证模块,再加载radattr.so: ^/ _+ n+ q# f6 e# J/ A6 m8 n
    plugin /usr/local/lib/pppd/2.4.4/radattr.so& P  n) O6 a6 v% ]8 D% ?3 E7 v3 q
    #cd /usr/local/radiusclient
    , G& M: Q7 B9 X6 j- J5 ?3 t2 l% O4 t$ T/ |#vim radiusclient.conf  编辑如下两行
    ) S: j: r7 Z7 n: M- hauthserver      127.0.0.1:1812         //radius验证
    * _; T4 O( V1 P' H5 C  O  zacctserver      127.0.0.1:1813         //radius计费+ S# p: n; e4 _. U+ C! K3 \
    # vim servers
    / a' ~0 M$ {# J$ F. S. g' M  n5 u. \( @#Server Name or Client/Server pair              Key( b( T9 g1 a3 y4 S/ O% v; n7 Y
    #----------------                               ---------------
    . |1 H, O5 C: E1 K#portmaster.elemental.net                       hardlyasecret$ J# e; V, u+ c' ?
    #portmaster2.elemental.net                      donttellanyone0 c* V4 Q( E. ~1 Q" ]
    127.0.0.1                        testing123. k, D3 \4 S# Z
    重启pptpd: service  pptpd restart
      n1 F  q$ R7 c5 c五、带宽限制
    " y* `- K6 r# O使用radius传回限速信息对客户端限速7 z  q: R+ Y  `  |( X% z& p
    基本原理,radius根据数据库里面的限速字段的属性,下发给PPTP服务器,服务器再根据接收到的限速字段属性来限制用户带宽。
    6 _- `5 C1 f9 G2 v/ ^! v由于Linux的PPTP 限速字段不在radius默认的列表中,需要手动添加该字段。' Q, |: M, v5 {5 L* t% ^4 D
    PPTP服务器:
    % b: V) I5 k, H6 T$ y% G7 [#cd /usr/local/etc/radiusclient
    # T4 x! C4 \% a" o+ I& t#vim dictionary 添加如下两行
    % |9 l2 k/ r+ b& {+ v) DATTRIBUTE       PPPD-Upstream-Speed-Limit       230     integer
    9 D6 x* u1 N. c, U2 u$ BATTRIBUTE       PPPD-Downstream-Speed-Limit     231     integer2 ?. M7 N" v7 n$ Z
    同样也需要在radius的dictionary中添加这两行。具体位置/usr/local/etc/raddb/
    / G1 V/ V) J7 i3 F: E6 N还需要在数据库中加入:( A* A5 W' F' P. T( R* y
    INSERT INTO `radgroupreply` VALUES (8,'test','PPPD-Upstream-Speed-Limit','=','512');
    " `2 G/ x2 u2 jINSERT INTO `radgroupreply` VALUES (9,'test','PPPD-Downstream-Speed-Limit','=','512');
    ) J9 N& O: |2 y512是限制的带宽,单位是kbps% J7 D3 k( a; [7 |, c: [
    最后需要在/etc/ppp/目录下添加一个本地脚本,用TC来限制带宽:
    - m, i5 I1 h/ m. F6 z; J1 U2 j脚本内容如下:
      P5 \5 m8 P" b% D; b/ s3 J0 f#cat ip-up.local   //注意。该脚本必须要有可执行权限。7 B. l/ q/ g5 e+ e3 y/ {
    #!/bin/bash# }$ A9 J/ H2 }* ]
    PATH=/sbin:/usr/sbin:/bin:/usr/bin
    / a' C. X4 u% ?2 k3 p0 l) X7 A; fexport PATH
    # V3 O  D( j0 G3 C* Z* F; M# Get the attrbute from radius reply
    ) f5 u, b, z& w3 Z( A4 f; Kif [ -f /var/run/radattr. $1 ]
    / h2 b: @) J& Q6 W" I& Dthen
    + _, M' ~! Q8 C   DOWNSPEED=`/bin/awk  '/PPPD-Downstream-Speed-Limit/ {print $2}'  /var/run/radattr. $1`- P- P! j- j+ x: T" L
       UPSPEED=`/bin/awk  '/PPPD-Upstream-Speed-Limit/ {print $2}'  /var/run/radattr. $1`* P& B2 D! q7 g* @% |2 r+ R6 L
    fi1 }" V" o6 u, m* {# |* [
    # End0 m! V- s% G5 D! O# p* }+ N4 F
    # Start Bandwidth Limit8 G+ m/ J2 X: n$ L
       /sbin/tc qdisc del dev $1 root    > /dev/null+ R, V. c4 {3 o  z
       /sbin/tc qdisc del dev $1 ingress > /dev/null
    ; O* i1 \: n, P##### speed server->client
    ' Y7 A: r& v9 H# k  if [ "$DOWNSPEED" != "0" ] ;/ {" i. s) o4 H/ R0 {
      then
    0 x7 o, g: Z0 I$ a& N3 K; i, f6 ]    /sbin/tc qdisc add dev $1 root handle 1: htb default 20 r2q 1- F- d% W/ T! U- r& `3 ~8 L' c
        /sbin/tc class add dev $1 parent 1: classid 1:1 htb rate ${DOWNSPEED}kbit burst 4k* ~6 ^4 H4 n1 E" ^
        /sbin/tc class add dev $1 parent 1:1 classid 1:10 htb rate ${DOWNSPEED}kbit burst 4k prio 1
    * R: P0 J/ E2 N    /sbin/tc class add dev $1 parent 1:1 classid 1:20 htb rate ${DOWNSPEED}kbit burst 4k prio 2
    / g, k' f+ ^- @8 W* b1 ]    /sbin/tc qdisc add dev $1 parent 1:10 handle 10: sfq perturb 10 quantum 1500
      q( b) v# q- M  u' h0 r. f4 X. b3 B    /sbin/tc qdisc add dev $1 parent 1:20 handle 20: sfq perturb 10 quantum 1500
    ; x) M6 F7 \9 x) H    /sbin/tc filter add dev $1 parent 1:0 protocol ip prio 10 u32 match ip tos 0x10 0xff flowid 1:10% q* ]' p3 i( @9 b, |, E) A3 R) @: v
        /sbin/tc filter add dev $1 parent 1:0 protocol ip prio 10 u32 match ip protocol 1 0xff flowid 1:10: S, B2 Y" w+ W( `( f
        /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
    $ A5 j- d+ u3 X3 }0xff at 33 flowid 1:10! |; O+ t8 Q7 u, A4 N; H- [
      fi: K! ?8 {- F  t' _
    ##### speed client->server3 ?- J4 U/ w3 U, C9 U
      if [ "$UPSPEED" != "0" ] ;7 I6 z2 m% \# g4 B( o, l; e( Y5 H
      then
    5 _" q. z3 y: _/ S6 w    /sbin/tc qdisc add dev $1 handle ffff: ingress, @% E1 I5 i+ Q( y
        /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, B" y# Y6 p/ Y4 l5 M
      fi& w- n. J- t+ u" Y$ f
    # End1 |6 @. N/ q- o6 j2 z
    六、        系统优化( y: a* y! d8 D
    最后再做一些简单的系统优化,以满足较大的网络流量( k- p2 J4 T# V& K" ?
    net.ipv4.ip_forward = 1
      }- m" s4 ~% g5 h" ~net.ipv4.conf.default.rp_filter = 1! Q# n3 r! m" z/ M. F8 [9 `
    net.ipv4.conf.default.accept_source_route = 0) ?* P6 Q) i! m2 _( _
    kernel.sysrq = 0
    % r8 @* S, C; k* f# zkernel.core_uses_pid = 1) ]! d, E  h3 p5 n  X; |8 j
    net.ipv4.tcp_syncookies = 12 o, a$ @" P! V* [% n
    kernel.msgmnb = 65536! M/ s% Y! X3 i* _2 g
    kernel.msgmax = 655363 u$ P3 W0 h$ t
    kernel.shmmax = 42949672952 @. o- q, s: t
    kernel.shmall = 2684354566 S8 O# o: v) J$ O' _1 W: u
    net.core.rmem_max = 125829128 I3 c! }8 m' B) H* p9 q
    net.core.rmem_max = 12582912: s9 ?4 C% W9 ?+ P; n, c5 m# E
    net.ipv4.tcp_rmem = 10240 87380 12582912
    $ d+ a, h! i" l+ K9 Tnet.ipv4.tcp_wmem = 10240 87380 12582912% {4 {; B; t6 B7 O
    net.ipv4.tcp_no_metrics_save = 1! z* F- v, q* L3 m1 N
    net.core.netdev_max_backlog = 5000$ @% X8 c! x; E
    如果想要对拨入用户做NAT,可以使用IPTABLES做/ r. Z8 r8 v) p8 q
    #iptables -t nat -A POSTROUTING  -j MASQUERADE
      D+ I; c& M7 X& P# W
      Y% c5 [4 l3 ]
    : C4 t& v. y# V* m

    1 c$ a1 v4 u$ [" ?- ?, c/ T1 ]2 C; j4 K
    . \% j$ C7 |$ q/ j" l$ _- r

    # w) b; V. w& [. r- ?: e
    & f& j& i: s3 j
    ( n5 Z% c$ Q& x* G% l3 D
    4 C/ ]7 c2 P0 k' W/ N. _
    : W2 k, J- @+ K* R2 M
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    小黑屋|Archiver|手机版|香港易事泊讨论区论坛 - bbs.hkesp.com    

    © 2001-2013 Comsenz Inc.All Rights Reserved.

    Powered by Discuz! X3.2

    快速回复 返回顶部 返回列表