Haproxy限速,conn_rate,conn_cur

试图通过以下方式实现haproxy 1.5-18的速率限制:

frontend stick-table type ip size 100k expire 30s store conn_rate(3s) #connection rate stick-table type ip size 1m expire 10s store gpc0,http_req_rate(10s) #http req rate stick-table type ip size 100k expire 30s store conn_cur #concurrent connections tcp-request connection track-sc1 src tcp-request connection reject if { sc1_conn_rate ge 20 } tcp-request connection reject if { src_get_gpc0(front) gt 50 } tcp-request connection reject if { sc1_conn_cur ge 50 } backend acl abuse src_http_req_rate(front) ge 10 acl flag_abuser src_inc_gpc0(front) tcp-request content reject if abuse flag_abuser 

这将工作,因为http_req_rate会踢,禁止施虐者。 但是,如果我删除http_req_rate规则,只留下这些

 frontend stick-table type ip size 100k expire 30s store conn_rate(3s) #connection rate stick-table type ip size 100k expire 30s store conn_cur #concurrent connections tcp-request connection track-sc1 src tcp-request connection reject if { sc1_conn_rate ge 50 } tcp-request connection reject if { sc1_conn_cur ge 50 } 

那么施虐者并不是被禁止的,而只是不允许发起50多个连接。 通过观察Apache队列,“滥用者”将保持不超过50个连接繁忙。

虽然这是好事,因为一个IP不会使MaxClients最大化,但也不是最好的,因为考虑到MaxClients个IP将会是5 * 50 = 250。

不应该有意的行为是禁止滥用IP的所有新的和既定的联系?

– 请不要把我的意见写在文章上,他们的例子甚至都不正确。 当他们应该使用sc1_* (因为之前的不工作),他们举例说明了src_conn_cursrc_conn_rate

如果你的haproxy是在互联网上(即拥有公共IP,而不是在防火墙后面等)生活的话,你可以通过使用iptables来进一步限制下来的堆栈…

iptables -I INPUT -p tcp -dport 80 -i eth0 -m state –state NEW -m最近的–set

iptables -I INPUT -p tcp -dport 80 -i eth0 -m state –state新-m最近–update – 秒60 –hitcount 10 -j DROP

所以haproxy守护进程甚至不会得到stream量,这意味着更高的效率和更less的负载。 这只会在haproxy拥有公共ip时才起作用(例如,不在amazon elb之后)