题 IPTABLES - 限制特定传入IP的速率


我不希望限制特定服务的费率。我的目标是仅根据传入的IP地址限制费率。例如,使用伪规则:

john.domain.local (192.168.1.100) can only download from our httpd/ftp servers at "10KB/s" (instead of 1MB/s)

如何根据传入的IP地址使用IPTable进行速率限制?


101
2018-04-28 21:09






答案:


IPTables不是为这类工作而制作的,需要分析大量的数据包才能做出这些决定。虽然IPTables部分解决了!

对此的真正答案是Linux中令人敬畏且未充分利用的流量控制设施。请注意,在不知道发生了什么的情况下乱用它可能会导致您失去与机器的网络连接!你被警告了!

假设eth0是传出设备,您将需要创建一个基于类的流量控制队列,默认情况下会通过“快速”队列输出大多数流量,并将特定的人员列表放入“慢”队列。

这样做的好处是你可以创建一种情况,你可以为慢速用户提供大量的出站流量,除非重写的类需要带宽,但是这个例子没有这样做(总是向慢用户提供10kbps)。排队系统看起来像这样:

                         Inbound traffic
                              +
                              |
                              |
                              v
                     +------------------+
                     |   Class 1:1      |
                     |------------------|
                     |  Root (all flows)|
                     |       100mbit    |
                     +-----+-----+------+
                           |     |
                           |     |
                           |     |
                           |     |
                           |     |
          +----------+     |     |     +----------+
          |    1:11  +-----+     +-----+    1:12  |
          |----------|                 |----------|
          | Default  |                 | Slow     |
          |100mb-80kb|                 |   80kb   |
          +----------+                 +----------+

为此,首先需要在内核中设置排队规则。以下将为您完成此操作.. 你必须将其作为一个完整的脚本运行

#!/bin/bash
tc qdisc add dev eth0 parent root handle 1: hfsc default 11
tc class add dev eth0 parent 1: classid 1:1 hfsc sc rate 100mbit ul rate 100mbit
tc class add dev eth0 parent 1:1 classid 1:11 hfsc sc rate 99920kbit ul rate 100000kbit
tc class add dev eth0 parent 1:1 classid 1:12 hfsc sc rate 80kbit ul rate 80kbit

tc qdisc add dev eth0 parent 1:11 handle 11:1 pfifo
tc qdisc add dev eth0 parent 1:12 handle 12:1 pfifo

“默认11”很重要,因为它告诉内核如何处理未分类的流量。

完成此操作后,您可以设置iptables规则以对符合特定条件的数据包进行分类。如果你计划将很多人放入这个慢速规则中,那么ipset规则更合适(我相信这应该在rhel6上提供)。

所以,创建一个ipset数据库来进行匹配...

ipset create slowips hash:ip,port

然后创建iptables规则来进行匹配..

iptables -t mangle -I OUTPUT -m set --match-set slowips dst,src -j CLASSIFY --set-class 1:12

这会指示内核如果将目标IP与集合中的源端口匹配,则将其分类为使用流量控制设置的慢​​速队列。

现在,最后每当你想减慢IP速度时,你可以使用ipset命令将ip添加到集合中,如下所示:

ipset add slowips 192.168.1.1,80
ipset add slowips 192.168.1.1,21
...

您可以使用命令“tc -s class show dev eth0”对其进行测试,您将看到其中的统计信息,表明数据包被重定向到慢速队列。

请注意,唯一真正的缺点是让它在重新启动后继续存在。我不认为有任何init脚本可用于在重新启动时从转储创建ipsets(并且它们也必须创建 之前 iptables规则)我确定在重启时没有重置流量控制规则的init脚本。如果你没有打扰,你可以通过在rc.local中调用脚本来重新创建整个事物。


165
2018-04-28 23:35



好吧,我不能够感谢你。这是非常具有描述性和非常丰富的信息。我后来意识到需要TC的知识,我从此开始研究这个问题。再次感谢! - James
哦,至于失去联系。我确定在从VPS移动到主机之前我已经关闭了配置。此外,我可以在ETH0上访问专用网络。我只会在ETH1上工作所以理论上我不会有问题。但警告听到了! - James
我不能告诉你有多少次我读过类似的教程,这是第一个有意义的教程 - RC1140
作为旁注,它通常更适合在控制组中执行这样的资源限制(同样,也可能,也未充分利用和令人敬畏),因为您可以在集中式策略存储中定义对cpu,内存,IO和网络的每个应用程序限制”。但是还没有看到这样的问题被假定为提供答案。 - Matthew Ife
如果你不喜欢的话 tc 您可以给出的语法 tcng 尝试添加更多用户友好的语言生成 tc 命令。我以前在shell脚本中喜欢这样: echo '... multi line tcng configuration ...' | tcng | sh。 - Mattias Wadman


它就像采用速率限制规则并添加 -s 开关。该 -s 交换机匹配传入的IP。例如 iptables -A INPUT -s 1.1.1.1 然后使用您首选的速率限制方法完成该规则。


5
2018-04-28 21:12



谢谢你的快速回答。不幸的是我的主要问题是下半场。我已经调查了--limit并且我没有看到任何允许我根据KB / s限制的东西 - 您可以指向我的任何方向? - James
@James我会回复你,但我不得不走出朋友的家。刚刚回来,我发现MIfe做了很多工作。 =) - Wesley