很久以前的读者,第一次海报.. yada yada yada ..
不pipe怎么说,我希望有人有一些广泛的iptables / netfilter LIMIT或HASHLIMIT模块的经验,并解释我目睹的行为。
背景:我们有一个networking服务器,并希望限制一个月内客户可以拥有多less连接(HTTP Keepaliveclosures,顺便说一句)。 所以,我正在尝试使用iptables LIMIT模块来限制它们的新连接数量,以每月设定的数量(比方说500)。 iptables LIMIT模块使用“令牌桶”algorithm,所以我应该能够将限制突发(桶大小)设置为500,将限制(重填率)设置为500除以28天或大约18 /天。 这将确保在一个月的时间(4周)内,如果每一次都完全清空,那么桶就会被重新填充。 (我知道这实际上会授予超过500个,但它应该足够接近我们的需要)。
这里是我的iptables规则(我们使用ipset对IP进行分组,LimBurTest4包含我的源testing机器)
Chain INPUT (policy DROP 2316 packets, 186K bytes) pkts bytes target prot opt in out source destination 2952K 626M ACCEPT all -- * * 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED /* Accept outgoing return traffic */ 379 13702 ACCEPT icmp -- * * 0.0.0.0/0 0.0.0.0/0 icmptype 8 state NEW limit: avg 1/sec burst 1 377 30868 DROP icmp -- * * 0.0.0.0/0 0.0.0.0/0 0 0 DROP tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp flags:0x3F/0x00 /* Block NULL packets */ 73 14728 DROP tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp flags:!0x17/0x02 state NEW /* Block SYN flood */ 0 0 DROP tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp flags:0x3F/0x3F /* Block XMAS packets */ 24 120 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 match-set LimBurTest4 src tcp dpt:443 limit: avg 18/day burst 500 /* LimitBurst Test */ 76 30180 LOG tcp -- * * 0.0.0.0/0 0.0.0.0/0 match-set LimBurTest4 src tcp dpt:443 /* LimitBurst Testing */ LOG flags 0 level 4 prefix "LimBurTest Over Quota " 2522 138K REJECT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:443 /* Reject queries */ reject-with tcp-reset
我像这样添加LIMIT规则:
iptables -I INPUT 7 -m set --match-set LimBurTest4 src -p tcp --dport 443 -m limit --limit 18/day --limit-burst 500 -m comment --comment "Limit Burst Test" -j ACCEPT
testing:然后我创build了一个简单的shell脚本,使用curl一个接一个地向我的web服务器发出请求。 每个成功的请求大约需要0.20毫秒。 脚本的输出如下所示:
./limBurTest.sh 1 - 200 - 0.257 ms 2 - 200 - 0.193 ms 3 - 200 - 0.155 ms etc. etc.
结果:我对这种configuration的期望是,在开始看到拒绝的连接之前,快速(几秒钟内)使用全部500个连接。 但是,这根本就没有发生。 相反,我的testing脚本创build了24个成功的连接,其余的都被拒绝了。 例如,在上面的iptables输出中,我运行我的shell脚本循环100次,你可以看到24个ACCEPT规则匹配和76个LOG规则匹配后的ACCEPT规则。 我已经在CentOS 6.8和Ubuntu 16.04上进行了testing,两者都是这样的,但这似乎与文档相反。 为什么我不能使用限制突发所指定的所有500个连接?
当然,是的,我做了大量的search,并且看到很多人说LIMIT模块应该像我所描述的那样工作。 而且我已经多次阅读了netfilter文档。
我在这里错过了什么?
先谢谢你。