![TC qdiscs 的 QoS:是否可以让所有出站连接的每个唯一 IP 具有 x 速度限制?](https://linux22.com/image/47148/TC%20qdiscs%20%E7%9A%84%20QoS%EF%BC%9A%E6%98%AF%E5%90%A6%E5%8F%AF%E4%BB%A5%E8%AE%A9%E6%89%80%E6%9C%89%E5%87%BA%E7%AB%99%E8%BF%9E%E6%8E%A5%E7%9A%84%E6%AF%8F%E4%B8%AA%E5%94%AF%E4%B8%80%20IP%20%E5%85%B7%E6%9C%89%20x%20%E9%80%9F%E5%BA%A6%E9%99%90%E5%88%B6%EF%BC%9F.png)
我正在尝试在我的 VPS 中设置 QoS,以便任何到唯一 IP 的新出站连接的速度受到限制。
例如:
- 有 5 个公共 IP 从我的 VPS 请求数据。
- 当 VPS 将数据发送回每个 IP 时,每个 IP 都会获得 10mbps 的专用出站带宽速度。
- 如果客户端超过 10mbps,切勿丢弃数据包,而是将其排队。
我不想将整个 eth0 端口限制为 10mbps 出站速度,我希望每个单独的公共 IP 都能获得 10mbps。
我经常有不同的公共 IP 联系我的 VPS,因此我宁愿不必编写静态规则,这迫使我为每个 IP 单独编写每个带宽规则。
这可以通过 TC qdisc 实现吗?
我已经查看了 HTB qdics 的典型设置,它允许我拥有过滤器等。但似乎没有看到描述我想要的内容的示例或文献。
我使用的是 ubuntu 服务器 14.04。
更新
当我更好地了解 TC qdisc 的工作方式后,我做了以下工作。
我用于基本设置的命令似乎工作得相当顺利,因为数据包没有丢弃而是进入令牌桶(注意:这不是高度优化的,但似乎运行得很好):
tc qdisc add dev eth0 root handle 1: htb default 11
tc class add dev eth0 parent 1: classid 1:1 htb rate 10mbit
tc class add dev eth0 parent 1: classid 1:2 htb rate 20mbit
tc filter add dev eth0 parent 1: protocol ip prio 16 u32 match ip dst 1.2.3.4 flowid 1:1
tc filter add dev eth0 parent 1: protocol ip prio 16 u32 match ip dst 2.3.4.5 flowid 1:2
答案1
我不知道 QDISC 可以直接做到这一点。使用 CBQ/HTB/HFSC,您最多可以创建有限数量的 10mbps 类,然后将 IP 哈希过滤到其中。除了显然会发生的哈希冲突之外,它会起作用。
如果运气好的话,您可以直接在源头(例如在网络服务器中)设置此类限制。
但如果这并不是真正的速率限制,而是为了在客户端之间保持公平,也许您使用 SFQ/ESFQ 会更好。虽然它没有限制,但它确实提供了一种平衡。