我对正在使用的HTB结构有一些疑问。
我的目的是限制本地网络中用户的下载和上传速度。网络中的每个用户都有一个个人域列表,其中包含他不能超过的域的上下速度。
这意味着user1可以将slashdot.org上的访问权限限制为下载8KB,上传3KB,而user2可以将slashdot.org上的访问权限限制为4KB(向下)和1KB(向上)。
现在,我设置了一个iptables / tc夫妇,效果很好,但规模很小,同时使用2或3个虚拟主机(不幸的是,我无法执行实际大小测试)。
这是我当前的结构(我只会在LAN的出口上显示一个结构,用于上传的结构只是该结构的“副本”)
接口上连接的HTB qdisc(句柄2),默认流量类别为FFFF。
直接在HTB qdisc之下的根类2:1具有速率和上限DOWNLINK容量。
默认的2:FFFF类是2:1的子级,速率为1kbsp,下行容量为上限。
然后,当对来自某个域的用户有新限制时,会动态添加其他类,并添加新的tc类以控制从其域的下载速度。
现在,这是我所做的:
创建一个具有唯一ID(从数据库获取,此处不是重点)的新tc类,作为父类,类2:1,速率值为1bps,ceil值设置为有限的下载速度。
这是tc命令:
-------------- BEGIN SCRIPT --------------
DOWNLINK=800
## Setting up the static tc qdisc and class
$tc qdisc add dev $LAN_IFACE root handle 2: htb default 0xFFFF
# Main class so the default class can borrow bandwith from the others
$tc class replace dev $LAN_IFACE parent 0x2: classid 0x2:0x1 htb rate $DOWNLINK ceil $DOWNLINKkbps
# add the default class of class id 2:a under the main class of classid 2:1
$tc class replace dev $LAN_IFACE parent 0x2:0x1 classid 0x2:0xFFFF htb rate 1kbps ceil $DOWNLINKkbps prio 0
# add to the leaf class 2:10 for default traffic a sfq qdisc
$tc qdisc add dev $LAN_IFACE parent 0x2:0xFFFF handle 0xFFFF: sfq perturb 10
## The dynamic part called each time a new restriction for a couple domain/user is added
$tc class replace dev $LAN_IFACE parent 0x2:0x1 classid 0x2:0x$idHex htb rate 1bps ceil $speedDownkbps prio 1
# Add the sfq at the leaf class 2:1$id
$tc qdisc add dev $LAN_IFACE parent 0x2:0x$idHex handle 0x$idHex: sfq perturb 10
# $id is the mark added by iptables for this couple domain/user
$tc filter replace dev $LAN_IFACE parent 0x2:0 protocol ip prio 3 handle 0x$id fw flowid 0x2:0x$idHex
-------------- END SCRIPT --------------
所有正常流量(无速度限制)应转到默认类别,而受限流量应发送到其对应的tc类别。
我严重怀疑的一点是,默认类和受限类使用的最小1bps速率。我无法控制将要创建的受限类的数量,并且我不希望受限类的总比率超过根类之一。
还有一点,我添加了默认值prio 0和受限类prio 1,因此,如果默认类应该借用(几乎总是根据其非常慢的速率),则该类将在其他受限域之前提供。但是,如果我将默认类的ceil保留为根类之一,这些域是否会挨饿?
我如何才能成功地允许用户在不受限制的使用情况下保持良好的交互性和带宽,同时又限制了几个域/用户的速度?
我还想知道默认类是否在这里有用,因为如果我不为htb qdisc指定默认类,则不匹配过滤器的数据包将以硬件速度出队。(但这里又让受限类饿了吗?)
我真的是tc和网络QoS的新手,因此欢迎任何建议,批评家(建设性的;))。
文森特