CentOS-TC(流量控制)
单IP限制下载命令:
tc qdisc add dev eth1 root handle 1: htb r2q 1
tc class add dev eth1 parent 1: classid 1:1 htb rate 1800kbit burst 10k
tc filter add dev eth1 parent 1: protocol ip prio 16 u32 match ip dst 192.168.0.131 flowid 1:1
查看TC的状态
tc -s -d qdisc show dev eth0
tc -s -d class show dev eth0
删除限制下载命令:
tc qdisc del dev eth1 root
窗体顶端
窗体底端
流量实时查看iftop
iftop -i eth1 -F 192.168.0.0/24 -B -P
=>发送数据 <=接收数据
TX发送数据流量 RX接收数据流量 total发送接收全部流量
窗体顶端
窗体底端
流量限速脚本 简单版(已剔除服务器IP)
以下脚本中调用/usr/local/tcip tcip脚本内容
#!/bin/bash
##给192.168.15网段的IP做限速
##外网网卡
IN=eth0
##内网网卡
DEV=eth1
## 清除 eth1 所有队列规则
tc qdisc del dev $DEV root 2>/dev/null
#定义排队规则
tc qdisc add dev $DEV root handle 1: htb r2q 1
for i in {4..254}
do
if [ $i -ge 5 ] && [ $i -le 8 ] || [ $i -eq 11 ] || [ $i -ge 17 ] && [ $i -le 30 ] || [ $i -eq 64 ] || [ $i -eq 164 ] || [ $i -eq 196 ]
|| [ $i -eq 197 ] || [ $i -eq 199 ] || [ $i -eq 200 ] || [ $i -eq 241 ] || [ $i -eq 251 ] || [ $i -eq 92 ] || [ $i -eq 102 ]
then echo $i &> /dev/null
else
#####下载控制在每人实际最大7mb/S左右
tc class add dev $DEV parent 1: classid 1:$i htb rate 7mbit burst 15k
tc filter add dev $DEV parent 1: protocol ip prio 16 u32 match ip dst 192.168.0.$i flowid 1:$i
fi
done
启停脚本
#!/bin/bash
#
##内网网卡
DEV=eth1
###定义启停服务
status() {
echo "1.show qdisc $DEV (显示下行队列):----------------------------------------------"
tc -s qdisc show dev $DEV
echo "2.show class $DEV (显示下行分类):----------------------------------------------"
tc class show dev $DEV
echo "3.以下 IP地址已被限速:"
IP=`tc -s -d class show dev $DEV | grep "1:" |awk -F: '{print $2}' | awk '{print $1}' | sort -n`
for a in $IP
do
echo "192.168.0.$a 地址已被限速"
done
}
stop(){
echo -n "(删除所有队列......)"
( tc qdisc del dev $DEV root )
}
start(){
echo -n "(开启流量控制......)"
( sh /usr/local/tcip )
}
#显示帮助
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
窗体顶端
窗体底端
tc限速脚本
#!/bin/bash
##给192.168.15网段的IP做限速
##外网网卡
IN=eth0
##内网网卡
DEV=eth1
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 20000kbit
tc qdisc add dev $IN root handle 1: htb
tc class add dev $IN parent 1: classid 1:1 htb rate 20000kbit
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.0.$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.0.$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.0.$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 "说明:设置总队列下行和上行带宽 20M."
}
#显示帮助
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
窗体顶端
窗体底端
cat /usr/local/tcip
#!/bin/bash
##给192.168.0网段的IP做限速
##外网网卡
IN=eth1
##内网网卡
DEV=eth0
## 清除 eth1 所有队列规则
tc qdisc del dev $DEV root 2>/dev/null
#定义排队规则
tc qdisc add dev $DEV root handle 1: htb r2q 2
for i in {4..254}
do
#去除不受限制的IP地址
if [ $i -eq 3 ] || [ $i -eq 4 ]
then echo $i &> /dev/null
else
#####下载控制在每人实际最大6mb/S左右
tc class add dev $DEV parent 1: classid 1:$i htb rate 2mbit burst 8k
tc filter add dev $DEV parent 1: protocol ip prio 16 u32 match ip dst 192.168.0.$i flowid 1:$i
fi
done
tcip 服务启停脚本
cat /etc/init.d/tcip
#!/bin/bash
#
##内网网卡
DEV=eth0
###定义启停服务
status() {
echo "1.show qdisc $DEV (显示下行队列):----------------------------------------------"
tc -s qdisc show dev $DEV
echo "2.show class $DEV (显示下行分类):----------------------------------------------"
tc class show dev $DEV
echo "3.以下 IP地址已被限速:"
IP=`tc -s -d class show dev $DEV | grep "1:" |awk -F: '{print $2}' | awk '{print $1}' | sort -n`
for a in $IP
do
echo "192.168.0.$a 地址已被限速"
done
}
stop(){
echo -n "(删除所有队列......)"
( tc qdisc del dev $DEV root )
}
start(){
echo -n "(开启流量控制......)"
( sh /usr/local/tcip )
}
#显示帮助
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
原文地址:http://blog.51cto.com/13017250/2059503