对来自另一个代理或 NAT 后面的客户端的 HAProxy 连接进行速率限制

对来自另一个代理或 NAT 后面的客户端的 HAProxy 连接进行速率限制

我们在 pfSense 硬件上运行 HAProxy,将单个前端转发到多个后端服务(使用 cookie)。一切运行良好。

我们想为 HAProxy 添加基本的“速率限制”。在前端配置中,我添加了

stick-table  type ip  size 100k  expire 20s  store http_req_rate(10s)
http-request track-sc0 src 
http-request deny deny_status 429 if { sc_http_req_rate(0) gt 100 }

但是,我们的一个客户在同一站点有数百名用户,他们通过代理服务器连接到我们的一个应用程序(从网络术语上讲,这个应用程序非常“健谈”) - 因此,到达 HAProxy 的请求都来自同一个源 IP。所有用户都倾向于在一天中的同一时间登录应用程序,因此我对设置新连接数限制持谨慎态度。

虽然我意识到这可能是一个“双输”的情况,但有没有什么建议可以解决这种情况?当然,我可以将速率限制提高到远高于最大流量水平,但我觉得这会降低任何速率限制在防止恶意攻击方面的有效性。

答案1

我猜你唯一的选择是使用 cookies 或者可能(但不太可能)使用 x-forwarded-for 标头。cookie 选项类似于黑色星期五保护:http://www.loadbalancer.org/blog/black-friday-black-out-protection-with-haproxy/ 如果您能获得所面临问题的实用示例,那将会非常有趣。

答案2

您可以使用X-Forwarded-For标头代替源 IP,以便您的“特殊”客户可以发出更多请求。例如:

    stick-table  type ip  size 100k  expire 30s  store http_req_rate(10s)
    http-request track-sc0 hdr(X-Forwarded-For)
    acl vip_ip hdr_ip(X-Forwarded-For) 1.2.3.4
    http-request deny deny_status 429 if { sc_http_req_rate(0) gt 100 } !vip_ip
    http-request deny deny_status 429 if { sc_http_req_rate(0) gt 500 } vip_ip

这里,任何拥有X-Forwarded-For与 IP 匹配的 HTTP 标头的人1.2.3.4 都将被允许访问,500 requests10 seconds不是正常的100

请注意,X-Forwarded-For标头可能会被伪造,因此它不是一种完全可靠的访问控制方法。也许您的 WAF(代理服务器)可以限制客户端X-Forwarded-For,并在可能的情况下拒绝访问。

相关内容