【问题标题】:How to rate limit by HTTP status code with HAProxy?如何使用 HAProxy 通过 HTTP 状态码进行速率限制?
【发布时间】:2019-09-24 16:37:40
【问题描述】:

HAProxy 提供了一个内置的 http_err_rate 计数器,“报告该期间的平均 HTTP 请求错误率”。这可以在一个棒表中使用,以限制产生大量错误的客户端。这可能看起来像这样:

frontend web
  tcp-request content reject if { src_get_gpc0(Abuse) gt 0 }
  acl scanner src_http_err_rate(Abuse) ge 10
  http-request deny if scanner flag_abuser

backend Abuse
  stick-table type ip size 1m expire 60m store gpc0,http_err_rate(20s)

我想做的是跟踪http_err_rate 之类的东西,但只针对401 Unauthorized 状态代码。这样,HAProxy 将只关心限制速率的未授权请求,而不是所有 HTTP 错误代码。

谢谢!

【问题讨论】:

    标签: haproxy


    【解决方案1】:

    我想做的是跟踪 http_err_rate 之类的东西,但仅限于 401 Unauthorized 状态代码。

    您可以将General Purpose Counters 与匹配status 的ACL 一起使用。以下示例配置将跟踪给定 IP 地址 [1] 的 404 错误率,并在超过每 10 秒 10 个请求的速率时拒绝具有 429 状态的请求:

    frontend fe_http
        mode http
        bind *:8080
    
        stick-table type ipv6 size 10k expire 300s store gpc0_rate(10s)
        http-request  track-sc0 src
        http-request  deny deny_status 429 if { sc0_gpc0_rate gt 10 }
        # Relevant line below
        http-response sc-inc-gpc0(0) if { status 404 }
    
        default_backend be_http
    
    backend be_http
        mode http
        server example example.com:80
    

    [1] 注意:我推荐使用ipv6作为stick table key,它可以同时包含IPv4和IPv6地址。

    【讨论】:

      【解决方案2】:

      如果您想根据他们的 401 速率限制速率,您需要在配置中将 429 代码更改为 401:

      http-request deny deny_status 401 if { sc_http_req_cnt(0) gt 10 }
      

      使用deny 和tarpit,您可以添加deny_status 标志来设置 自定义响应代码,而不是他们使用的默认 403/500 的盒子。例如使用 http-request deny deny_status 429 将 导致 HAProxy 响应客户端错误 429: Too Many 请求。

      有关 acls 和速率限制的更多“一般”信息,您可以查看:

      https://www.haproxy.com/blog/four-examples-of-haproxy-rate-limiting/ https://www.haproxy.com/blog/introduction-to-haproxy-acls/

      【讨论】:

        猜你喜欢
        • 2020-10-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多