我正在建立一个环境,其中有一台 Linux 服务器、一台 OpenBSD 路由器和一台 Linux 客户端,并且我希望能够限制客户端应该能够使用的带宽量。
我一直在使用“netcat”和“时间”执行这些测试(使用时间来测量使用 netcat 的传输时间),尝试这些测试时发生的情况(使用 TCP 协议,队列由于某种原因不能与 UDP 一起使用)是队列根本不准确。
例如:当设置带宽限制为 10mbit 时,客户端不能使用超过 5 mbit,当设置限制为 100mbit 时,客户端不能使用超过 50mbit 左右。
配置如下所示(示例中使用 100mbit 限制):
#queue rules
altq on { $int_if, $ext_if } cbq bandwidth 100Mb queue { def, low }
queue def bandwidth 0Mb cbq(default)
queue low bandwidth 100Mb cbq(default)
#Passrules test
pass out quick from $int_if to $ext_if queue low
pass in quick from $ext_if to $int_if queue low
pass out quick from $ext_if to $int_if queue low
pass in quick from $int_if to $ext_if queue low
答案1
根据我的经验,要使 altq 正常工作,您确实需要将 或 选项添加red
到限制队列中,否则,当您接近饱和(物理或队列虚拟)时rio
,ecn
您会遇到一些不愉快的情况。请查看 RED(随机早期检测)部分altq 指南了解更多信息。
另外,上面的代码片段存在两个问题:
- 您有两个
default
队列:这是不允许的(事实上 pf 应该对此大发雷霆)。 - 您的一个队列没有带宽(0Mb)?——这可能不是您想要的/意味着的......