HTB 的最小速率和默认类别问题

Mul*_*lot 29 linux iptables traffic-shaping htb

我对我正在使用的 HTB 结构有一些疑问。

我的目标是限制本地网络中用户的下载和上传速度。网络的每个用户都有一个个人域列表,其中包含他不能超过的域的上下速度。

这意味着用户 1 可以在 slashdot.org 上的访问权限限制为 8KB 下载和 3KB 上传,用户 2 可以在 slashdot.org 上访问限制为 4KB 和 1KB。

现在我设置了一个很好的 iptables/tc 对,但规模很小,同时使用 2 或 3 个虚拟主机(不幸的是,我无法执行实际大小测试)。

这是我当前的结构(我只会显示 LAN 出口的结构,用于上传的结构只是该结构的“副本”)

连接在接口上的 HTB qdisc(句柄 2:),默认流量类是类 FFFF。

根类 2:1 直接位于 HTB qdisc 下,具有速率和上限下行链路容量。

默认类 2:FFFF 作为 2:1 的子级,速率为 1kbsp,下行容量为 ceil。

然后,当某个域的用户有新的限制时,动态添加其他类,添加新的 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 --------------
Run Code Online (Sandbox Code Playgroud)

所有正常流量(没有速度限制)都应该转到默认类,而受限制的应该发送到其相应的 tc 类。

我严重怀疑的一点是默认类和受限类使用最小 1bps 速率。我无法控制将创建的受限类的数量,并且我不希望受限类的总比率超过根类之一。

还有一点,我添加了默认的 prio 0 和受限的类 prio 1,所以如果默认类应该借用(几乎总是根据其非常慢的速度),这个类将在其他受限域之前提供。但是,如果我将默认类的 ceil 保留为根类之一,这些域不会饿死吗?

我怎样才能成功地让用户在不受限制的使用情况下保持良好的交互性和带宽,同时限制几个域/用户的速度?

我还想知道默认类在这里是否有用,因为如果我不为 htb qdisc 指定默认类,则与过滤器不匹配的数据包将以硬件速度出列。(但又要让受限制的班级挨饿?)

我对 tc 和网络 QoS 真的很陌生,所以任何建议、批评者(建设性的;))将受到欢迎。

文森特。

And*_*asM 2

由于您没有包含分类器,因此很难推断出每个类别中确切的流量。例如,传出的 http 或 ssh 流量对于交互性非常重要,而传入的 http 流量则不那么重要。

我会通过以下方式保证每个服务的一定带宽:我有 x kbps 用于传入的 httpd 流量,并且它在用户之间平均分配。如果您有 10 或 100 个用户,这是公平的。”如果您在每个服务中都有高优先级用户或低优先级用户,您需要为他们提供额外的类和分类器。

(我还希望您知道您只能调整从接口发出的流量,而不是传入的流量。这意味着如果您想限制上行链路,则必须使用互联网的传出接口或使用中间队列设备。 lartc.org 指南是一个非常好的资源。)