我查看了 mod_bandwidth 和 mod_cban,但它们似乎不能满足我的要求。
我正在运行带有 apache 2.2 (mod_proxy、proxy_http、proxy_connect) 的代理服务器。
我想限制“客户端的上传速度”。
这是同时服务器下载带宽,不应该受到限制。
我希望每个连接都这样,或者更好的是每个 IP 都这样。
为了便于理解:用例是我不想让坏人使用我的代理服务器“掩盖”自己,将坏数据上传到坏地方。当然我有日志和一切,但我想避免麻烦,并首先让它变得没有吸引力。
为了更好地理解,这里是我的设置的图片:
当然红色箭头也可以指向左上角的箭头。
我目前正在考虑在同一台服务器上的不同端口上启动 apache 两次,并使用 ProxyRemote 将请求发送到另一个代理。因此,在第二个代理上,我可以将 localhost 排除在限制之外。但是,我仍然需要一个解决方案来限制传入但不限制传出带宽。我可以使用 IPtables 来实现这一点。
但说实话?一定有更好的方法。必须有。
答案1
如果 OP 使用 Linux,iptables 与 tc 结合应该能够做到这一点。Iptables 有一个名为 connbytes 的模块,可以匹配迄今为止通过流的字节数。使用它来“标记”流中发送了太多字节的数据包。例如,您可能有一条规则,用标记“1”标记 1 MByte 到 10 MByte 之间的流中的所有数据包,另一条规则用标记“2”标记长于 10 MByte 的流中的所有数据包。
然后,为默认值(==低于 1 Mbyte)、标记“1”和标记“2”设置流量整形类。
这种解决方案的优点是,除非用户集体消耗了太多带宽,否则你无需惩罚他们。缺点是这些工具有些复杂,需要阅读一些资料才能理解。
大多数发行版都包含 iptables 和 tc。您可能还想了解 tcng,它使制定 tc 规则集变得非常简单。
答案2
您的问题似乎很有趣 :)。您的请求似乎实际上可以通过 apache + squid + squid 延迟池 + squid 外部 acl(根据标头过滤请求)来实现。
http://wiki.squid-cache.org/Features/DelayPools
http://www.squid-cache.org/Doc/config/external_acl_type/
外部 acl 类型是您可以用来根据标头(POST)过滤请求以应用速度限制的关键。