我们在 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 requests
而10 seconds
不是正常的100
。
请注意,X-Forwarded-For
标头可能会被伪造,因此它不是一种完全可靠的访问控制方法。也许您的 WAF(代理服务器)可以限制客户端X-Forwarded-For
,并在可能的情况下拒绝访问。