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

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 地址使用 IPTables 进行速率限制?

答案1

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 脚本可用于在重启时从转储中创建 ipset(并且它们也必须创建iptables 规则),我确信没有 init 脚本可以在重启时重新设置流量控制规则。如果您不介意,您可以通过调用 rc.local 中的脚本来重新创建整个过程。

答案2

这很简单,只需采用速率限制规则并添加交换机即可-s-s交换机匹配传入 IP。例如iptables -A INPUT -s 1.1.1.1,然后以您喜欢的速率限制方法结束该规则。

相关内容