我正在尝试使用 linux tc 限制应用程序生成的输出带宽。此应用程序向我发送请求的源端口,我使用该端口有一个过滤器来限制每个用户的下载速度。如果我对 linux tc 有更好的了解,我觉得我的设置可以更好地管理。
在应用程序级别,用户被归类为某一组的成员,每个组都有有限的带宽。
例子 :
Members of group A : 512kbit/s
Members of group B : 1Mbit/s
Members of group C : 2Mbit/s
当用户连接到应用程序时,它会检索用户请求来源的源端口,并根据用户所属的组向我发送源端口和用户必须受到限制的带宽。有了这些信息,我必须添加适当的规则,以便将用户(实际上是源端口)限制在正确的带宽内。
如果连接的用户不是任何组的成员,则应限制默认带宽速度。
我实际上是通过使用一个自制的守护进程来管理这一点的,该守护进程在收到应用程序的请求时添加或删除规则。由于我对 tc 了解甚少,我无法以默认速度限制其他用户(不在组中的用户,实际上是所有其他用户),而且我的配置对我来说似乎很糟糕。
这是我的 tc qdisc 和类的基础:
tc qdisc add dev eth0 root handle 1: htb
tc class add dev eth0 parent 1: classid 1:1 htb rate 100mbps ceil 125mbps
为了按照给定的速度对用户进行分类,我必须添加一个子类,然后将一个过滤器与其关联:
# a member of group A
tc class add dev eth0 parent 1:1 classid 1:11 htb rate 512kbps ceil 512kbps
# tts associated filter to match his source port
tc filter add dev eth0 protocol ip parent 1:0 prio 1 u32 match ip sport 50001 flowid 1:11
# a member of group A again
tc class add dev eth0 parent 1:1 classid 1:12 htb rate 512kbps ceil 512kbps
# tts associated filter to match his source port
tc filter add dev eth0 protocol ip parent 1:0 prio 1 u32 match ip sport 61524 flowid 1:12
# a member of group B again
tc class add dev eth0 parent 1:1 classid 1:13 htb rate 1000kbps ceil 1000kbps
# tts associated filter to match his source port
tc filter add dev eth0 protocol ip parent 1:0 prio 1 u32 match ip sport 57200 flowid 1:13
我已经知道,如果源端口来自不同的 IP 地址,则它可能是相同的,问题是应用程序位于代理后面,所以在这种情况下我不必管理任何 IP 地址。
我想知道如何管理所有其他用户(请求/源端口,无论您如何命名)可能各自被限制在给定速度的情况。我的意思是每个连接应该能够使用最大 100kbit/s,而不是共享 100kbit/s。
我还想知道是否有办法简化我的规则。我不知道是否可以每个组只使用一个类,并将多个过滤器关联到同一个类,这样每个用户都可以由一个类处理,而不是每个用户一个类。
我很感激任何建议,谢谢。