Haproxy 速率限制,conn_rate,conn_cur

w00*_*00t 5 haproxy

尝试通过以下方式实现 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,考虑到MaxClients250。

预期的行为不应该是禁止滥用 IP 的所有新的和已建立的连接吗?

-- 请不要向我指出卓越文章,他们的例子甚至都不正确。他们举例说明了src_conn_cursrc_conn_rate,当他们应该使用时sc1_*(因为之前的不起作用)。

nan*_*doP 1

如果您的 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 后面),这才有效