xiaowuhello
实现的下载和上传带宽限制的脚本

linux限速

一个用tc+iptables实现的下载和上传带宽限制的脚本

一个用tc+iptables实现的下载和上传带宽限制的脚本

这是我用的,新年献给大家。每个IP单独限制,好随时修改。如果是用拨号上网的,请把以下内容加到/etc/ppp/ip-up.local中,否则断线重拨后会没有上传限制,对BT光限制下载是不够的。

#!/bin/bash

#

[email=#lvhe888@163.com]#lvhe888@163.com[/email]

#

# 定义上下带宽

# 注意是 Kbit

DOWNLOAD=800Kbit

UPLOAD=160Kbit

# 定义内网IP段

INET=192.168.0.

# 定义限制的IP范围

IPS=1

IPE=253

# 定义本服务器IP

ServerIP=254

# 定义进出设备

IDEV=eth0

ODEV=ppp0

#

#

#

/sbin/tc qdisc del dev $IDEV root handle 10:

/sbin/tc qdisc del dev $ODEV root handle 20:

#

/sbin/tc qdisc add dev $IDEV root handle 10: cbq bandwidth 100Mbit avpkt 1000

/sbin/tc qdisc add dev $ODEV root handle 20: cbq bandwidth 1Mbit avpkt 1000

#

/sbin/tc class add dev $IDEV parent 10:0 classid 10:1 cbq bandwidth 100Mbit rate 100Mbit allot 1514 weight 1Mbit prio 8 maxburst 20 avpkt 1000

/sbin/tc class add dev $ODEV parent 20:0 classid 20:1 cbq bandwidth 1Mbit rate 1Mbit allot 1514 weight 10Kbit prio 8 maxburst 20 avpkt 1000

#

# 不限制内网从本服务器下载。

# 注意如本服务器上有代理,用户可通过代理绕过带宽限制,

# 可取消以下三句限制从本服务器下载。

/sbin/tc class add dev $IDEV parent 10:1 classid 10:10 cbq bandwidth 100Mbit rate 95Mbit allot 1514 weight 20Kbit prio 5 maxburst 20 avpkt 1000 bounded

/sbin/tc qdisc add dev $IDEV parent 10:10 sfq quantum 1514b perturb 15

/sbin/tc filter add dev $IDEV parent 10:0 protocol ip prio 50 u32 match ip src $INET$ServerIP flowid 10:10

#

#限制下载速度

COUNTER=$IPS

while [ $COUNTER -le $IPE ]

do

# 以下三句限制各IP的下载带宽

/sbin/tc class add dev $IDEV parent 10:1 classid 10:1$COUNTER cbq bandwidth 100Mbit rate $DOWNLOAD allot 1514 weight 20Kbit prio 5 maxburst 20 avpkt 1000 bounded

/sbin/tc qdisc add dev $IDEV parent 10:1$COUNTER sfq quantum 1514b perturb 15

/sbin/tc filter add dev $IDEV parent 10:0 protocol ip prio 100 u32 match ip dst $INET$COUNTER flowid 10:1$COUNTER

COUNTER=` expr $COUNTER + 1 `

done

#

#限制上传速度

COUNTER=$IPS

while [ $COUNTER -le $IPE ]

do

# 以下三句限制各IP的上传带宽

/sbin/tc class add dev $ODEV parent 20:1 classid 20:1$COUNTER cbq bandwidth 1Mbit rate $UPLOAD allot 1514 weight 4Kbit prio 5 maxburst 20 avpkt 1000 bounded

/sbin/tc qdisc add dev $ODEV parent 20:1$COUNTER sfq quantum 1514b perturb 15

/sbin/tc filter add dev $ODEV parent 20:0 protocol ip prio 100 handle $COUNTER fw classid 20:1$COUNTER

COUNTER=` expr $COUNTER + 1 `

done

#特殊照顾的IP在以上范围的用户

NIP=78

#192.168.0.78 这家伙天天BT

ND=200Kbit

NU=50Kbit

/sbin/tc class change dev $IDEV parent 10:1 classid 10:1$NIP bandwidth 100Mbit rate $ND allot 1514 weight 20Kbit prio 5 maxburst 20 avpkt 1000 bounded

/sbin/tc class change dev $ODEV parent 20:1 classid 20:1$NIP cbq bandwidth 1Mbit rate $NU allot 1514 weight 4Kbit prio 5 maxburst 20 avpkt 1000 bounded

#

NIP=1

# 192.168.0.1 增加我自已的带宽

ND=1500Kbit

NU=500Kbit

/sbin/tc class change dev $IDEV parent 10:1 classid 10:1$NIP bandwidth 100Mbit rate $ND allot 1514 weight 20Kbit prio 5 maxburst 20 avpkt 1000 bounded

/sbin/tc class change dev $ODEV parent 20:1 classid 20:1$NIP cbq bandwidth 1Mbit rate $NU allot 1514 weight 4Kbit prio 5 maxburst 20 avpkt 1000 bounded

# ...................

#

#

# 修改防火墙,增加上传限制

COUNTER=$IPS

while [ $COUNTER -lt $IPE ]

do

iptables -t mangle -A PREROUTING -i $IDEV -s $INET$COUNTER -j MARK --set-mark $COUNTER

COUNTER=` expr $COUNTER + 1 `

done

# 这里是NAT

iptables -t nat -A POSTROUTING -o $EXTIF -s 192.168.0.0/24 -j MASQUERADE

xiaowuhello
给内网做限速脚本
展开Biu

linux网关上TC给内网做限速脚本

#!/bin/bash

##给192.168.13网段的IP做限速

##外网网卡

IN=eth1

##内网网卡

DEV=eth0

start() {

## 清除 eth1 eth0 所有队列规则

tc qdisc del dev $DEV root 2>/dev/null

tc qdisc del dev $IN root 2>/dev/null

##定义总的上下带宽

tc qdisc add dev $DEV root handle 2: htb

tc class add dev $DEV parent 2: classid 2:1 htb rate 3000kbit

tc qdisc add dev $IN root handle 1: htb

tc class add dev $IN parent 1: classid 1:1 htb rate 3000kbit

for (( i=2; i<=253; i=i+1 ))

do

#####下载控制在每人实际最大100k/S左右

tc class add dev $DEV parent 2:1 classid 2:2$i htb rate 100kbit ceil 500kbit burst 15k

tc qdisc add dev $DEV parent 2:2$i handle 2$i: sfq

tc filter add dev $DEV parent 2:0 protocol ip prio 4 u32 match ip dst 192.168.13.$i flowid 2:2$i

#####上传控制在每人实际最大34K/S左右

tc class add dev $IN parent 1:1 classid 1:1$i htb rate 100kbit ceil 300kbit burst 15k

tc qdisc add dev $IN parent 1:1$i handle 1$i: sfq

tc filter add dev $IN parent 1:0 protocol ip prio $i handle $i fw classid 1:1$i

iptables -t mangle -A PREROUTING -s 192.168.13.$i -j MARK --set-mark 0x$i

done

}

stop(){

echo -n "(删除所有队列......)"

( tc qdisc del dev $DEV root &&

for (( i=2; i<=253; i=i+1 ))

do

/sbin/iptables -t mangle -D PREROUTING -s 192.168.13.$i -j MARK --set-mark 0x$i

done && echo "ok.删除成功!" ) || echo "error."

}

#显示状态

status() {

echo "1.show qdisc $DEV (显示下行队列):----------------------------------------------"

tc -s qdisc show dev $DEV

echo "2.show class $DEV (显示下行分类):----------------------------------------------"

tc class show dev $DEV

echo "3. tc -s class show dev $IN (显示上行队列和分类流量详细信息):------------------"

tc -s class show dev $IN

echo "说明:设置总队列下行和上行带宽 3M."

}

#显示帮助

usage() {

echo "使用方法(usage): `basename $0` [start | stop | restart | status ]"

echo "参数作用:"

echo "start 开始流量控制"

echo "stop 停止流量控制"

echo "restart 重启流量控制"

echo "status 显示队列流量"

}

case "$1" in

start)

( start && echo "开始流量控制! TC started!" ) || echo "error."

exit 0

;;

stop)

( stop && echo "停止流量控制! TC stopped!" ) || echo "error."

exit 0

;;

restart)

stop

start

echo "流量控制规则重新装载!"

;;

status)

status

;;

*) usage

exit 1

;;

esac

[查看全文]