如果 Haproxy 的 stick-table 已满,它可以拒绝 IP 请求吗?

如果 Haproxy 的 stick-table 已满,它可以拒绝 IP 请求吗?

在我的 haproxy 配置中,我设置了一个大小为 5 的 stick-table,用于存储每个传入的 IP 地址(持续 1 分钟),并且设置了nopurge新条目,因此不会存储在表中。我希望发生的是它们会被拒绝,但这并没有发生。

贴表线为:

stick-table type ip size 5 expire 1m nopurge store gpc0

整个配置如下:

global
        maxconn 30000
        ulimit-n 65536
        log     127.0.0.1 local0
        log     127.0.0.1 local1 debug
        stats socket /var/run/haproxy.stat mode 600 level operator

defaults
        mode http
        timeout connect 5000ms
        timeout client 50000ms
        timeout server 50000ms

backend fragile_backend
        tcp-request content  track-sc2 src
        stick-table type ip size 5 expire 1m nopurge store gpc0
        server fragile_backend1 A.B.C.D:80

frontend http_proxy
        bind *:80
        mode http
        option forwardfor
        default_backend fragile_backend

我已经确认(使用 连接到 haproxy 的统计信息socat readline /var/run/haproxy.stat)stick-table 填满了 5 个 IP 地址,但是之后来自新 IP 的每个请求都会直接通过 - 它不会被添加到 stick-table 中,也不会从 stick-table 中删除任何内容,并且请求也不会被拒绝。

如果 stick-table 已满,我想做的是拒绝该请求。这可能吗?

我正在使用 haproxy 1.5。

答案1

正如我在另一个帖子中所说的那样,这需要添加一个非常简单的 ACL 来报告表中使用的条目数。我认为最多只有 10 行代码(包括函数声明),但我们需要添加它。我现在没有时间,所以我将其添加到 TODO 列表中,如果有人有时间做这件事,我会接受贡献。

答案2

从文档的措辞来看,这听起来不像是应该发生的行为。但也许您可以增加表中每个 IP 的 GPC,如果为零则拒绝?:

src_get_gpc0(table) <integer>
  Returns the value of the first General Purpose Counter associated to the
  connection's source IPv4 address in the current proxy's stick-table or in
  the designated stick-table. If the address is not found, zero is returned.
  See also sc1/sc2_get_gpc0 and src_inc_gpc0.

话虽如此,您的后端称为“fragile_backend”。如果您尝试限制与服务器的连接数,因为服务器一次只能处理这么多的连接,您可能希望maxconn在服务器定义中使用该参数。使用此功能,HAPRoxy 将对超出该数量的连接进行排队。您可能还对以下内容感兴趣:

be_conn <integer>
be_conn(backend) <integer>
  Applies to the number of currently established connections on the backend,
  possibly including the connection being evaluated. If no backend name is
  specified, the current one is used. But it is also possible to check another
  backend. It can be used to use a specific farm when the nominal one is full.
  See also the "fe_conn", "queue" and "be_sess_rate" criteria.

相关内容