我不想限制特定服务的速度。 我的目标是仅仅根据传入的IP地址来限制速率。 例如使用伪规则:
john.domain.local (192.168.1.100) can only download from our httpd/ftp servers at "10KB/s" (instead of 1MB/s)
我怎样才能使用IPTables基于传入的IP地址速率限制?
IPTables不是为这种工作而devise的,需要分析大量的数据包来做出这些决定。 虽然IPTables部分是答案!
真正的答案是在linux中真棒和使用不足的交通控制设施。 请注意,在不知道发生了什么的情况下,可能会导致networking连接失败。 你被警告了!
假设eth0是传出设备,您将需要创build一个基于类的stream量控制队列,默认情况下会在“快速”队列中输出大部分stream量,并将特定的人员列表放入“慢速”队列中。
这样做的好处是你可以创build一个情况,让慢速用户有很多的出站stream量,除非压倒一级的用户需要带宽,但是这个例子并没有这样做(总是向慢速用户提供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”很重要,因为它告诉内核如何处理未分类的stream量。
一旦完成,您可以设置iptables规则来对符合特定条件的数据包进行分类。 如果你打算把很多人放进这个缓慢的规则,一个ipset规则更合适(我相信这应该在rhel6上提供)。
所以,创build一个ipset数据库来进行匹配…
ipset create slowips hash:ip,port
然后创buildiptables规则来做匹配..
iptables -t mangle -I OUTPUT -m set --match-set slowips dst,src -j CLASSIFY --set-class 1:12
这将指示内核,如果您将目标IP与集合中的源端口相匹配,请将其分类为您使用stream量控制设置的慢速队列。
现在,最后,当你想减慢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”来testing它的工作原理,您将在那里看到统计信息,指示将数据包redirect到慢队列。
请注意,唯一真正的缺点就是使其能够在重新启动后继续运行。 我不认为有任何初始化脚本可用于在重新启动时从转储创buildipset(并且它们也必须在 iptables规则之前创build),并且im确定没有init脚本重新启动时重新设置通信控制规则。 如果你不打扰,你可以通过在rc.local中调用一个脚本来重新创build整个事情。
这和使用速率限制规则并添加-s
开关一样简单。 -s
开关匹配传入的IP。 例如iptables -A INPUT -s 1.1.1.1
,然后结束你对该规则的首选速率限制方法。