[教学] Coyote Linux 频宽管制 (QoS) 设定教学
Coyote Linux 频宽管制 (QoS) 设定教学大家好,我来自台湾,此帖文章是由繁体中文转简体中文
原刊载于台湾 PCZONE 论坛,转贴于此,提供有需要的朋友参考
前言:
----------------------------------------------------------------------
此篇教学以 Coyote Linux 软件路由器为范例系统
演示如何以 tc 指令设定 QoS 频宽管制
由于 Coyote Linux,即是精简型 Linux
所以此篇 Linux QoS 设定原理,亦适用任何 Linux distro 发行版
以下教学内容会有点复杂,但完成的效果,可以媲美一台几万元的硬件路由器,物超所值。
名词解释:
--------------------------------------------------------------------
QoS (Quality of Service):网络服务质量保证,俗称的频宽管制。
队列规则 (qdisc):
队列 (Queue) 是网卡存放外送封包的地方
可以想象成是高速公路的交流道
如同交流道是用来管制高速公路(网络)的车流量(封包流量)
队列规则就是用来管制网络流量的规则
若没有设定,预设的规则是 FIFO (First In First Out,先进先出) ,意即完全无管制。
Linux QoS 的队列规则有两种:CBQ,HTB
CBQ (Class Based Queueing) 的设定比较复杂,但可设定的东西较多,弹性较大
HTB (Hierarchy Token Bucket) 是 CBQ 的改良版 ,设定较精简,效能也比 CBQ 来的好
此篇教学,以 HTB 为主。
类别 (class):
类别是一个集合,举例要把频宽分成:看网页类,玩在线游戏类,P2P 下载类....等等
P2P 下载类:不需要实时反应,所以给予最少的频宽,最低的优先权
看网页类:频宽大一点,才不会等到睡着,但优先权用普通的即可
玩在线游戏类:玩在线游戏最怕的就是和人 PK 时网络 LAG,LAG 一下可能就输了,所以优先权要最高,这是无庸置疑的
过滤器:
检查封包该属于哪个类别,并给予归类的东西,称作过滤器。
Linux QoS 过滤器有两种:u32,fw
u32: 设定比较复杂,需懂封包结构,才有办法设定
fw:fw 是靠 iptables 给封包贴标签,设定比较简单
此篇教学,以 fw 为主。
iptables 指令:
Linux 负责防火墙功能的,是一个叫 NetFilter 的模块,而 iptables 就是用来设定 NetFilter 模块的指令。
tc 指令:
Linux 负责QoS (频宽管制) 功能的,是一个叫 Traffic Control 的模块,而 tc 就是用来设定 Traffic Control 模块的指令。
shell script:
俗称脚本文件(剧本),Linux 操作系统会依照里面的内容,逐行执行程序
类似 windows 下的 .bat 自动批次文件,但 shell script 功能比较强
在设定 QoS 的时候,往往要打上几十行的指令
但是打了这一大堆东西,重开机之后就会消失
所以要把这些指令,编辑成一个脚本文件,让计算机一开机就执行。
###############################################################################
教学开始 ↓
规划篇: (分配频宽,定义类别)
-----------------------------------------------------------------------
由于 QoS 要先计算出整体频宽,给予分配,才有办法设定
所以在设定之前,必须先进行规划的前置作业
导读:
讲解「类别」原理的部份,因为较深入可能会比较烦,可省略跳过
最重要的部分,是要完成那个频宽计算分配表,因为底下实作时必须填入分配的数字。
http://home.pchome.com.tw/art/linux2005/images/web/pczone/tc/001.gif
此次教学示范的网络架构如上
对外网卡:eth1
对内网卡:eth0
将分配频宽给三台 PC 计算机
每台计算机可以得到各自的保证的频宽,以及可借用的最大频宽
另有一台 服务器,上面有 web、e-mail、dns 三个服务
近来利用 ADSL 在家里架设服务器的人数也有增多的趋势
故此次教学,也示范如何管制服务器的频宽
default (预设) 类别
指如果封包不属于那三台计算机,也不属于服务器,则归类于 default 类别,进行频宽控管
具体来说,此种情况就是笔记型计算机,PDA,PSP掌上游戏机....... 等等之类,有使用到网络频宽的设备
http://home.pchome.com.tw/art/linux2005/images/web/pczone/tc/002.gif
首先,第一步要计算出「合理的频宽分配」
分配频宽,就像在分家产一样,务必公平合理,否则 QoS 便无法运作,或者无法达到预期的效果
请拿出纸、笔、计算器,或者利用电子表格软件,进行计算
此次的范例是 ADSL 2M/51K
HTB 队列规则用的是 KByte/s ,所以要先换算
ADSL 的频宽单位,是 bps (bits per second)
--------------------------------------
8 bps = 1 Byte/s
下载 2Mbps = 256 KB/s
上传 512Kbps =64 KB/s
保证下载,保证上传:是手动填入的数字
「保证」指的是无论如何,别的「类别」都不能来抢这个频宽
这个值不宜设太大,因为还可以借用频宽,且保证设太大,整体频宽都用完了,就失去意义了
一般建议值是每台计算机的保证上传,最少要有 32Kbps = 4KB/s
其余数值,是公式计算所得,计算方式如下:
-----------------------------------------------------------------
剩余频宽(可借用的频宽量) = 总频宽 - 保证频宽总和
最大下载 = 保证下载 + 下载剩余频宽
最大上传 = 保证上传 + 上传剩余频宽
最大下载,最大上传:亦可填入固定数字
「最大」指的是无论如何,该「类别」能使用的频宽不会超过这个数字
优先权:指谁可以有较大权力抢用剩余频宽,由 0 开始的整数,数字愈小,优先权愈高,0 为最高优先权。
以上表的例子来说
192.168.1.1 这台计算机是笔者所用,俗话说肥水不落外人田,当然优先权为 0 最高
其余计算机设 1,优先权普通,但若有特别的下载狂,可考虑降低他的优先权
至于服务器的 http、smtp、dns 等对外的服务,服务的是外面的人
优先权可设小一点,以不干扰自己内部的人使用网络为原则
http://home.pchome.com.tw/art/linux2005/images/web/pczone/tc/003.gif
http://home.pchome.com.tw/art/linux2005/images/web/pczone/tc/004.gif
Linux QoS 有三要素:队列规则、类别、过滤器
完成了这三项的设定,也就完成了 Linux QoS 的设定
在计算分配好频宽表的前置作业之后,接着要做的事,是规划「类别」
---------------------------------------------------------------------------
Q.为什么「类别」规划,会分成 下载、上传 两部份?
前面提到「队列」是网卡存放外送封包的地方,故「队列规则」也只能管制外送的封包
『Linux Advanced Routing & Traffic Control HOWTO』文件
用一个生动的比喻,来解释这种情况:
"我们只能规定自己写多少信给别人,无法限制每天会有多少人写信给我们"
简单的说,Linux QoS 只能管制网卡往外传送的流量
不过这并不是说 Linux QoS 只能管制上传
因 NAT 主机上,会有两片网卡
「对外网卡」往外传送,称之为:上传
「对内网卡」往外传送,称之为:下载
所以若要同时进行 上传/下载 的双向管制,必要条件为两片网卡
整个 Qos 的设定,亦会分成两部分,上传 和 下载
-------------------------------------------------------------------------
类别规划图,看起来像一张树形图
实体网卡的队列规则,称作「根」队列规则
其下的类别,就像叶子一样,又称「叶类别」
而最末尾的「叶类别」,必须带有「叶队列规则」
您可能会注意到,每个「队列规则」、「类别」都有编号
这是因为待会实作下指令时,必须用到
编号中的冒号为必须
「队列规则」只有冒号左边有数字
「叶类别」冒号左边数字是指挂在哪个「根队列规则」,右边则是「叶类别」的编号
编号是随人高兴取的,但习惯上,会有一些固定的取法
「根队列规则」会取编号 10:
第 1 层,第 1 个「叶类别」,取编号 10:1
第 2 层,第 1 个「叶类别」,取编号 10:10
第 2 层,第 2 个「叶类别」,取编号 10:20 ..........以此类推
最末尾的「叶队列规则」,取编号 101: 、102: ......以此类推
此范例图,是只有二层架构的树形图
实际上,Linux QoS 的类别规划,最多可以到八层,应用在规划网段的频宽管制
但一般用途,规划到二层即够使用,故不再做多层规划的范例
若对多层规划有兴趣,请参考 Linux QoS 相关书籍
类别规划图,可画也可不画
画出来的话,可以帮助 QoS 设定更容易了解
不过下面的实作教学,将会提供参考用原始码,小部份修改后,直接套用即可^^
#################################################################################
实作篇: (开始实际设定 Linux QoS )
-----------------------------------------------------------------------------------------
实作篇,将开始用 tc 指令,和 iptables 指令,撰写 shell script,实现 Linux QoS
原理讲解的部份,由于上面规划篇的时候,已经差不多都讲解完了
再者指令的语法是变化多端的,碍于篇幅
因此底下实作篇将不做任何原理方面的讲解
改以直接秀出参考用原始码的方法,小部分修改后,套用即可
Coyote 自定义 QoS 设定步骤:(看图说故事)
STEP.1
http://home.pchome.com.tw/art/linux2005/images/web/pczone/tc/005.gif
STEP.2
http://home.pchome.com.tw/art/linux2005/images/web/pczone/tc/006.gif
STEP.3
http://home.pchome.com.tw/art/linux2005/images/web/pczone/tc/007.gif
STEP.4
http://home.pchome.com.tw/art/linux2005/images/web/pczone/tc/008.gif
STEP.5
http://home.pchome.com.tw/art/linux2005/images/web/pczone/tc/009.gif
STEP.6
http://home.pchome.com.tw/art/linux2005/images/web/pczone/tc/010.gif
STEP.7
http://home.pchome.com.tw/art/linux2005/images/web/pczone/tc/011.gif
##############################################
Linux QoS 参考用原始码
基本说明:
1.凡是以 # 符号开头,代表该行为批注,不会被系统执行
2.第一行的 #!/bin/sh 为 shell script 必要语法,不可删除
3.Coyote 不支持 Big5 中文,所以中文批注贴上后会变成乱码,是正常的
4.若要显示中文批注,需转码成 UTF-8 (无 BOM格式)
tc 指令 ( /etc/rc.d/rc.local ):
#!/bin/sh
#
# Coyote local command init script
# 清除 eth1 所有队列规则
tc qdisc del dev eth1 root 2>/dev/null
# 定义最顶层(根)队列规则,并指定 default 类别编号
tc qdisc add dev eth1 root handle 10: htb default 70
# 定义第一层的 10:1 类别 (总频宽)
tc class add dev eth1 parent 10:classid 10:1 htb rate 64kbps ceil 64kbps
# 定义第二层叶类别
# rate 保证频宽,ceil 最大频宽,prio 优先权
tc class add dev eth1 parent 10:1 classid 10:10 htb rate 2kbps ceil 4kbps prio 2
tc class add dev eth1 parent 10:1 classid 10:20 htb rate 2kbps ceil 4kbps prio 2
tc class add dev eth1 parent 10:1 classid 10:30 htb rate 32kbps ceil 40kbps prio 3
tc class add dev eth1 parent 10:1 classid 10:40 htb rate 8kbps ceil 16kbps prio 0
tc class add dev eth1 parent 10:1 classid 10:50 htb rate 4kbps ceil 12kbps prio 1
tc class add dev eth1 parent 10:1 classid 10:60 htb rate 4kbps ceil 12kbps prio 1
tc class add dev eth1 parent 10:1 classid 10:70 htb rate 4kbps ceil 12kbps prio 1
# 定义各叶类别的队列规则
# parent 类别编号,handle 叶类别队列规则编号
# 由于采用 fw 过滤器,所以此处使用 pfifo 的队列规则即可
tc qdisc add dev eth1 parent 10:10 handle 101: pfifo
tc qdisc add dev eth1 parent 10:20 handle 102: pfifo
tc qdisc add dev eth1 parent 10:30 handle 103: pfifo
tc qdisc add dev eth1 parent 10:40 handle 104: pfifo
tc qdisc add dev eth1 parent 10:50 handle 105: pfifo
tc qdisc add dev eth1 parent 10:60 handle 106: pfifo
tc qdisc add dev eth1 parent 10:70 handle 107: pfifo
# 设定过滤器
# 指定贴有 10 标签 (handle) 的封包,归类到 10:10 类别,以此类推
tc filter add dev eth1 parent 10: protocol ip prio 100 handle 10 fw classid 10:10
tc filter add dev eth1 parent 10: protocol ip prio 100 handle 20 fw classid 10:20
tc filter add dev eth1 parent 10: protocol ip prio 100 handle 30 fw classid 10:30
tc filter add dev eth1 parent 10: protocol ip prio 100 handle 40 fw classid 10:40
tc filter add dev eth1 parent 10: protocol ip prio 100 handle 50 fw classid 10:50
tc filter add dev eth1 parent 10: protocol ip prio 100 handle 60 fw classid 10:60
tc filter add dev eth1 parent 10: protocol ip prio 100 handle 70 fw classid 10:70
# QoS eth0下载方面
#
# 清除 eth0所有队列规则
tc qdisc del dev eth0 root 2>/dev/null
# 定义最顶层(根)队列规则,并指定 default 类别编号
tc qdisc add dev eth0 root handle 10: htb default 70
# 定义第一层的 10:1 类别 (总频宽)
tc class add dev eth0 parent 10:classid 10:1 htb rate 256kbps ceil 256kbps
# 定义第二层叶类别
# rate 保证频宽,ceil 最大频宽,prio 优先权
tc class add dev eth0 parent 10:1 classid 10:10 htb rate 2kbps ceil 32kbps prio 2
tc class add dev eth0 parent 10:1 classid 10:20 htb rate 2kbps ceil 32kbps prio 2
tc class add dev eth0 parent 10:1 classid 10:30 htb rate 32kbps ceil 212kbps prio 3
tc class add dev eth0 parent 10:1 classid 10:40 htb rate 16kbps ceil 196kbps prio 0
tc class add dev eth0 parent 10:1 classid 10:50 htb rate 8kbps ceil 188kbps prio 1
tc class add dev eth0 parent 10:1 classid 10:60 htb rate 8kbps ceil 188kbps prio 1
tc class add dev eth0 parent 10:1 classid 10:70 htb rate 8kbps ceil 188kbps 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 qdisc add dev eth0 parent 10:30 handle 103: pfifo
tc qdisc add dev eth0 parent 10:40 handle 104: pfifo
tc qdisc add dev eth0 parent 10:50 handle 105: pfifo
tc qdisc add dev eth0 parent 10:60 handle 106: pfifo
tc qdisc add dev eth0 parent 10:70 handle 107: pfifo
# 设定过滤器
tc filter add dev eth0 parent 10: protocol ip prio 100 handle 10 fwclassid 10:10
tc filter add dev eth0 parent 10: protocol ip prio 100 handle 20 fwclassid 10:20
tc filter add dev eth0 parent 10: protocol ip prio 100 handle 30 fwclassid 10:30
tc filter add dev eth0 parent 10: protocol ip prio 100 handle 40 fwclassid 10:40
tc filter add dev eth0 parent 10: protocol ip prio 100 handle 50 fwclassid 10:50
tc filter add dev eth0 parent 10: protocol ip prio 100 handle 60 fwclassid 10:60
tc filter add dev eth0 parent 10: protocol ip prio 100 handle 70 fwclassid 10:70
说明:
--------------------------------
这边的 eh1 是对外网卡,eth0 是对内网卡
若与您的实际环境不同,请自行修改
主要过程:
1.清除网卡上的所有队列规则 (不论有或没有)
2.定义网卡的队列规则
3.定义各类别
4.定义各类别的队列规则
5.定义过滤器
rate 后面的数字:保证频宽
ceil 后面的数字:最大频宽
单位只有:KByte/s ,不过上面要写 kbps,因为这是 HTB 的规定语法
prio 后面的数字:优先权,数字愈低愈高,0最大
classid 后面的编号:完整类别编号
parent 后面的编号:父类别,或者队列规则,亦即该项目上一层的对象
这里列出了 7 个类别,可以自行新增或减少
default 类别,可有可无
较严谨的频宽管制,可取消 default 类别,以避免内部有人钻漏洞
一般情况,则建议设 default 比较好
注1:可参考前面的「类别规划示意图」,比较容易了解此处的设定用意
注2:这段参考用原始码,只是一个范例,必须修改后,才能符合您的环境
iptables 指令,过滤器 (编辑自定义防火墙规则) :
# uploads
# 设定上传方面,先利用 iptables 给封包贴标签,再交由 fw 过滤器进行过滤
iptables -t mangle -A PREROUTING -s 192.168.1.6 -m layer7 --l7proto dns -j mark --set-mark 10
iptables -t mangle -A PREROUTING -s 192.168.1.6 -m layer7 --l7proto smtp -j mark --set-mark 20
iptables -t mangle -A PREROUTING -s 192.168.1.6 -m layer7 --l7proto http -j mark --set-mark 30
iptables -t mangle -A PREROUTING -s 192.168.1.1 -j mark --set-mark 40
iptables -t mangle -A PREROUTING -s 192.168.1.2 -j mark --set-mark 50
iptables -t mangle -A PREROUTING -s 192.168.1.3 -j mark --set-mark 60
# downloads
# 下载方面
iptables -t mangle -A POSTROUTING -d 192.168.1.6 -m layer7 --l7proto dns -j mark --set-mark 10
iptables -t mangle -A POSTROUTING -d 192.168.1.6 -m layer7 --l7proto smtp -j mark --set-mark 20
iptables -t mangle -A POSTROUTING -d 192.168.1.6 -m layer7 --l7proto http -j mark --set-mark 30
iptables -t mangle -A POSTROUTING -d 192.168.1.1 -j mark --set-mark 40
iptables -t mangle -A POSTROUTING -d 192.168.1.2 -j mark --set-mark 50
iptables -t mangle -A POSTROUTING -d 192.168.1.3 -j mark --set-mark 60
说明:
--------------------
iptables 会去检查封包,看它来自哪里,或者 Layer-7 协议是哪种的 ,然后贴上标签
之后 fw 过滤器,会依照卷标上的数字,来给封包归类别
IP:计算机的 IP
Layer-7 协定种类:
此部份是采用 l7-filter 直接做过滤,例如:dns,smtp,http
P2P 下载的封包,也可以管制
l7-filter 详细用法请参考 Coyote 的教学文章,补充说明
mark 后面的数字:「类别」的编号
注:这段参考用原始码,只是一个范例,必须修改后,才能符合您的环境
#############################################################################
Linux QoS 设定,看似复杂,然其实可以做到非常弹性化 (可程序化)
其效能是取决 CPU、RAM、网卡芯片,可由使用者自行决定组装等级
若使用高等配备,并不会输给一台几万元的昂贵硬件路由器
且在价格上,更具优势
Linux QoS 的技术
基础的像此篇管制小型网络频宽之应用
进阶的可以配合 l7-filter 做 service 的频宽管制
到深入一点,复杂一点的
更可以藉由 iproute2 多重路由,达到多WAN的架构
##########################################
补充 01:
##########################################
FW 过滤器使用方法补充说明
附加说明:如何限制 P2P 下载?
Linux QoS 有三要素:队列规则,类别,过滤器
队列规则是实际负责 QoS 的单位
类别是定义 「频宽大小」的单位
而过滤器,顾名思义,就是用来过滤封包,判断封包该属于哪个类别的单位
换句话说,要限制 P2P....等等之类,关键就在于「过滤器」
只要「过滤器」有办法把 P2P 的封包抓出来,那么要管制它就不难了
FW 实际上是靠 iptables 给封包贴标签
然后 FW 再依照标签编号,给封包归类别
所以下面讲的,其实是 iptables 的语法.....
iptables 语法简单讲解:
------------------------------------
iptables -t mangle -A PREROUTING -s 192.168.1.1 -j mark --set-mark 10
iptables -t mangle -A POSTROUTING -d 192.168.1.1 -j mark --set-mark 10
-t mangle:指定使用 mangle 表格 (QoS 要用这个表格)
-A:新增一条规则
PPRROUTING:上传方向,是内部计算机传出去的,后面加 -s 来源端
POSTROUTING:下传方向,是外面网络传进来的,后面 -d 目的地
-s:来源端
-d:目的地
-j mark:处理动作,给予贴标签
--set-mark:贴什么卷标,数字指定于后
※ 重要:
在 Linux下, 所有的指令和文件名,都有分英文大小写
PREROUTING 和 prerouting 所代表的意义是不同的,后者是错误语法
--------------------------------------
iptables 给封包贴卷标时,「比对规则」有以下六种基本型态:
(基本型态可混搭,变成更严谨的复杂型态)
1.针对 IP 过滤
iptables -t mangle -A PREROUTING -s 192.168.1.1 -j mark --set-mark 10
2.针对「网段」过滤
iptables -t mangle -A PREROUTING -s 192.168.1.0/24 -j mark --set-mark 10
3.针对 MAC 过滤
iptables -t mangle -A PREROUTING -m --mac-source 00:00:AA:BB:CC:EE -j mark --set-mark 10
4.针对 PORT 过滤
iptables -t mangle -A PREROUTING -p tcp --sport 80 -j mark --set-mark 10
iptables -t mangle -A POSTROUTING -p tcp --dport 80 -j mark --set-mark 10
iptables -t mangle -A PREROUTING -p udp --sport 53 -j mark --set-mark 10
iptables -t mangle -A PREROUTING -p icmp -j mark --set-mark 10
5.针对 「网卡接口」过滤 (假如对内有多片网卡的话,-i 进入方向, -o 出去方向)
iptables -t mangle -A PREROUTING -o eth0 -j mark --set-mark 10
iptables -t mangle -A POSTROUTING -i eth0 -j mark --set-mark 10
6. l7-filter 过滤
iptables -t mangle -A PREROUTING-m layer7 --l7proto bittorrent -j mark --set-mark 10
( BT上传方向的封包,给予贴标签 10 )
iptables -t mangle -A POSTROUTING-m layer7 --l7proto edonkey -j mark --set-mark 10
( 驴子 下载方向的封包,给予贴标签 10 )
若要管制 P2P 下载,就是把 bittorrent 和 edonkey 两个 L7 协定
各设置 上传/下载,共4条过滤器规则
并把这4条规则的封包,通通给予贴某一个类别的标签,例如:90
让过滤器把 P2P 的封包,丢给该类别 10:90 去处理即可
注:此部份仅是设定「过滤器」,实际在处理 QoS 的是「队列规则」、「类别」,所以另一边也必须有相对应的设定。例如:必须定义 10:90 这个类别的频宽,整个 P2P 管制的 QoS 才会生效。
附录:Coyote 可用 l7-filter 协定一览表
http://home.pchome.com.tw/art/linux2005/images/web/pczone/coyote/l7-filter003.gif
######################################## 补充设定过程范例:
网络环境:
-----------------------------------------------------
网络频宽:ADSL 1M/64K
计算机1:192.168.1.1,有玩在线游戏的需求
计算机2:192.168.1.2,平常只做浏览网页用途
STEP.1
首先要查出,对外网卡(管制上传),对内网卡(管制下载),它们的编号是多少
http://img397.imageshack.us/img397/3036/0016cc.gif
http://img381.imageshack.us/img381/2706/0022jb.gif
如图所示,这种情况的话,eth0 是对内网卡(管制下载),而 eth1 就是对外网卡(管制上传)。
网卡的编号不是绝对的,可能每台机器都不相同,所以先观察网卡编号,判断哪个是「对外网卡」,那个是「对内网卡」,才能继续往下设定。
STEP.2
先构想要如何分配频宽
1M/64K,总下载 128KB/s,总上传 8KB/s
假设有两台计算机,分别为:
192.168.1.1:玩天堂2专用的
192.168.1.2:看网页用的
那么规划出 3 个类别:
---------------------------------------
第一台计算机 - 玩天堂2用类别:在线游戏要不LAG 最少要保证有4KB/s 上传能力
第二台计算机 - 看网页用类别:看网页首重下载,只要能动即可,速度不重要
default 类别:为保留可能性额外加入的计算机,特地保留这个类别。例如有可能家中原本只有两台计算机,某天临时又插入一台需要上网,它就会吃 default 的类别频宽。但是这个类别只是有备无患,并不一定会用到,所以保证频宽设0。
http://img111.imageshack.us/img111/2996/0032ca.gif
STEP.3
tc 指令部份: (编辑任意档:/etc/rc.d/rc.local )
#!/bin/sh
#
# Coyote local command init script
#上传方面
# 清除 eth1 所有队列规则
tc qdisc del dev eth1 root 2>/dev/null
# 定义最顶层(根)队列规则,并指定 default 类别编号
tc qdisc add dev eth1 root handle 10: htb default 30
# 定义第一层的 10:1 类别 (总频宽)
tc class add dev eth1 parent 10: classid 10:1 htb rate 8kbps ceil 8kbps
# 定义第二层叶类别
# rate 保证频宽,ceil 最大频宽,prio 优先权
tc class add dev eth1 parent 10:1 classid 10:10 htb rate 4kbps ceil 6kbps prio 0
tc class add dev eth1 parent 10:1 classid 10:20 htb rate 2kbps ceil 4kbps prio 1
tc class add dev eth1 parent 10:1 classid 10:30 htb rate 0kbps ceil 2kbps prio 2
# 定义各叶类别的队列规则
tc qdisc add dev eth1 parent 10:10 handle 101: pfifo
tc qdisc add dev eth1 parent 10:20 handle 102: pfifo
tc qdisc add dev eth1 parent 10:30 handle 103: pfifo
t
# 设定过滤器
tc filter add dev eth1 parent 10: protocol ip prio 100 handle 10 fw classid 10:10
tc filter add dev eth1 parent 10: protocol ip prio 100 handle 20 fw classid 10:20
tc filter add dev eth1 parent 10: protocol ip prio 100 handle 30 fw classid 10:30
# QoS eth0 下载方面
#
# 清除 eth0所有队列规则
tc qdisc del dev eth0 root 2>/dev/null
# 定义最顶层(根)队列规则,并指定 default 类别编号
tc qdisc add dev eth0 root handle 10: htb default 70
# 定义第一层的 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 32kbps ceil 120kbps prio 0
tc class add dev eth0 parent 10:1 classid 10:20 htb rate 8kbps ceil 96kbps prio 1
tc class add dev eth0 parent 10:1 classid 10:30 htb rate 0kbps ceil 88kbps prio 2
# 定义各叶类别的队列规则
tc qdisc add dev eth0 parent 10:10 handle 101: pfifo
tc qdisc add dev eth0 parent 10:20 handle 102: pfifo
tc qdisc add dev eth0 parent 10:30 handle 103: 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
tc filter add dev eth0 parent 10: protocol ip prio 100 handle 30 fw classid 10:30
STEP.4
iptables 设定方面: (高级防火墙配置 - 编辑自订防火墙规则)
# uploads
# 设定上传方面,先利用 iptables 给封包贴标签,再交由 fw 过滤器进行过滤
iptables -t mangle -A PREROUTING -s 192.168.1.1 -j mark --set-mark 10
iptables -t mangle -A PREROUTING -s 192.168.1.2 -j mark --set-mark 20
# downloads
# 下载方面
iptables -t mangle -A POSTROUTING -d 192.168.1.1 -j mark --set-mark 10
iptables -t mangle -A POSTROUTING -d 192.168.1.2 -j mark --set-mark 20
以上范例仅供参考,必须配合网络环境情况,进行修改才能使用
--------------------------------------------------------------
有时候指令看起来好像很长一大串,很复杂
其实去掉批注,就剩没几行了
再仔细去观察去掉批注的指令串,可以发现
其实很多地方都是重复的,只有几个数字在改变而已
多观察,多实作几次,就可以熟练了
^_^ 这样的帖子,不顶说不过去了。
顺便沙发。
[ 本帖最后由 analyst 于 2005-10-5 12:40 AM 编辑 ] # 谢谢 保存学习, 能给原文URL? 有图不能显示................. 太需要这样的帖子了,说实在的我还真是不太明白什么Qos。非常感谢楼主。 楼主实在太辛苦了,说得很明白,有时间一定要试一下。 感谢LPI~ 顶 此贴太好、太详细了。实在难得。 好难得啊。。。可惜就是没有图片了。。真可惜 很详细
谢谢 我按此文章试了一下,结果网内机器都不能打开网页了。主要设置如下,各位能帮看看哪儿出了问题吗?
我用的CL2.24版的。eth1 为外网网卡,eth0为内网网卡,总带宽不少10M
/etc/rc.d/rc.local
#!/bin/sh
#
# Coyote local command init script
# 清除 eth1 所有队列规则
tc qdisc del dev eth1 root 2>/dev/null
# 定义最顶层(根)队列规则,并指定 default 类别编号
tc qdisc add dev eth1 root handle 10: htb default 70
# 定义第一层的 10:1 类别 (总频宽)
tc class add dev eth1 parent 10:classid 10:1 htb rate 2048kbps ceil 4096kbps
# 定义第二层叶类别
# rate 保证频宽,ceil 最大频宽,prio 优先权
#办公I,一般
tc class add dev eth1 parent 10:1 classid 10:10 htb rate 8kbps ceil 16kbps prio 2
#办公II
tc class add dev eth1 parent 10:1 classid 10:20 htb rate 24kbps ceil 64kbps prio 2
#办公III
tc class add dev eth1 parent 10:1 classid 10:30 htb rate 64kbps ceil 2048kbps prio 0
#家庭用户
tc class add dev eth1 parent 10:1 classid 10:40 htb rate 16kbps ceil 64kbps prio 1
#
tc class add dev eth1 parent 10:1 classid 10:50 htb rate 4kbps ceil 12kbps prio 1
#微机室
tc class add dev eth1 parent 10:1 classid 10:60 htb rate 128kbps ceil 4096kbps prio 0
#其它,临时
tc class add dev eth1 parent 10:1 classid 10:70 htb rate 4kbps ceil 12kbps prio 3
# 定义各叶类别的队列规则
# parent 类别编号,handle 叶类别队列规则编号
# 由于采用 fw 过滤器,所以此处使用 pfifo 的队列规则即可
tc qdisc add dev eth1 parent 10:10 handle 101: pfifo
tc qdisc add dev eth1 parent 10:20 handle 102: pfifo
tc qdisc add dev eth1 parent 10:30 handle 103: pfifo
tc qdisc add dev eth1 parent 10:40 handle 104: pfifo
tc qdisc add dev eth1 parent 10:50 handle 105: pfifo
tc qdisc add dev eth1 parent 10:60 handle 106: pfifo
tc qdisc add dev eth1 parent 10:70 handle 107: pfifo
# 设定过滤器
# 指定贴有 10 标签 (handle) 的封包,归类到 10:10 类别,以此类推
tc filter add dev eth1 parent 10: protocol ip prio 100 handle 10 fw classid 10:10
tc filter add dev eth1 parent 10: protocol ip prio 100 handle 20 fw classid 10:20
tc filter add dev eth1 parent 10: protocol ip prio 100 handle 30 fw classid 10:30
tc filter add dev eth1 parent 10: protocol ip prio 100 handle 40 fw classid 10:40
tc filter add dev eth1 parent 10: protocol ip prio 100 handle 50 fw classid 10:50
tc filter add dev eth1 parent 10: protocol ip prio 100 handle 60 fw classid 10:60
tc filter add dev eth1 parent 10: protocol ip prio 100 handle 70 fw classid 10:70
# QoS eth0下载方面
#
# 清除 eth0所有队列规则
tc qdisc del dev eth0 root 2>/dev/null
# 定义最顶层(根)队列规则,并指定 default 类别编号
tc qdisc add dev eth0 root handle 10: htb default 70
# 定义第一层的 10:1 类别 (总频宽)
tc class add dev eth0 parent 10:classid 10:1 htb rate 2048kbps ceil 4096kbps
# 定义第二层叶类别
# rate 保证频宽,ceil 最大频宽,prio 优先权
#办公I,一般
tc class add dev eth0 parent 10:1 classid 10:10 htb rate 16kbps ceil 32kbps prio 2
#办公II
tc class add dev eth0 parent 10:1 classid 10:20 htb rate 24kbps ceil 128kbps prio 2
#办公III
tc class add dev eth0 parent 10:1 classid 10:30 htb rate 64kbps ceil 2048kbps prio 0
#家庭用户
tc class add dev eth0 parent 10:1 classid 10:40 htb rate 32kbps ceil 128kbps prio 1
#
tc class add dev eth0 parent 10:1 classid 10:50 htb rate 4kbps ceil 12kbps prio 1
#微机室
tc class add dev eth0 parent 10:1 classid 10:60 htb rate 128kbps ceil 4096kbps prio 0
#其它,临时
tc class add dev eth0 parent 10:1 classid 10:70 htb rate 4kbps ceil 12kbps prio 3
# 定义各叶类别的队列规则
# 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 qdisc add dev eth0 parent 10:30 handle 103: pfifo
tc qdisc add dev eth0 parent 10:40 handle 104: pfifo
tc qdisc add dev eth0 parent 10:50 handle 105: pfifo
tc qdisc add dev eth0 parent 10:60 handle 106: pfifo
tc qdisc add dev eth0 parent 10:70 handle 107: pfifo
# 设定过滤器
tc filter add dev eth0 parent 10: protocol ip prio 100 handle 10 fwclassid 10:10
tc filter add dev eth0 parent 10: protocol ip prio 100 handle 20 fwclassid 10:20
tc filter add dev eth0 parent 10: protocol ip prio 100 handle 30 fwclassid 10:30
tc filter add dev eth0 parent 10: protocol ip prio 100 handle 40 fwclassid 10:40
tc filter add dev eth0 parent 10: protocol ip prio 100 handle 50 fwclassid 10:50
tc filter add dev eth0 parent 10: protocol ip prio 100 handle 60 fwclassid 10:60
tc filter add dev eth0 parent 10: protocol ip prio 100 handle 70 fwclassid 10:70
(自定义防火墙)
# uploads
# 设定上传方面,先利用 iptables 给封包贴标签,再交由 fw 过滤器进行过滤
iptables -t mangle -A PREROUTING -s 192.168.0.94 -j mark --set-mark 10
iptables -t mangle -A PREROUTING -s 192.168.0.91 -j mark --set-mark 20
iptables -t mangle -A PREROUTING -s 192.168.0.92 -j mark --set-mark 20
iptables -t mangle -A PREROUTING -s 192.168.0.93 -j mark --set-mark 20
iptables -t mangle -A PREROUTING -s 192.168.0.88 -j mark --set-mark 30
iptables -t mangle -A PREROUTING -s 192.168.0.18 -j mark --set-mark 60
iptables -t mangle -A PREROUTING -s 192.168.0.19 -j mark --set-mark 60
# downloads
# 下载方面
iptables -t mangle -A POSTROUTING -d 192.168.0.94 -j mark --set-mark 10
iptables -t mangle -A POSTROUTING -d 192.168.0.91 -j mark --set-mark 20
iptables -t mangle -A POSTROUTING -d 192.168.0.92 -j mark --set-mark 20
iptables -t mangle -A POSTROUTING -d 192.168.0.93 -j mark --set-mark 20
iptables -t mangle -A POSTROUTING -d 192.168.0.88 -j mark --set-mark 30
iptables -t mangle -A POSTROUTING -d 192.168.0.18 -j mark --set-mark 60
iptables -t mangle -A POSTROUTING -d 192.168.0.19 -j mark --set-mark 60
[ 本帖最后由 xiangli 于 2005-10-28 13:14 编辑 ] 好贴! 这个?没有图片,还是不会设置!