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):
INPUT、FORWARD、OUTPUT
而 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 )
#
# 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
iptables 設定方面: (高級防火牆配置 - 編輯自訂防火牆規則)
# 設定上傳方面,先利用 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
由於提供的資訊不足,所有環境的情況都是假設的
以上範例僅供參考,可能修要修改後才能套用
--------------------------------------------------------------
有時候指令看起來好像很長一大串,很複雜
其實去掉註解,就剩沒幾行了
再仔細去觀察去掉註解的指令串,可以發現
其實很多地方都是重複的,只有幾個數字在改變而已
仔細觀察一下,多實作幾次,就可以熟練了
不知這樣的配置還ok嗎??
我想請問
我是把emule和ftp放在同一台主機
它有辦法說分辦哪個優先嗎??
另ftp的保證上傳下載有限低限制嗎??
若某電腦有開機,但沒有做上網的動作(或者是關機)
那該保證上傳下載會空出來嗎??
謝謝 1.OK,GOOD
2.
有,要辨識 P2P 封包,須使用 l7-filter
FTP 封包,建議也使用 l7-filter
因為 FTP 服務有兩組 port,其中一組是不固定的。
3.若不想讓 FTP 佔用太多頻寬,可將最大上傳/下載,手動調低,固定一個數字
4.保證頻寬(上傳/下載),不管任何時候,都不會被其它類別佔用
若該電腦沒開機使用,此頻寬就是空著浪費
所以此數字不宜設大,視服務需求而定
對反應速度比較要求的服務
需給予適當的保證頻寬,才能確保服務品質
例如:線上遊戲,網路視訊,網路電話....等等,對反應速度比較要求
若沒有保證頻寬,在頻寬分配的時候須搶頻寬,會有幾秒鐘不穩定的情況
這會導致玩線上遊戲一時 LAG,而造成角色趴掉,或者對戰時輸掉 SKYPE 講網路電話,會出現明顯斷斷續續....之類的