LPI 发表于 2005-10-4 23:48:07

[教学] 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


########################################

LPI 发表于 2005-10-4 23:59:49

补充设定过程范例:

网络环境:
-----------------------------------------------------
网络频宽: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 00:39:05

这样的帖子,不顶说不过去了。

顺便沙发。

[ 本帖最后由 analyst 于 2005-10-5 12:40 AM 编辑 ]

yub 发表于 2005-10-5 07:20:34

#   谢谢 保存学习, 能给原文URL? 有图不能显示.................

redbird 发表于 2005-10-6 09:29:30

太需要这样的帖子了,说实在的我还真是不太明白什么Qos。非常感谢楼主。

redbird 发表于 2005-10-6 16:17:49

楼主实在太辛苦了,说得很明白,有时间一定要试一下。

a99456820 发表于 2005-10-7 17:28:28

DreamCat 发表于 2005-10-8 13:53:21

感谢LPI~

小智 发表于 2005-10-9 10:57:32

ab30 发表于 2005-10-9 11:11:51

此贴太好、太详细了。实在难得。

dream.chong 发表于 2005-10-23 23:42:53

好难得啊。。。可惜就是没有图片了。。真可惜

ttsee 发表于 2005-10-26 01:12:47

很详细

谢谢

xiangli 发表于 2005-10-28 13:11:12

我按此文章试了一下,结果网内机器都不能打开网页了。主要设置如下,各位能帮看看哪儿出了问题吗?
我用的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 编辑 ]

wty 发表于 2005-11-4 12:37:42

好贴!

fuger 发表于 2005-11-4 15:50:22

这个?没有图片,还是不会设置!
页: [1] 2 3
查看完整版本: [教学] Coyote Linux 频宽管制 (QoS) 设定教学