我不希望限制特定服务的费率。我的目标是仅根据传入的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一定程度上是答案!请注意,在不知道发生了什么情况的情况下弄乱它可能会导致您失去与计算机的网络连接!已警告您!

假设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


“ default 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”,您将在其中看到指示数据包已重定向到慢速队列的统计信息。我认为没有任何初始化脚本可用于在重新启动时从转储中创建ipset(并且它们也必须在iptables规则之前创建),而且我敢肯定没有初始化脚本可在重新启动时重置流量控制规则。如果您不担心,则可以通过调用rc.local中的脚本来重新创建整个内容。

评论


好吧,我感激不尽。这是非常描述性和非常有益的。后来我意识到需要具备TC知识,因此我开始对此进行研究。再次感谢!

–詹姆斯
2012年4月28日23:41

哦,至于失去联系。从VPS移到主机之前,我要确保已关闭配置。另外,我可以通过VPN访问ETH0上的专用网络。我只会在ETH1上工作,所以从理论上讲我不会有问题。但是听到警告!

–詹姆斯
2012年4月28日23:43

我不能告诉你我读过多少本类似的教程,这是第一个有意义的

–RC1140
2012年5月5日20:16

附带说明一下,它通常更适合在控制组中进行这样的资源限制(同样,也是可能的,也没有得到充分利用,而且很棒),因为您可以在集中化的“策略存储”中定义每个应用程序对cpu,内存,IO和网络的限制'。但是尚未看到提出这样一个问题的答案。

–马修·伊夫(Matthew Ife)
2012年5月5日在20:44

如果您不喜欢tc语法,可以尝试一下tcng,它会增加一些生成tc命令的用户友好语言。我曾经在shell脚本中喜欢这样:echo'... multi line tcng configuration ...'| tcng | sh。

–马蒂亚斯·沃德曼(Mattias Wadman)
2012年5月6日15:08



#2 楼

就像制定速率限制规则并添加-s开关一样简单。 -s交换机匹配传入的IP。例如iptables -A INPUT -s 1.1.1.1,然后以该规则的首选速率限制方法结束。

评论


感谢您的迅速答复。不幸的是,我的主要问题是下半场。我研究了--limit,但没有发现任何可让我根据KB / s进行限制的内容-您能指出我的任何方向吗?

–詹姆斯
2012年4月28日在21:28

@James我本来会和您联系的,但我必须走出朋友家。刚回来,我发现MIfe做得很好。 =)

–韦斯利
2012年4月29日下午3:30