PPTPD+TC实现VPN用户带宽限制

linux 5aimiku 438次浏览 0个评论

来自chinaunix的Bendy大神,觉得很不错,整理一下

  1. 先是安装PPTPD+MYSQL+RADIUS
  2. 现在我们要实现分组给VPN用户限制(用来分类限制速度)
  3. 在安装好PPTPD+MYSQL+RADIUS后…
    我们的设计是这样的…
    使用不同的内网IP段来实现分组区别..
    比如第一组我们用
    192.168.11.X
    第二组用.
    192.168.12.X
  4. 这样.是用于我们限速脚本来识别区分…
    我们先是要用TC为服务器做一些初始化…就是设置分组限制的具体速度…
    本例的脚本是:

    tc qdisc add dev eth0 root handle 2:0 htb default 1
    tc class add dev eth0 parent 2:0 classid 2:1 htb rate 100Mbit burst 15k
    tc class add dev eth0 parent 2:1 classid 2:10 htb rate 5Mbit burst 15k
    tc class add dev eth0 parent 2:1 classid 2:20 htb rate 2000kbit ceil 2Mbit burst 15k
    tc class add dev eth0 parent 2:1 classid 2:30 htb rate 500kbit ceil 500kbit burst 15k
    tc class add dev eth0 parent 2:1 classid 2:40 htb rate 100kbit ceil 100kbit burst 15k
    tc qdisc add dev eth0 parent 2:10 handle 10: sfq perturb 10
    tc qdisc add dev eth0 parent 2:20 handle 20: sfq perturb 10
    tc qdisc add dev eth0 parent 2:30 handle 30: sfq perturb 10
    tc qdisc add dev eth0 parent 2:40 handle 40: sfq perturb 10
  5. 然后我们就需要在PPTPD的拨号脚本上添加智能识别,并添加TC操作的脚本..
    file: /etc/ppp/ip-up
    在exit 0;前面添加:

    IP_groupa=192.168.11
    IP_groupb=192.168.12
    IP_groupc=192.168.13
    IP_groupd=192.168.14
    IP=`expr match "$5" '\(..........\)'`
    NUM=`expr match "$5" '.*\.\(.*\)'`
    
    case "$IP" in
                    "$IP_groupa" )
                    NUM=100$NUM
                    RUN="tc filter add dev eth0 protocol ip parent 2:0 prio $NUM u32 match ip dst $6/32 flowid 2:10"
                    ;;
    
                    "$IP_groupb" )
                    NUM=200$NUM
                    RUN="tc filter add dev eth0 protocol ip parent 2:0 prio $NUM u32 match ip dst $6/32 flowid 2:20"
                    ;;
    
                    "$IP_groupc" )
                    NUM=300$NUM
                    RUN="tc filter add dev eth0 protocol ip parent 2:0 prio $NUM u32 match ip dst $6/32 flowid 2:30"
                    ;;
    
                    "$IP_groupd" )
                    NUM=400$NUM
                    RUN="tc filter add dev eth0 protocol ip parent 2:0 prio $NUM u32 match ip dst $6/32 flowid 2:40"
        ;;
    esac
    
    echo [$RUN][$5][$6][pptpd-up] >>/tmp/tc.log
    $RUN >>/tmp/tc_run.log
    
    exit 0
  6. 而在ip-down也同样添加以下代码:
    IP_groupa=192.168.11
    IP_groupb=192.168.12
    IP_groupc=192.168.13
    IP_groupd=192.168.14
    IP=`expr match "$5" '\(..........\)'`
    NUM=`expr match "$5" '.*\.\(.*\)'`
    
    case "$IP" in
                    "$IP_groupa" )
                    NUM=100$NUM
                    run="tc filter del dev eth0 protocol ip parent 2:0 prio $NUM u32 match ip dst $6/32 flowid 2:10"
                    ;;
    
                    "$IP_groupb" )
                    NUM=200$NUM
                    run="tc filter del dev eth0 protocol ip parent 2:0 prio $NUM u32 match ip dst $6/32 flowid 2:20"
                    ;;
    
                    "$IP_groupc" )
                    NUM=300$NUM
                    run="tc filter del dev eth0 protocol ip parent 2:0 prio $NUM u32 match ip dst $6/32 flowid 2:30"
                    ;;
    
                    "$IP_groupd" )
                    NUM=400$NUM
                    run="tc filter del dev eth0 protocol ip parent 2:0 prio $NUM u32 match ip dst $6/32 flowid 2:40"
        ;;
    esac
    echo [$run][$5][$6][pptpd-down] >>/tmp/tc.log
    $RUN >>/tmp/tc_run.log
    
    exit 0

作者原话:一年前的文章..当时只在内部交流..现在公开给大家.

解释一下…那脚本中的代码变量$NUM是很重要的…我想了很久才想到用这个方法来对每一个连接的TC限制代码规则起来…
我使用了组别+IP尾数来区别…

这样的话..也就要求每一个内网IP都只能对应一个用户…而每一个用户只能登陆一次…
否则…本限制系统会混乱的…


本文版权:霜之哀伤 转载请注明PPTPD+TC实现VPN用户带宽限制
喜欢 (1)or分享 (0)
5aimiku
关于作者:
一条自以为上了大学就脱离苦海的咸鱼,业余喜欢打游戏,平时喜欢折腾各种东西,喜欢ACG,喜欢宅。
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址