找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 42757|回复: 33

[linux] [教学] Coyote Linux 频宽管制 (QoS) 设定教学

[复制链接]
发表于 2005-10-4 23:48:07 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?注册

×
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 要先计算出整体频宽,给予分配,才有办法设定
所以在设定之前,必须先进行规划的前置作业

导读:
讲解「类别」原理的部份,因为较深入可能会比较烦,可省略跳过
最重要的部分,是要完成那个频宽计算分配表,因为底下实作时必须填入分配的数字。


                               
登录/注册后可看大图


此次教学示范的网络架构如上

对外网卡:eth1
对内网卡:eth0

将分配频宽给三台 PC 计算机
每台计算机可以得到各自的保证的频宽,以及可借用的最大频宽

另有一台 服务器,上面有 web、e-mail、dns 三个服务
近来利用 ADSL 在家里架设服务器的人数也有增多的趋势
故此次教学,也示范如何管制服务器的频宽

default (预设) 类别
指如果封包不属于那三台计算机,也不属于服务器,则归类于 default 类别,进行频宽控管
具体来说,此种情况就是笔记型计算机,PDA,PSP掌上游戏机....... 等等之类,有使用到网络频宽的设备



                               
登录/注册后可看大图


首先,第一步要计算出「合理的频宽分配」

分配频宽,就像在分家产一样,务必公平合理,否则 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 等对外的服务,服务的是外面的人
优先权可设小一点,以不干扰自己内部的人使用网络为原则



                               
登录/注册后可看大图



                               
登录/注册后可看大图


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

                               
登录/注册后可看大图


STEP.2

                               
登录/注册后可看大图


STEP.3

                               
登录/注册后可看大图


STEP.4

                               
登录/注册后可看大图


STEP.5

                               
登录/注册后可看大图


STEP.6

                               
登录/注册后可看大图


STEP.7

                               
登录/注册后可看大图


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

Linux QoS 参考用原始码

基本说明:

1.凡是以 # 符号开头,代表该行为批注,不会被系统执行
2.第一行的 #!/bin/sh 为 shell script 必要语法,不可删除
3.Coyote 不支持 Big5 中文,所以中文批注贴上后会变成乱码,是正常的
4.若要显示中文批注,需转码成 UTF-8 (无 BOM格式)


tc 指令 ( /etc/rc.d/rc.local )  :
  1. #!/bin/sh
  2. #
  3. # Coyote local command init script

  4. # 清除 eth1 所有队列规则
  5. tc qdisc del dev eth1 root 2>/dev/null

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

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

  10. # 定义第二层叶类别
  11. # rate 保证频宽,ceil 最大频宽,prio 优先权
  12. tc class add dev eth1 parent 10:1 classid 10:10 htb rate 2kbps ceil 4kbps prio 2
  13. tc class add dev eth1 parent 10:1 classid 10:20 htb rate 2kbps ceil 4kbps prio 2
  14. tc class add dev eth1 parent 10:1 classid 10:30 htb rate 32kbps ceil 40kbps prio 3


  15. tc class add dev eth1 parent 10:1 classid 10:40 htb rate 8kbps ceil 16kbps prio 0
  16. tc class add dev eth1 parent 10:1 classid 10:50 htb rate 4kbps ceil 12kbps prio 1
  17. tc class add dev eth1 parent 10:1 classid 10:60 htb rate 4kbps ceil 12kbps prio 1
  18. tc class add dev eth1 parent 10:1 classid 10:70 htb rate 4kbps ceil 12kbps prio 1


  19. # 定义各叶类别的队列规则
  20. # parent 类别编号,handle 叶类别队列规则编号
  21. # 由于采用 fw 过滤器,所以此处使用 pfifo 的队列规则即可
  22. tc qdisc add dev eth1 parent 10:10 handle 101: pfifo
  23. tc qdisc add dev eth1 parent 10:20 handle 102: pfifo
  24. tc qdisc add dev eth1 parent 10:30 handle 103: pfifo
  25. tc qdisc add dev eth1 parent 10:40 handle 104: pfifo
  26. tc qdisc add dev eth1 parent 10:50 handle 105: pfifo
  27. tc qdisc add dev eth1 parent 10:60 handle 106: pfifo
  28. tc qdisc add dev eth1 parent 10:70 handle 107: pfifo

  29. # 设定过滤器
  30. # 指定贴有 10 标签 (handle) 的封包,归类到 10:10 类别,以此类推
  31. tc filter add dev eth1 parent 10: protocol ip prio 100 handle 10 fw classid 10:10
  32. tc filter add dev eth1 parent 10: protocol ip prio 100 handle 20 fw classid 10:20
  33. tc filter add dev eth1 parent 10: protocol ip prio 100 handle 30 fw classid 10:30
  34. tc filter add dev eth1 parent 10: protocol ip prio 100 handle 40 fw classid 10:40
  35. tc filter add dev eth1 parent 10: protocol ip prio 100 handle 50 fw classid 10:50
  36. tc filter add dev eth1 parent 10: protocol ip prio 100 handle 60 fw classid 10:60
  37. tc filter add dev eth1 parent 10: protocol ip prio 100 handle 70 fw classid 10:70



  38. # QoS eth0  下载方面
  39. #

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

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

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

  46. # 定义第二层叶类别
  47. # rate 保证频宽,ceil 最大频宽,prio 优先权
  48. tc class add dev eth0 parent 10:1 classid 10:10 htb rate 2kbps ceil 32kbps prio 2
  49. tc class add dev eth0 parent 10:1 classid 10:20 htb rate 2kbps ceil 32kbps prio 2
  50. tc class add dev eth0 parent 10:1 classid 10:30 htb rate 32kbps ceil 212kbps prio 3

  51. tc class add dev eth0 parent 10:1 classid 10:40 htb rate 16kbps ceil 196kbps prio 0
  52. tc class add dev eth0 parent 10:1 classid 10:50 htb rate 8kbps ceil 188kbps prio 1
  53. tc class add dev eth0 parent 10:1 classid 10:60 htb rate 8kbps ceil 188kbps prio 1
  54. tc class add dev eth0 parent 10:1 classid 10:70 htb rate 8kbps ceil 188kbps prio 1

  55. # 定义各叶类别的队列规则
  56. # parent 类别编号,handle 叶类别队列规则编号
  57. tc qdisc add dev eth0 parent 10:10 handle 101: pfifo
  58. tc qdisc add dev eth0 parent 10:20 handle 102: pfifo
  59. tc qdisc add dev eth0 parent 10:30 handle 103: pfifo
  60. tc qdisc add dev eth0 parent 10:40 handle 104: pfifo
  61. tc qdisc add dev eth0 parent 10:50 handle 105: pfifo
  62. tc qdisc add dev eth0 parent 10:60 handle 106: pfifo
  63. tc qdisc add dev eth0 parent 10:70 handle 107: pfifo

  64. # 设定过滤器
  65. tc filter add dev eth0 parent 10: protocol ip prio 100 handle 10 fw  classid 10:10
  66. tc filter add dev eth0 parent 10: protocol ip prio 100 handle 20 fw  classid 10:20
  67. tc filter add dev eth0 parent 10: protocol ip prio 100 handle 30 fw  classid 10:30
  68. tc filter add dev eth0 parent 10: protocol ip prio 100 handle 40 fw  classid 10:40
  69. tc filter add dev eth0 parent 10: protocol ip prio 100 handle 50 fw  classid 10:50
  70. tc filter add dev eth0 parent 10: protocol ip prio 100 handle 60 fw  classid 10:60
  71. tc filter add dev eth0 parent 10: protocol ip prio 100 handle 70 fw  classid 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 指令,过滤器 (编辑自定义防火墙规则) :
  1. # uploads
  2. # 设定上传方面,先利用 iptables 给封包贴标签,再交由 fw 过滤器进行过滤

  3. iptables -t mangle -A PREROUTING -s 192.168.1.6 -m layer7 --l7proto dns -j mark --set-mark 10
  4. iptables -t mangle -A PREROUTING -s 192.168.1.6 -m layer7 --l7proto smtp -j mark --set-mark 20
  5. iptables -t mangle -A PREROUTING -s 192.168.1.6 -m layer7 --l7proto http -j mark --set-mark 30

  6. iptables -t mangle -A PREROUTING -s 192.168.1.1 -j mark --set-mark 40
  7. iptables -t mangle -A PREROUTING -s 192.168.1.2 -j mark --set-mark 50
  8. iptables -t mangle -A PREROUTING -s 192.168.1.3 -j mark --set-mark 60

  9. # downloads
  10. # 下载方面

  11. iptables -t mangle -A POSTROUTING -d 192.168.1.6 -m layer7 --l7proto dns -j mark --set-mark 10
  12. iptables -t mangle -A POSTROUTING -d 192.168.1.6 -m layer7 --l7proto smtp -j mark --set-mark 20
  13. iptables -t mangle -A POSTROUTING -d 192.168.1.6 -m layer7 --l7proto http -j mark --set-mark 30

  14. iptables -t mangle -A POSTROUTING -d 192.168.1.1 -j mark --set-mark 40
  15. iptables -t mangle -A POSTROUTING -d 192.168.1.2 -j mark --set-mark 50
  16. 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 协定一览表

                               
登录/注册后可看大图



########################################
routeros
 楼主| 发表于 2005-10-4 23:59:49 | 显示全部楼层
补充设定过程范例:

网络环境:
-----------------------------------------------------
网络频宽:ADSL 1M/64K
计算机1:192.168.1.1,有玩在线游戏的需求
计算机2:192.168.1.2,平常只做浏览网页用途


STEP.1
首先要查出,对外网卡(管制上传),对内网卡(管制下载),它们的编号是多少


                               
登录/注册后可看大图



                               
登录/注册后可看大图


如图所示,这种情况的话,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。


                               
登录/注册后可看大图



STEP.3

tc 指令部份: (编辑任意档:/etc/rc.d/rc.local )

  1. #!/bin/sh
  2. #
  3. # Coyote local command init script

  4. #上传方面
  5. # 清除 eth1 所有队列规则
  6. tc qdisc del dev eth1 root 2>/dev/null

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

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

  11. # 定义第二层叶类别
  12. # rate 保证频宽,ceil 最大频宽,prio 优先权
  13. tc class add dev eth1 parent 10:1 classid 10:10 htb rate 4kbps ceil 6kbps prio 0
  14. tc class add dev eth1 parent 10:1 classid 10:20 htb rate 2kbps ceil 4kbps prio 1
  15. tc class add dev eth1 parent 10:1 classid 10:30 htb rate 0kbps ceil 2kbps prio 2

  16. # 定义各叶类别的队列规则
  17. tc qdisc add dev eth1 parent 10:10 handle 101: pfifo
  18. tc qdisc add dev eth1 parent 10:20 handle 102: pfifo
  19. tc qdisc add dev eth1 parent 10:30 handle 103: pfifo
  20. t
  21. # 设定过滤器
  22. tc filter add dev eth1 parent 10: protocol ip prio 100 handle 10 fw classid 10:10
  23. tc filter add dev eth1 parent 10: protocol ip prio 100 handle 20 fw classid 10:20
  24. tc filter add dev eth1 parent 10: protocol ip prio 100 handle 30 fw classid 10:30


  25. # QoS eth0 下载方面
  26. #

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

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

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

  33. # 定义第二层叶类别
  34. # rate 保证频宽,ceil 最大频宽,prio 优先权
  35. tc class add dev eth0 parent 10:1 classid 10:10 htb rate 32kbps ceil 120kbps prio 0
  36. tc class add dev eth0 parent 10:1 classid 10:20 htb rate 8kbps ceil 96kbps prio 1
  37. tc class add dev eth0 parent 10:1 classid 10:30 htb rate 0kbps ceil 88kbps prio 2

  38. # 定义各叶类别的队列规则
  39. tc qdisc add dev eth0 parent 10:10 handle 101: pfifo
  40. tc qdisc add dev eth0 parent 10:20 handle 102: pfifo
  41. tc qdisc add dev eth0 parent 10:30 handle 103: pfifo


  42. # 设定过滤器
  43. tc filter add dev eth0 parent 10: protocol ip prio 100 handle 10 fw classid 10:10
  44. tc filter add dev eth0 parent 10: protocol ip prio 100 handle 20 fw classid 10:20
  45. tc filter add dev eth0 parent 10: protocol ip prio 100 handle 30 fw classid 10:30
复制代码



STEP.4

iptables 设定方面: (高级防火墙配置 - 编辑自订防火墙规则)

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

  3. iptables -t mangle -A PREROUTING -s 192.168.1.1 -j mark --set-mark 10
  4. iptables -t mangle -A PREROUTING -s 192.168.1.2 -j mark --set-mark 20

  5. # downloads
  6. # 下载方面

  7. iptables -t mangle -A POSTROUTING -d 192.168.1.1 -j mark --set-mark 10
  8. iptables -t mangle -A POSTROUTING -d 192.168.1.2 -j mark --set-mark 20

复制代码


以上范例仅供参考,必须配合网络环境情况,进行修改才能使用

--------------------------------------------------------------

有时候指令看起来好像很长一大串,很复杂
其实去掉批注,就剩没几行了

再仔细去观察去掉批注的指令串,可以发现
其实很多地方都是重复的,只有几个数字在改变而已

多观察,多实作几次,就可以熟练了

^_^
routeros
回复

使用道具 举报

发表于 2005-10-5 00:39:05 | 显示全部楼层
这样的帖子,不顶说不过去了。

顺便沙发。

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

使用道具 举报

发表于 2005-10-5 07:20:34 | 显示全部楼层
#   谢谢 保存学习, 能给原文URL? 有图不能显示.................
routeros
回复

使用道具 举报

发表于 2005-10-6 09:29:30 | 显示全部楼层
太需要这样的帖子了,说实在的我还真是不太明白什么Qos。非常感谢楼主。
routeros
回复

使用道具 举报

发表于 2005-10-6 16:17:49 | 显示全部楼层
楼主实在太辛苦了,说得很明白,有时间一定要试一下。
routeros
回复

使用道具 举报

头像被屏蔽
发表于 2005-10-7 17:28:28 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
routeros
回复

使用道具 举报

发表于 2005-10-8 13:53:21 | 显示全部楼层
感谢LPI~
routeros
回复

使用道具 举报

发表于 2005-10-9 10:57:32 | 显示全部楼层
routeros
回复

使用道具 举报

发表于 2005-10-9 11:11:51 | 显示全部楼层
此贴太好、太详细了。实在难得。
routeros
回复

使用道具 举报

发表于 2005-10-23 23:42:53 | 显示全部楼层
好难得啊。。。可惜就是没有图片了。。真可惜
routeros
回复

使用道具 举报

发表于 2005-10-26 01:12:47 | 显示全部楼层
很详细

谢谢
routeros
回复

使用道具 举报

发表于 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 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
tc filter add dev eth0 parent 10: protocol ip prio 100 handle 40 fw  classid 10:40
tc filter add dev eth0 parent 10: protocol ip prio 100 handle 50 fw  classid 10:50
tc filter add dev eth0 parent 10: protocol ip prio 100 handle 60 fw  classid 10:60
tc filter add dev eth0 parent 10: protocol ip prio 100 handle 70 fw  classid 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 编辑 ]
routeros
回复

使用道具 举报

发表于 2005-11-4 12:37:42 | 显示全部楼层
好贴!
routeros
回复

使用道具 举报

发表于 2005-11-4 15:50:22 | 显示全部楼层
这个?没有图片,还是不会设置!
routeros
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|Archiver|手机版|小黑屋|软路由 ( 渝ICP备15001194号-1|渝公网安备 50011602500124号 )

GMT+8, 2024-5-16 09:00 , Processed in 0.081720 second(s), 5 queries , Gzip On, Redis On.

Powered by Discuz! X3.5 Licensed

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表