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

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

前言:

----------------------------------------------------------------------
此篇教学以 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 )  :
===================================================================
#!/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 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
=====================================================================

说明:
--------------------------------
这边的 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 数据,非常稀少
即使是现在,虽然市面上已有几本 Linux QoS 相关中文书籍了
但网络上的 Linux QoS 的中文讨论,仍是寥寥可数
故小弟今日贴此一篇,望能抛砖引玉之效,开创 Linux QoS 风潮

Linux QoS 的技术
基础的像此篇管制小型网络频宽之应用
进阶的可以配合 l7-filter 做 service 的频宽管制
到深入一点,复杂一点的
更可以藉由 iproute2 多重路由,达到多WAN的架构


##########################################
补充 01: 2005/10/04
##########################################

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 MRAK --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 协定一览表


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


########################################
补充 02:   2005/11/03
########################################

浅谈 Coyote 防火墙之工作原理
从底层 iptables 的角度来看



Coyote 的防火墙,预设政策为「允许通过」

预设政策的意思是:
假如封包不符合任何使用者订立的规则,则以预设政策来处理。



iptables 的 filter 表格,内建只有三个链 (Chain):
INPUTFORWARDOUTPUT

而 iptables 允许使用者新增自订链
Coyote 在设计上,会自动新增一些自订链

在「WEB 管理接口」中
有关防火墙方面的设定,其实是以 Coyote 自订的链 来处理
以下会进一步说明:



上图所示
在高级防火墙配置中,有两种类型:
-------------------------------------
1.Admin (管理)
2.Access (访问)



1.Admin (管理) 实际上是写入 Coyote 的自订链:remote-admin

remote-admin 自订链,是被安排在 INPUT 链中

这说明了,所谓的类型 Admin (管理),是和 Coyote 本机有关的
它是用来管制谁能够从远程登入 Coyote 主机,进行操作




2.Access (访问) 实际上是写入 Coyote 的自订链: access-acl

此 access-acl 自订链:是被安排在 FORWARD 链中

所以它是和 NAT 有关系的
用来管制外部网络,和内部网络计算机的联机

至于 Internet Interface (int-if)Internet (int-net) 选项的差别

如上图所示,从 source (来源)端,我们可以看出:

Internet Interface (int-if),实际结果是 anywhere,和 any 选项是一样的

Internet (int-net),则是指 ISP 的网关端


经测试后发现
ISP 网关端,并不等于 Internet (泛指因特网 0.0.0.0)
阻挡 LAN 内计算机的封包,进入 ISP 网关端
并无法阻挡其进入因特网
所以这是一个诡异的选项,它实际上并没有太大作用

若要从 WEB 管理接口设定防火墙
建议外部网络的选项,选择 Internet Interface (int-if) 或者 any
才能真正起到保护作用


在终端模式下,查询 iptables 设定明细表的指令为:
----------------------------------------------
iptables -L   (预设查询 filter 表格)
iptables -t nat -L   (指定查询 nat 表格)
iptables -t mangle -L (指定查询 mangle 表格)

 

 

 

===============================================

以下是讨论内容:

 

我的ADSL 1m/64k ,用上面的範例去修改,一台電腦每次上網開網頁時,另一台電腦在玩天堂2就會delay 2~3秒,可以幫我看一下哪邊有錯。

#!/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 8kbps ceil 8kbps

# 定義第二層葉類別
# rate 保證頻寬,ceil 最大頻寬,prio 優先權
tc class add dev eth1 parent 10:1 classid 10:10 htb rate 1kbps ceil 2kbps prio 2
tc class add dev eth1 parent 10:1 classid 10:20 htb rate 1kbps ceil 2kbps prio 2
tc class add dev eth1 parent 10:1 classid 10:30 htb rate 1kbps ceil 2kbps prio 3


tc class add dev eth1 parent 10:1 classid 10:40 htb rate 1kbps ceil 2kbps prio 0
tc class add dev eth1 parent 10:1 classid 10:50 htb rate 1kbps ceil 2kbps prio 1
tc class add dev eth1 parent 10:1 classid 10:60 htb rate 1kbps ceil 2kbps prio 1
tc class add dev eth1 parent 10:1 classid 10:70 htb rate 1kbps ceil 2kbps 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 128kbps ceil 128kbps

# 定義第二層葉類別
# rate 保證頻寬,ceil 最大頻寬,prio 優先權
tc class add dev eth0 parent 10:1 classid 10:10 htb rate 1kbps ceil 86kbps prio 2
tc class add dev eth0 parent 10:1 classid 10:20 htb rate 1kbps ceil 86kbps prio 2
tc class add dev eth0 parent 10:1 classid 10:30 htb rate 1kbps ceil 86kbps prio 3

tc class add dev eth0 parent 10:1 classid 10:40 htb rate 16kbps ceil 101kbps prio 0
tc class add dev eth0 parent 10:1 classid 10:50 htb rate 8kbps ceil 93kbps prio 1
tc class add dev eth0 parent 10:1 classid 10:60 htb rate 8kbps ceil 93kbps prio 1
tc class add dev eth0 parent 10:1 classid 10:70 htb rate 8kbps ceil 93kbps 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 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

 

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

資訊太少,無法判斷

有幾台電腦需要頻寬管制?
網卡編號,哪個是對外,那個是對內?
頻寬分配表?

針對你的情況,以下為範例 :
(因為資訊不足,所以具體情況,都是用猜的,不一定完全符合你的環境,可能需要修改後才能套用)

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 )

語法:
#!/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
大致上就是這樣子
由於提供的資訊不足,所有環境的情況都是假設的
以上範例僅供參考,可能修要修改後才能套用

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

有時候指令看起來好像很長一大串,很複雜
其實去掉註解,就剩沒幾行了

再仔細去觀察去掉註解的指令串,可以發現
其實很多地方都是重複的,只有幾個數字在改變而已

仔細觀察一下,多實作幾次,就可以熟練了
=================================================
linux_xp你好:

不知這樣的配置還ok嗎??
我想請問
我是把emule和ftp放在同一台主機
它有辦法說分辦哪個優先嗎??
另ftp的保證上傳下載有限低限制嗎??
若某電腦有開機,但沒有做上網的動作(或者是關機)
那該保證上傳下載會空出來嗎??
謝謝 1.OK,GOOD

2.
有,要辨識 P2P 封包,須使用 l7-filter
FTP 封包,建議也使用 l7-filter
因為 FTP 服務有兩組 port,其中一組是不固定的。


3.若不想讓 FTP 佔用太多頻寬,可將最大上傳/下載,手動調低,固定一個數字


4.保證頻寬(上傳/下載),不管任何時候,都不會被其它類別佔用
若該電腦沒開機使用,此頻寬就是空著浪費
所以此數字不宜設大,視服務需求而定

對反應速度比較要求的服務
需給予適當的保證頻寬,才能確保服務品質
例如:線上遊戲,網路視訊,網路電話....等等,對反應速度比較要求

若沒有保證頻寬,在頻寬分配的時候須搶頻寬,會有幾秒鐘不穩定的情況
這會導致玩線上遊戲一時 LAG,而造成角色趴掉,或者對戰時輸掉 SKYPE 講網路電話,會出現明顯斷斷續續....之類的
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Coyote Optimization Algorithm(COA)是一种模拟动物行为的优化算法,最早由塞尔柔夫·奈索帕洛斯(Serrouf Nacer Eddine)于2014年提出。COA受到了美洲土狼(coyote)的求生行为的启发,并模拟了其狩猎和社会行为。 COA的基本思想是将问题建模为群体中的个体通过相互合作来求解问题的过程。在COA中,将问题的解看作是“食物”,而个体则像土狼一样通过合作来获取食物。这个过程基于两个主要行为:探索和捕食。 在COA的初始阶段,个体会进行探索行为,类似于土狼在陌生领地中搜寻食物的过程。个体会根据其个体记忆和群体信息进行局部搜索,并尝试找到更好的解。在探索过程中,个体也会利用其他个体的信息来优化其搜索路径。 一旦个体找到了更好的解,它会通过捕食行为将其分享给其他个体。在这个过程中,个体会传递优秀解的信息和自身记忆,并与其他个体进行信息交流。通过这种社会行为,个体可以学习和优化自己的搜索策略。 COA的优点在于可以处理各种类型的优化问题,并且具有较强的全局搜索能力和收敛性。它在多个领域中得到了广泛的应用,如物流优化、图像处理、机器学习等。 总之,Coyote Optimization Algorithm是一种模拟土狼行为的优化算法,通过个体间的合作和信息交流来求解问题。它的独特设计使得它适用于各种优化问题,并具有全局搜索和迭代优化的能力。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值