我对我正在使用的 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,下行链路容量上限。
然后,当对某个域的用户有新的限制时,会动态添加其他类,添加一个新的 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 速率的使用。我无法控制将要创建的受限类的数量,并且我不希望受限类的总速率超过根类的速率。
还有一点,我为默认类添加了优先级 0,为受限类添加了优先级 1,因此,如果默认类需要借用(几乎总是根据其非常慢的速率),该类将在其他受限域之前得到服务。但如果我将默认类的上限保留为根类的上限,这些域会不会挨饿?
如何才能成功地让用户保持良好的交互性和不受限制的带宽使用,同时限制几个域/用户的速度?
我还想知道默认类别在这里是否有用,因为如果我不为 htb qdisc 指定默认类别,则与过滤器不匹配的数据包将以硬件速度出队。(但这里再次使受限类别挨饿?)
我对 tc 和网络 QoS 还很陌生,因此欢迎任何建议和批评(建设性的;))。
文森特。
答案1
由于您没有包含分类器,因此很难推断出每个类别中您确切指的是哪种流量。例如,传出的 http 或 ssh 流量对于交互性非常重要,而传入的 http 流量则不那么重要。
我将保证每个服务比如说:我有 x kbps 的传入 httpd 流量,它会在用户之间平均分配。如果你有 10 个或 100 个用户,这是公平的。”如果你在这些服务中都有高优先级用户或低优先级用户,你需要为他们提供额外的类别和分类器。
(另外我希望你知道你只能控制来自接口的传出流量,而不是传入流量。这意味着如果你想限制上行链路,你必须使用传出接口到互联网或使用中间排队设备。lartc.org 指南是一个非常好的资源。)