我有一些发送数据太快的问题网络客户端。
我想减慢他们的速度,使用 iptables,或者可能是 tc。
我见过 iptables 解决方案,例如:
sudo iptables -A INPUT -m state --state RELATED,ESTABLISHED -m limit --limit 50/second --limit-burst 50 -j ACCEPT
但我认为该限制适用于与规则匹配的所有内容,而不是每个客户地址。
有没有办法让这个规则限制每个客户端地址的数据包?
我有一些发送数据太快的问题网络客户端。
我想减慢他们的速度,使用 iptables,或者可能是 tc。
我见过 iptables 解决方案,例如:
sudo iptables -A INPUT -m state --state RELATED,ESTABLISHED -m limit --limit 50/second --limit-burst 50 -j ACCEPT
但我认为该限制适用于与规则匹配的所有内容,而不是每个客户地址。
有没有办法让这个规则限制每个客户端地址的数据包?
我已经使用 TC 和 iptables hashlimit 的组合来做到这一点。我在 LAN 接口(以下载流量为目标)上创建了一个 TC 出站带宽限制器,设置为 5 Mbits/秒。然后我在接口的输出 mangle 链中使用 iptables hashlimit 模块,这样如果数据包速率超过某个阈值,在任何两个不同的源 IP 地址和目标 IP 地址之间,它开始将这些数据包分类到 TC 5 Mbit/s 流量整形类.
但是,您必须正确设置数据包阈值,并且我基于我的 MTU 为 1500 字节这一事实,因此使用它来计算每秒有多少数据包将创建一个每秒 1.5 Mbits 的阈值(1000 个数据包/秒)。再加上在 hashlimit iptables 模块上设置可能的最高突发值(在我的设置中,这似乎是 10,000),所有这一切的结果是短时间下载以全速运行,但较长时间的下载开始变慢,因为一些数据包进入了 TC 带宽限制类,这显然会降低数据包速率等。这有点像 hack,但令人惊讶的是它确实有效,而且效果很好。并且因为使用了 TC,所以不会丢弃任何数据包 - 一旦达到数据包速率,就会因为被推入 TC 类而简单地延迟和减速。
这是在 CentOS 6 机器上。我认为更现代的东西允许 hashlimit 模块支持每秒字节数,而不仅仅是每秒数据包,这甚至更好,但我在我的设置中尝试了这个,它只是恢复为每秒使用数据包。
我刚刚在手机上,所以无法粘贴任何配置,但是如果您想要一些示例,请告诉我,我将编辑此答案。我真的很喜欢这个解决方案,因为我所追求的限制是基于源 IP 和目标 IP。因此系统将每个不同的 src+dst IP 组合视为自己的数据包流进行限制。hashlimit 模块也支持源端口和目标端口(基本上是源 IP、源端口、目标 IP、目标端口的任意组合),因此您甚至可以在源 IP+端口和目标 IP+端口之间基于每个会话进行限制.
更新
因此,以下是您的大致操作方式;将需要进行实验。
tc:
iptables:
你可以用简单的方法解决这个问题,尝试使用带iptables的recent模块,最近跟踪源地址:
阻止 ssh 暴力破解的示例:
您也许可以使用 connlimit 模块解决此问题:
http://www.cyberciti.biz/faq/iptables-connection-limits-howto/