论坛风格切换切换到宽版
  • 1377阅读
  • 6回复

[问题求助]连续奋战2个晚上,终于弄出来了TC控制上行和下行速度 [复制链接]

上一主题 下一主题
 
发帖
1996
C币
-235513
威望
378
贡献值
1
银元
-2
铜钱
4490
人人网人气币
0
只看楼主 倒序阅读 使用道具 楼主  发表于: 2009-05-01
以前弄脚本时只对下行做了限制,没对上行做控制,谁知道这几.天有人狂上传FTP,把带宽拖慢死了.没.法正常使用.(        游戏          )
于是就想.着如何限制上行,终于想出了一个苯办.法.呵呵,请大家指点看看,还有没什么好的改进办法.<性病>

#!/bin/bash
##外网网卡
IN="eth0"
##内网网卡
DEV="eth1"  
start() {
tc qdisc add dev $DEV root .handle 2: .htb 投资
tc clas.s add de.v $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: cl.assid 1:1.  htb rate 3000kbit 学习
i=2;
while [ $i .-lt 100  ]            女人
do
#####下载控制在每人实际最.大58K/S左右           建材
tc class add dev $D.EV parent 2:1 classid 2:2$i htb rate 100kbit ceil. 500kbit burst .15k<性病>
tc qdisc add dev $DEV p.arent 2:2$i handle 2$i.: sfq.
tc filter add dev $DEV parent 2:0.. protoc.ol 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 bur.st 15k.
tc qd.isc add dev $IN parent 1:1$i handle 1$i: s.fq.
tc filter add dev eth0 parent 1:0 protocol ip prio $i hand.le $i f.w classid 1:1$i.             电子
i.ptables -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 && tc qdisc del dev $IN r.oot && 服务器
i=2;
while [ $i -lt 100  .]            鲜花
do
/sbin/ipt.ables .-t mangle -D PREROUTING -s 192.168.0.$.i -j MARK --set-mark 0x$i           女人
i=`expr. $i + 1` .
done && echo "ok..删除成功!" ) || echo "er.ror." 电脑
}
#显示状态
status() {
echo "1.show qdisc $DE.V  (显示下行队列):----------------------------------------------.." 学习
tc -s qdisc show ..dev $DEV
echo "2.sho.w 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 "参数作用:"
ec.ho "start   开始流量控制"              电子
echo "stop    停止流量.控制" (        游戏          )
echo "rest.art 重启流量控制" .
echo "status . 显示队列流量"            女人
}
case "$1" in
start)
( start && ec.ho "开始流量控制! TC started!" ) || echo "erro.r." .
exit 0
;;

stop)
( stop .&& echo "停止流量控制! TC stopped!" ) || echo "error.".               乙肝
exit 0
;;
restart)
stop
start
echo "流量控制规则重.新装载!"               乙肝
;;
status)
status
;;

*) usage
exit 1
;;
esac


[ 本帖最后.由 剑次狼 于 200.8-2-27 21:41 编辑 ].

评价一下你浏览此帖子的感受

精彩

感动

搞笑

开心

愤怒

无聊

灌水
离线kgod.
发帖
1981
C币
-60648
威望
357
贡献值
1
银元
-3
铜钱
4485
人人网人气币
0
只看该作者 沙发  发表于: 2010-04-13
不错写的

离线aeleven.
发帖
2203
C币
-262342
威望
435
贡献值
1
银元
-1
铜钱
5068
人人网人气币
0
只看该作者 板凳  发表于: 2010-04-13
楼主,我不太明白有关规则,能不能给我一本学习IPTABLE和TC命令的书?下面是我用的DDWRT路由器上的命令脚本,因没有了解规则,没有放上去,楼主帮我分析下:

最新0.3版本 简化了代码! 其中使用之单位kbps(千位)是KB(千字节)的意思
1.增加了定义限制的IP范围以外的共享速度 例如你路由分配了192.168.1.2~192.168.1.5 一共4个IP地址  但如果你有其他用户私自更改IP 或增加电脑 是192.168.1.6 ~192.168.1.254  这就属于定义限制的IP范围以外 的IP了 就可以利用这个去定义他们的共享速度!注意这个速度是共享的!
2.增加定义特殊IP 速度功能!   例如 你定义了192.168.1.2~192.168.1.5的每个IP速度下行100k  上行10k ! 但其中 192.168.1.2是我自己的! 谁还会那么傻限自己速呢! 呵呵 这就速度特殊IP了!  又或者某个IP 是BT狂人 需要把速度再降低一点! 这也属于特殊IP!


特殊IP可以按自己实际去增加 减少 或 完全不定义!
例如: 这是五行原始代码NIP 为IP号  NIPDOWN为下载速度 NIPUP为上行速度   最后两行无须修改  如果不需要定义特殊IP可以直接这五行代码删除!  
          如果需要增加可以复制这五行代码 粘贴到 前段代码的后面 ! 在按实际去修改 NIP  NIPDOWN  NIPUP这三个参数!
NIP="2"
NIPDOWN="200kbps"
NIPUP="20kbps"
tc class add dev $ODEV parent 10:1 classid 10:2$NIP htb rate $NIPUP ceil $NIPUP prio 1
tc class add dev $IDEV parent 10:1 classid 10:2$NIP htb rate $NIPDOWN ceil $NIPDOWN prio 1

以下为0.3版本代码从#开始复制到结尾
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~





#!/bin/sh
# BY MAGIC 0.3 070213
# Coyote local command init script

#  定义进出设备(如果不是ADSL拨号用户可以把ppp0改为eth1)
ODEV="ppp0"
IDEV="eth0"

#  定义总的上下带宽
UP="60kbps"
DOWN="400kbps"

#  定义每个受限制的IP上下带宽
UPLOAD="10kbps"
DOWNLOAD="100kbps"

#  定义内网IP段
INET="192.168.1."

#  定义限制的IP范围
IPS="2"
IPE="36"

#  定义限制的IP范围以外的共享速度outdown为下行outup为上行
outdown="2kbps"
outup="2kbps"



#以下部分无须修改 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# 清除 ppp0 eth0 所有队列规则
tc qdisc del dev $ODEV root 2>/dev/null
tc qdisc del dev $IDEV root 2>/dev/null

# 定义最顶层(根)队列规则,并指定 default 类别编号
tc qdisc add dev $ODEV root handle 10: htb default 2254
tc qdisc add dev $IDEV root handle 10: htb default 2254

# 定义第一层的 10:1 类别 (上行/下行 总频宽)
tc class add dev $ODEV parent 10: classid 10:1 htb rate $UP ceil $UP
tc class add dev $IDEV parent 10: classid 10:1 htb rate $DOWN ceil $DOWN
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~



#定义特殊IP按实际添加和修改 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#如使用经常BT的的用户或自己
#例如  我这里把自己用的192.168.1.2 设置为下行设置为200k上行20k,还可以按实际增加或删除下面五行

NIP="2"
NIPDOWN="200kbps"
NIPUP="20kbps"
tc class add dev $ODEV parent 10:1 classid 10:2$NIP htb rate $NIPUP ceil $NIPUP prio 1
tc class add dev $IDEV parent 10:1 classid 10:2$NIP htb rate $NIPDOWN ceil $NIPDOWN prio 1

#经常BT 的192.168.1.4设置下行50k  上行8k  如果不需要可以删除下面五行
NIP="4"
NIPDOWN="50kbps"
NIPUP="8kbps"
tc class add dev $ODEV parent 10:1 classid 10:2$NIP htb rate $NIPUP ceil $NIPUP prio 1
tc class add dev $IDEV parent 10:1 classid 10:2$NIP htb rate $NIPDOWN ceil $NIPDOWN prio 1
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~


#以下部分无须修改 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# rate 保证频宽,ceil 最大频宽,prio 优先权
i=$IPS;
while [ $i -le $IPE ]
do
tc class add dev $ODEV parent 10:1 classid 10:2$i htb rate $UPLOAD ceil $UPLOAD prio 1
tc qdisc add dev $ODEV parent 10:2$i handle 100$i: pfifo
tc filter add dev $ODEV parent 10: protocol ip prio 100 handle 2$i fw classid 10:2$i
tc class add dev $IDEV parent 10:1 classid 10:2$i htb rate $DOWNLOAD ceil $DOWNLOAD prio 1
tc qdisc add dev $IDEV parent 10:2$i handle 100$i: pfifo
tc filter add dev $IDEV parent 10: protocol ip prio 100 handle 2$i fw classid 10:2$i
iptables -t mangle -A PREROUTING -s $INET$i -j MARK --set-mark 2$i
iptables -t mangle -A POSTROUTING -d $INET$i -j MARK --set-mark 2$i
i=`expr $i + 1`
done

#定义default 类别编的上行 (上面没定义带宽的IP上行速度)
tc class add dev $ODEV parent 10:1 classid 10:2254 htb rate $outup ceil $outup prio 1
tc qdisc add dev $ODEV parent 10:2254 handle 100254: pfifo
tc filter add dev $ODEV parent 10: protocol ip prio 100 handle 2254 fw classid 10:2254

#定义default 类别编的下行 (上面没定义带宽的IP下行速度)
tc class add dev $IDEV parent 10:1 classid 10:2254 htb rate $outdown ceil $outdown prio 1
tc qdisc add dev $IDEV parent 10:2254 handle 100254: pfifo
tc filter add dev $IDEV parent 10: protocol ip prio 100 handle 2254 fw classid 10:2254

离线dm15.
发帖
2010
C币
-60893
威望
371
贡献值
1
银元
-1
铜钱
4454
人人网人气币
0
只看该作者 地板  发表于: 2010-04-13
以下为0.2版本



#!/bin/sh
# BY MAGIC 0.2
# Coyote local command init script

#  定义进出设备(如果不是ADSL拨号用户可以把ppp0改为eth1)
ODEV="ppp0"
IDEV="eth0"

#  定义总的上下带宽
UP="60kbps"
DOWN="400kbps"

#  定义每个IP上下带宽
UPLOAD="10kbps"
DOWNLOAD="100kbps"

#  定义内网IP段
INET="192.168.1."

#  定义限制的IP范围
IPS="2"
IPE="30"

# 清除 ppp0 所有队列规则
tc qdisc del dev $ODEV root 2>/dev/null

# 定义最顶层(根)队列规则,并指定 default 类别编号
tc qdisc add dev $ODEV root handle 10: htb default 2254

# 定义第一层的 10:1 类别 (上行总频宽)
tc class add dev $ODEV parent 10: classid 10:1 htb rate $UP ceil $UP

# 定义192.168.1.2~192.168.1.29ip的上行速度
# rate 保证频宽,ceil 最大频宽,prio 优先权
i=$IPS;
while [ $i -le $IPE ]
do
tc class add dev $ODEV parent 10:1 classid 10:2$i htb rate $UPLOAD ceil $UPLOAD prio 1
tc qdisc add dev $ODEV parent 10:2$i handle 100$i: pfifo
tc filter add dev $ODEV parent 10: protocol ip prio 100 handle 2$i fw classid 10:2$i
i=`expr $i + 1`
done

#定义default 类别编的上行 (上面没定义带宽的IP上行速度)
tc class add dev $ODEV parent 10:1 classid 10:2254 htb rate 5kbps ceil 5kbps prio 1
tc qdisc add dev $ODEV parent 10:2254 handle 100254: pfifo
tc filter add dev $ODEV parent 10: protocol ip prio 100 handle 2254 fw classid 10:2254




# QoS eth0 下载方面

# 清除 eth0所有队列规则
tc qdisc del dev $IDEV root 2>/dev/null

# 定义最顶层(根)队列规则,并指定 default 类别编号
tc qdisc add dev $IDEV root handle 10: htb default 2254

# 定义第一层的 10:1 类别 (上行总频宽)
tc class add dev $IDEV parent 10: classid 10:1 htb rate $DOWN ceil $DOWN

#定义192.168.1.2~192.168.1.2.29 IP的下行速度
# rate 保证频宽,ceil 最大频宽,prio 优先权
i=$IPS;
while [ $i -le $IPE ]
do
tc class add dev $IDEV parent 10:1 classid 10:2$i htb rate $DOWNLOAD ceil $DOWNLOAD prio 1
tc qdisc add dev $IDEV parent 10:2$i handle 100$i: pfifo
tc filter add dev $IDEV parent 10: protocol ip prio 100 handle 2$i fw classid 10:2$i
i=`expr $i + 1`
done

#定义default 类别编的下行 (上面没有定义带宽IP的下行速度)
tc class add dev $IDEV parent 10:1 classid 10:2254 htb rate 50kbps ceil 50kbps prio 1
tc qdisc add dev $IDEV parent 10:2254 handle 100254: pfifo
tc filter add dev $IDEV parent 10: protocol ip prio 100 handle 2254 fw classid 10:2254

#按IP 控制up 和 dwon
i=$IPS;
while [ $i -le $IPE ]
do
iptables -t mangle -A PREROUTING -s $INET$i -j MARK --set-mark 2$i
# downloads
iptables -t mangle -A POSTROUTING -d $INET$i -j MARK --set-mark 2$i
i=`expr $i + 1`
done

[ 本帖最后由 ekinmagic 于 2007-3-9 18:38 编辑 ]




楼主中使用之单位kbps(千位)是KB(千字节)的意思,这一点一定注意
例如:你的上行总带宽为512kbps ,在这里要填为up=52kbps
           你的下行总带宽为2048kbps,在这里要填为up=230kbps
后面的类同




#!/bin/sh
#
# Coyote local command init script

# 清除 ppp0 所有队列规则
tc qdisc del dev ppp0 root 2>/dev/null

# 定义最顶层(根)队列规则,并指定 default 类别编号
tc qdisc add dev ppp0 root handle 10: htb default 20

# 定义第一层的 10:1 类别 (总频宽)
tc class add dev ppp0 parent 10: classid 10:1 htb rate 64kbps ceil 64kbps

# 定义第二层叶类别
# rate 保证频宽,ceil 最大频宽,prio 优先权
tc class add dev ppp0 parent 10:1 classid 10:10 htb rate 10kbps ceil 10kbps prio 2
tc class add dev ppp0 parent 10:1 classid 10:20 htb rate 60kbps ceil 60kbps prio 1


# 定义各叶类别的队列规则
# parent 类别编号,handle 叶类别队列规则编号
# 由于采用 fw 过滤器,所以此处使用 pfifo 的队列规则即可
tc qdisc add dev ppp0 parent 10:10 handle 101: pfifo
tc qdisc add dev ppp0 parent 10:20 handle 102: pfifo


# 设定过滤器
# 指定贴有 10 标签 (handle) 的封包,归类到 10:10 类别,以此类推
tc filter add dev ppp0 parent 10: protocol ip prio 100 handle 10 fw classid 10:10
tc filter add dev ppp0 parent 10: protocol ip prio 100 handle 20 fw classid 10:20




# QoS eth0  下载方面
#

# 清除 eth0所有队列规则
tc qdisc del dev eth0 root 2>/dev/null

# 定义最顶层(根)队列规则,并指定 default 类别编号
tc qdisc add dev eth0 root handle 10: htb default 30

# 定义第一层的 10:1 类别 (总频宽)
tc class add dev eth0 parent 10: classid 10:1 htb rate 128kbps ceil 128kbps

# 定义第二层叶类别
# rate 保证频宽,ceil 最大频宽,prio 优先权
tc class add dev eth0 parent 10:1 classid 10:10 htb rate 20kbps ceil 20kbps prio 2
tc class add dev eth0 parent 10:1 classid 10:20 htb rate 128kbps ceil 128kbps prio 1

# 定义各叶类别的队列规则
# parent 类别编号,handle 叶类别队列规则编号
tc qdisc add dev eth0 parent 10:10 handle 101: pfifo
tc qdisc add dev eth0 parent 10:20 handle 102: pfifo

# 设定过滤器
tc filter add dev eth0 parent 10: protocol ip prio 100 handle 10 fw  classid 10:10
tc filter add dev eth0 parent 10: protocol ip prio 100 handle 20 fw  classid 10:20

# uploads
# 设定上传方面,先利用 iptables 给封包贴标签,再交由 fw 过滤器进行过滤


iptables -t mangle -A PREROUTING -s 192.168.1.188 -j MARK --set-mark 10


# downloads
# 下载方面


iptables -t mangle -A POSTROUTING -d 192.168.1.188 -j MARK --set-mark 10



如果是动态的就把PPP0该eth1

离线double123.
发帖
2094
C币
-604838
威望
395
贡献值
1
银元
-5
铜钱
4662
人人网人气币
0
只看该作者 4楼 发表于: 2010-04-13


QUOTE:原帖由 shdnzwy 于 2008-2-28 08:50 发表
楼主,我不太明白有关规则,能不能给我一本学习IPTABLE和TC命令的书?下面是我用的DDWRT路由器上的命令脚本,因没有了解规则,没有放上去,楼主帮我分析下:

最新0.3版本 简化了代码! 其中使用之单位kbps(千 ...



好的资料,建议你可以看看白金大哥的精华帖子:
http://linux.chinaunix.net/bbs/thread-722462-1-1.html
TC方面有电子档,你可以看看
Linux的高级路由和流量控制北京沙龙讲座录音
http://www.chinaunix.net/topics/salon/9/2005-07-01/8.shtml

你也可以PM白金大哥帮你看看脚本,最近忙搬家,没时间看脚本不好意思

离线dm15.
发帖
2010
C币
-60893
威望
371
贡献值
1
银元
-1
铜钱
4454
人人网人气币
0
只看该作者 5楼 发表于: 2010-04-13
谢谢,我学习下先……

离线笨笨猪.
发帖
2239
C币
-234812
威望
406
贡献值
1
银元
-2
铜钱
5086
人人网人气币
0
只看该作者 6楼 发表于: 2010-04-13
总结一点!上行和下行唯一的区别就是所针对的接口不同而已,为什么还要搞这么久!

快速回复
限100 字节
如果您提交过一次失败了,可以用”恢复数据”来恢复帖子内容
 
上一个 下一个