尝试通过以下方式实现 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
Run Code Online (Sandbox Code Playgroud)
这会起作用,因为它将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 }
Run Code Online (Sandbox Code Playgroud)
那么滥用者不会被禁止,但只是不允许发起超过 50 个连接。通过监视 Apache 队列,“滥用者”将保持不超过 50 个连接处于忙碌状态。
虽然这很好,因为 1 个 IP 不会达到最大MaxClients
,但它也不是最好的,因为 5 个 IP 会 - 5*50 = 250,考虑到MaxClients
250。
预期的行为不应该是禁止滥用 IP 的所有新的和已建立的连接吗?
-- 请不要向我指出卓越文章,他们的例子甚至都不正确。他们举例说明了src_conn_cur
和src_conn_rate
,当他们应该使用时sc1_*
(因为之前的不起作用)。
如果您的 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 NEW -m 最近 --update --seconds 60 --hitcount 10 -j DROP
因此 haproxy 守护进程甚至不会获取流量,这意味着更高的效率和更少的负载。仅当 haproxy 具有公共 IP 时(例如不在亚马逊 elb 后面),这才有效
归档时间: |
|
查看次数: |
5958 次 |
最近记录: |