mirror of
http://git.haproxy.org/git/haproxy.git/
synced 2025-01-20 20:50:44 +00:00
[DOC] configuration: document all the new tracked counters
The following statements and ACLs have been added to the doc : - tcp-request track-counters <key> [table <table>] [{if | unless} <condition>] - src_* - trk_*
This commit is contained in:
parent
4f3f01fa39
commit
c9705a15f4
@ -4746,12 +4746,12 @@ stats scope { <name> | "." }
|
||||
See also : "stats auth", "stats enable", "stats realm", "stats uri"
|
||||
|
||||
|
||||
stats show-desc [ <description> ]
|
||||
stats show-desc [ <desc> ]
|
||||
Enable reporting of a description on the statistics page.
|
||||
May be used in sections : defaults | frontend | listen | backend
|
||||
yes | no | yes | yes
|
||||
|
||||
<name> is an optional description to be reported. If unspecified, the
|
||||
<desc> is an optional description to be reported. If unspecified, the
|
||||
description from global section is automatically used instead.
|
||||
|
||||
This statement is useful for users that offer shared services to their
|
||||
@ -5116,11 +5116,115 @@ stick-table type {ip | integer | string [len <length>] } size <size>
|
||||
may be used by ACLs in order to control various criteria related
|
||||
to the activity of the client matching the stick-table. For each
|
||||
item specified here, the size of each entry will be inflated so
|
||||
that the additional data can fit. At the moment, only "conn_cnt"
|
||||
is supported, which can be used to store and retrieve the total
|
||||
number of connections matching the entry since it was created. A
|
||||
"server_id" type is also supported but it's only for internal
|
||||
use for stick and store directives.
|
||||
that the additional data can fit. Several data types may be
|
||||
stored with an entry. Multiple data types may be specified after
|
||||
the "store" keyword, as a comma-separated list. Alternatively,
|
||||
it is possible to repeat the "store" keyword followed by one or
|
||||
several data types. Except for the "server_id" type which is
|
||||
automatically detected and enabled, all data types must be
|
||||
explicitly declared to be stored. If an ACL references a data
|
||||
type which is not stored, the ACL will simply not match. Some
|
||||
data types require an argument which must be passed just after
|
||||
the type between parenthesis. See below for the supported data
|
||||
types and their arguments.
|
||||
|
||||
The data types that can be stored with an entry are the following :
|
||||
- server_id : this is an integer which holds the numeric ID of the server a
|
||||
request was assigned to. It is used by the "stick match", "stick store",
|
||||
and "stick on" rules. It is automatically enabled when referenced.
|
||||
|
||||
- gpc0 : first General Purpose Counter. It is a positive 32-bit integer
|
||||
integer which may be used for anything. Most of the time it will be used
|
||||
to put a special tag on some entries, for instance to note that a
|
||||
specific behaviour was detected and must be known for future matches.
|
||||
|
||||
- conn_cnt : Connection Count. It is a positive 32-bit integer which counts
|
||||
the absolute number of connections received from clients which matched
|
||||
this entry. It does not mean the connections were accepted, just that
|
||||
they were received.
|
||||
|
||||
- conn_cur : Current Connections. It is a positive 32-bit integer which
|
||||
stores the concurrent connection counts for the entry. It is incremented
|
||||
once an incoming connection matches the entry, and decremented once the
|
||||
connection leaves. That way it is possible to know at any time the exact
|
||||
number of concurrent connections for an entry.
|
||||
|
||||
- conn_rate(<period>) : frequency counter (takes 12 bytes). It takes an
|
||||
integer parameter <period> which indicates in milliseconds the length
|
||||
of the period over which the average is measured. It reports the average
|
||||
incoming connection rate over that period, in connections per period. The
|
||||
result is an integer which can be matched using ACLs.
|
||||
|
||||
- sess_cnt : Session Count. It is a positive 32-bit integer which counts
|
||||
the absolute number of sessions received from clients which matched this
|
||||
entry. A session is a connection that was accepted by the layer 4 rules.
|
||||
|
||||
- sess_rate(<period>) : frequency counter (takes 12 bytes). It takes an
|
||||
integer parameter <period> which indicates in milliseconds the length
|
||||
of the period over which the average is measured. It reports the average
|
||||
incoming session rate over that period, in sessions per period. The
|
||||
result is an integer which can be matched using ACLs.
|
||||
|
||||
- http_req_cnt : HTTP request Count. It is a positive 32-bit integer which
|
||||
counts the absolute number of HTTP requests received from clients which
|
||||
matched this entry. It does not matter whether they are valid requests or
|
||||
not. Note that this is different from sessions when keep-alive is used on
|
||||
the client side.
|
||||
|
||||
- http_req_rate(<period>) : frequency counter (takes 12 bytes). It takes an
|
||||
integer parameter <period> which indicates in milliseconds the length
|
||||
of the period over which the average is measured. It reports the average
|
||||
HTTP request rate over that period, in requests per period. The result is
|
||||
an integer which can be matched using ACLs. It does not matter whether
|
||||
they are valid requests or not. Note that this is different from sessions
|
||||
when keep-alive is used on the client side.
|
||||
|
||||
- http_err_cnt : HTTP Error Count. It is a positive 32-bit integer which
|
||||
counts the absolute number of HTTP requests errors induced by clients
|
||||
which matched this entry. Errors are counted on invalid and truncated
|
||||
requests, as well as on denied or tarpitted requests, and on failed
|
||||
authentications. If the server responds with 4xx, then the request is
|
||||
also counted as an error since it's an error triggered by the client
|
||||
(eg: vulnerability scan).
|
||||
|
||||
- http_err_rate(<period>) : frequency counter (takes 12 bytes). It takes an
|
||||
integer parameter <period> which indicates in milliseconds the length
|
||||
of the period over which the average is measured. It reports the average
|
||||
HTTP request error rate over that period, in requests per period (see
|
||||
http_err_cnt above for what is accounted as an error). The result is an
|
||||
integer which can be matched using ACLs.
|
||||
|
||||
- bytes_in_cnt : client to server byte count. It is a positive 64-bit
|
||||
integer which counts the cumulated amount of bytes received from clients
|
||||
which matched this entry. Headers are included in the count. This may be
|
||||
used to limit abuse of upload features on photo or video servers.
|
||||
|
||||
- bytes_in_rate(<period>) : frequency counter (takes 12 bytes). It takes an
|
||||
integer parameter <period> which indicates in milliseconds the length
|
||||
of the period over which the average is measured. It reports the average
|
||||
incoming bytes rate over that period, in bytes per period. It may be used
|
||||
to detect users which upload too much and too fast. Warning: with large
|
||||
uploads, it is possible that the amount of uploaded data will be counted
|
||||
once upon termination, thus causing spikes in the average transfer speed
|
||||
instead of having a smooth one. This may partially be smoothed with
|
||||
"option contstats" though this is not perfect yet. Use of byte_in_cnt is
|
||||
recommended for better fairness.
|
||||
|
||||
- bytes_out_cnt : server to client byte count. It is a positive 64-bit
|
||||
integer which counts the cumulated amount of bytes sent to clients which
|
||||
matched this entry. Headers are included in the count. This may be used
|
||||
to limit abuse of bots sucking the whole site.
|
||||
|
||||
- bytes_out_rate(<period>) : frequency counter (takes 12 bytes). It takes
|
||||
an integer parameter <period> which indicates in milliseconds the length
|
||||
of the period over which the average is measured. It reports the average
|
||||
outgoing bytes rate over that period, in bytes per period. It may be used
|
||||
to detect users which download too much and too fast. Warning: with large
|
||||
transfers, it is possible that the amount of transferred data will be
|
||||
counted once upon termination, thus causing spikes in the average
|
||||
transfer speed instead of having a smooth one. This may partially be
|
||||
smoothed with "option contstats" though this is not perfect yet. Use of
|
||||
byte_out_cnt is recommended for better fairness.
|
||||
|
||||
There is only one stick-table per proxy. At the moment of writing this doc,
|
||||
it does not seem useful to have multiple tables per proxy. If this happens
|
||||
@ -5132,8 +5236,19 @@ stick-table type {ip | integer | string [len <length>] } size <size>
|
||||
lost upon restart. In general it can be good as a complement but not always
|
||||
as an exclusive stickiness.
|
||||
|
||||
See also : "stick match", "stick on", "stick store-request", and section 2.2
|
||||
about time format.
|
||||
Last, memory requirements may be important when storing many data types.
|
||||
Indeed, storing all indicators above at once in each entry requires 116 bytes
|
||||
per entry, or 116 MB for a 1-million entries table. This is definitely not
|
||||
something that can be ignored.
|
||||
|
||||
Example:
|
||||
# Keep track of counters of up to 1 million IP addresses over 5 minutes
|
||||
# and store a general purpose counter and the average connection rate
|
||||
# computed over a sliding window of 30 seconds.
|
||||
stick-table type ip size 1m expire 5m store gpc0,conn_rate(30s)
|
||||
|
||||
See also : "stick match", "stick on", "stick store-request", section 2.2
|
||||
about time format and section 7 avoud ACLs.
|
||||
|
||||
|
||||
tcp-request accept [{if | unless} <condition>]
|
||||
@ -5321,6 +5436,65 @@ tcp-request reject [{if | unless} <condition>]
|
||||
See also : "tcp-request accept" and "tcp-request content"
|
||||
|
||||
|
||||
tcp-request track-counters <key> [table <table>] [{if | unless} <condition>]
|
||||
Enable tracking of session counters if/unless a layer 4 condition is matched
|
||||
May be used in sections : defaults | frontend | listen | backend
|
||||
no | yes | yes | no
|
||||
|
||||
Arguments :
|
||||
<key> is the criterion the tracking key will be derived from. At the
|
||||
moment, only "src" is supported. With it, the key will be the
|
||||
connection's source IPv4 address.
|
||||
|
||||
<table> is an optional table to use instead of the one from the current
|
||||
proxy. All the counters for the matches and updates for the key
|
||||
will then be performed in that table.
|
||||
|
||||
Immediately after a new incoming connection has been accepted, it is possible
|
||||
to enable tracking of some of this session's counters in a table. Doing so
|
||||
serves two purposes :
|
||||
- feed the entry with the session's counters that are relevant to the table
|
||||
being pointed. These counters are then updated as often as possible, and
|
||||
also systematically when the session ends.
|
||||
|
||||
- keep a pointer to the entry in the table in the session to avoid having
|
||||
to perform key lookups when complex ACL rules make use of the entry,
|
||||
especially when the key is expensive to compute (eg: header-based).
|
||||
|
||||
It is possible to evaluate some conditions to decide whether a track-counters
|
||||
statement will apply or not. In this case, only the first matching rule will
|
||||
apply and the other ones will be ignored. We could for instance imagine that
|
||||
some hosts which are references in a white list make use of a different
|
||||
counters table, or do not get accounted for. The tracking is enabled if the
|
||||
condition is true (when used with "if") or false (when used with "unless").
|
||||
There is no specific limit to the number of rules which may be declared.
|
||||
|
||||
It is important to understand that "accept", "reject" and "track-counters"
|
||||
rules are evaluated in their exact declaration order, so that it is possible
|
||||
to build complex rules from them. For instance, the following rule rejects
|
||||
too fast connections without tracking them, to that they get accepted again
|
||||
after some time despite activity, while the second one will still update the
|
||||
counters when rejecting a connection.
|
||||
|
||||
Example:
|
||||
# reject too fast connection without counting them
|
||||
tcp-request reject if { src_conn_rate gt 10 }
|
||||
tcp-request track-counters src
|
||||
|
||||
# reject too fast connection and count them
|
||||
tcp-request track-counters src
|
||||
tcp-request reject if { src_conn_rate gt 10 }
|
||||
|
||||
|
||||
Note that the "if/unless" condition is optional. If no condition is set on
|
||||
the action, it is simply performed unconditionally.
|
||||
|
||||
See section 7 about ACL usage.
|
||||
|
||||
See also : "tcp-request accept", "tcp-request reject", "tcp-request content",
|
||||
and "stick-table".
|
||||
|
||||
|
||||
timeout check <timeout>
|
||||
Set additional check timeout, but only after a connection has been already
|
||||
established.
|
||||
@ -6337,23 +6511,135 @@ src <ip_address>
|
||||
certain resources such as statistics. Note that it is the TCP-level source
|
||||
address which is used, and not the address of a client behind a proxy.
|
||||
|
||||
src_count <integer>
|
||||
src_count(backend) <integer>
|
||||
Returns the number of occurrences of the source IPv4 address in the current
|
||||
backend's stick-table or in the designated stick-table. If the address is not
|
||||
found, zero is returned.
|
||||
src_bytes_in_rate <integer>
|
||||
src_bytes_in_rate(table) <integer>
|
||||
Returns the average bytes rate from the connection's source IPv4 address in
|
||||
the current proxy's stick-table or in the designated stick-table, measured in
|
||||
amount of bytes over the period configured in the table. If the address is
|
||||
not found, zero is returned. See also trk_bytes_in_rate.
|
||||
|
||||
src_bytes_out_rate <integer>
|
||||
src_bytes_out_rate(table) <integer>
|
||||
Returns the average bytes rate to the connection's source IPv4 address in the
|
||||
current proxy's stick-table or in the designated stick-table, measured in
|
||||
amount of bytes over the period configured in the table. If the address is
|
||||
not found, zero is returned. See also trk_bytes_out_rate.
|
||||
|
||||
src_conn_cnt <integer>
|
||||
src_conn_cnt(table) <integer>
|
||||
Returns the cumulated number of connections initiated from the current
|
||||
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 trk_conn_cnt.
|
||||
|
||||
src_conn_cur <integer>
|
||||
src_conn_cur(table) <integer>
|
||||
Returns the current amount of concurrent connections initiated from the
|
||||
current 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 trk_conn_cur.
|
||||
|
||||
src_conn_rate <integer>
|
||||
src_conn_rate(table) <integer>
|
||||
Returns the average connection rate from the connection's source IPv4 address
|
||||
in the current proxy's stick-table or in the designated stick-table, measured
|
||||
in amount of connections over the period configured in the table. If the
|
||||
address is not found, zero is returned. See also trk_conn_rate.
|
||||
|
||||
src_get_gpc0 <integer>
|
||||
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 trk_get_gpc0 and src_inc_gpc0.
|
||||
|
||||
src_http_err_cnt <integer>
|
||||
src_http_err_cnt(table) <integer>
|
||||
Returns the cumulated number of HTTP errors from the current connection's
|
||||
source IPv4 address in the current proxy's stick-table or in the designated
|
||||
stick-table. This includes the both request errors and 4xx error responses.
|
||||
If the address is not found, zero is returned. See also trk_http_err_cnt.
|
||||
|
||||
src_http_err_rate <integer>
|
||||
src_http_err_rate(table) <integer>
|
||||
Returns the average rate of HTTP errors from the current connection's source
|
||||
IPv4 address in the current proxy's stick-table or in the designated stick-
|
||||
table, measured in amount of errors over the period configured in the table.
|
||||
This includes the both request errors and 4xx error responses. If the address
|
||||
is not found, zero is returned. See also trk_http_err_rate.
|
||||
|
||||
src_http_req_cnt <integer>
|
||||
src_http_req_cnt(table) <integer>
|
||||
Returns the cumulated number of HTTP requests from the current connection's
|
||||
source IPv4 address in the current proxy's stick-table or in the designated
|
||||
stick-table. This includes every started request, valid or not. If the
|
||||
address is not found, zero is returned. See also trk_http_req_cnt.
|
||||
|
||||
src_http_req_rate <integer>
|
||||
src_http_req_rate(table) <integer>
|
||||
Returns the average rate of HTTP requests from the current connection's
|
||||
source IPv4 address in the current proxy's stick-table or in the designated
|
||||
stick-table, measured in amount of requests over the period configured in the
|
||||
table. This includes every started request, valid or not. If the address is
|
||||
not found, zero is returned. See also trk_http_req_rate.
|
||||
|
||||
src_inc_gpc0 <integer>
|
||||
src_inc_gpc0(table) <integer>
|
||||
Increments 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, and returns its value. If the address is not found, an entry is
|
||||
created and 1 is returned. The test can also be used alone and always returns
|
||||
true. This is typically used as a second ACL in an expression in order to
|
||||
mark a connection when a first ACL was verified :
|
||||
|
||||
acl abuse src_http_req_rate gt 10
|
||||
acl kill src_inc_gpc0
|
||||
tcp-request reject if abuse kill
|
||||
|
||||
src_kbytes_in <integer>
|
||||
src_kbytes_in(table) <integer>
|
||||
Returns the amount of data received from the connection's source IPv4 address
|
||||
in the current proxy's stick-table or in the designated stick-table, measured
|
||||
in kilobytes over the period configured in the table. If the address is not
|
||||
found, zero is returned. The test is currently performed on 32-bit integers,
|
||||
which limits values to 4 terabytes. See also trk_kbytes_in.
|
||||
|
||||
src_kbytes_out <integer>
|
||||
src_kbytes_out(table) <integer>
|
||||
Returns the amount of data sent to the connection's source IPv4 address in
|
||||
the current proxy's stick-table or in the designated stick-table, measured
|
||||
in kilobytes over the period configured in the table. If the address is not
|
||||
found, zero is returned. The test is currently performed on 32-bit integers,
|
||||
which limits values to 4 terabytes. See also trk_kbytes_out.
|
||||
|
||||
src_port <integer>
|
||||
Applies to the client's TCP source port. This has a very limited usage.
|
||||
|
||||
src_update_count <integer>
|
||||
src_update_count(backend) <integer>
|
||||
src_sess_cnt <integer>
|
||||
src_sess_cnt(table) <integer>
|
||||
Returns the cumulated number of connections initiated from the current
|
||||
connection's source IPv4 address in the current proxy's stick-table or in the
|
||||
designated stick-table, that were transformed into sessions, which means that
|
||||
they were accepted by "tcp-request" rules. If the address is not found, zero
|
||||
is returned. See also trk_sess_cnt.
|
||||
|
||||
src_sess_rate <integer>
|
||||
src_sess_rate(table) <integer>
|
||||
Returns the average session rate from the connection's source IPv4 address in
|
||||
the current proxy's stick-table or in the designated stick-table, measured in
|
||||
amount of sessions over the period configured in the table. A session is a
|
||||
connection that got past the early "tcp-request" rules. If the address is not
|
||||
found, zero is returned. See also trk_sess_rate.
|
||||
|
||||
src_updt_conn_cnt <integer>
|
||||
src_updt_conn_cnt(table) <integer>
|
||||
Creates or updates the entry associated to the source IPv4 address in the
|
||||
current backend's stick-table or in the designated stick-table. This table
|
||||
must be configured to store the "conn_cum" data type, otherwise the match
|
||||
current proxy's stick-table or in the designated stick-table. This table
|
||||
must be configured to store the "conn_cnt" data type, otherwise the match
|
||||
will be ignored. The current count is incremented by one, and the expiration
|
||||
timer refreshed. The updated count is returned, so this match can't return
|
||||
zero. This is used to reject service abusers based on their source address.
|
||||
Note: it is recommended to use the more complete "track-counters" instead.
|
||||
|
||||
Example :
|
||||
# This frontend limits incoming SSH connections to 3 per 10 second for
|
||||
@ -6363,7 +6649,7 @@ src_update_count(backend) <integer>
|
||||
bind :22
|
||||
mode tcp
|
||||
maxconn 100
|
||||
stick-table type ip size 20 expire 10s store conn_cum
|
||||
stick-table type ip size 20 expire 10s store conn_cnt
|
||||
tcp-request content reject if { src_update_count gt 3 }
|
||||
server local 127.0.0.1:22
|
||||
|
||||
@ -6378,6 +6664,91 @@ srv_is_up(<backend>/<server>)
|
||||
as boolean variables that can be enabled or disabled from the CLI, so that
|
||||
rules depending on those ACLs can be tweaked in realtime.
|
||||
|
||||
trk_bytes_in_rate
|
||||
Returns the average client-to-server bytes rate from the currently tracked
|
||||
counters, measured in amount of bytes over the period configured in the
|
||||
table. See also src_bytes_in_rate.
|
||||
|
||||
trk_bytes_out_rate
|
||||
Returns the average server-to-client bytes rate from the currently tracked
|
||||
counters, measured in amount of bytes over the period configured in the
|
||||
table. See also src_bytes_out_rate.
|
||||
|
||||
trk_conn_cnt
|
||||
Returns the cumulated number of incoming connections from currently tracked
|
||||
counters. See also src_conn_cnt.
|
||||
|
||||
trk_conn_cur
|
||||
Returns the current amount of concurrent connections tracking the same
|
||||
tracked counters. This number is automatically incremented when tracking
|
||||
begins and decremented when tracking stops. See also src_conn_cur.
|
||||
|
||||
trk_conn_rate
|
||||
Returns the average connection rate from the currently tracked counters,
|
||||
measured in amount of connections over the period configured in the table.
|
||||
See also src_conn_rate.
|
||||
|
||||
trk_get_gpc0
|
||||
Returns the value of the first General Purpose Counter associated to the
|
||||
currently tracked counters. See also src_get_gpc0 and trk_inc_gpc0.
|
||||
|
||||
trk_http_err_cnt
|
||||
Returns the cumulated number of HTTP errors from the currently tracked
|
||||
counters. This includes the both request errors and 4xx error responses.
|
||||
See also src_http_err_cnt.
|
||||
|
||||
trk_http_err_rate
|
||||
Returns the average rate of HTTP errors from the currently tracked counters,
|
||||
measured in amount of errors over the period configured in the table. This
|
||||
includes the both request errors and 4xx error responses. See also
|
||||
src_http_err_rate.
|
||||
|
||||
trk_http_req_cnt
|
||||
Returns the cumulated number of HTTP requests from the currently tracked
|
||||
counters. This includes every started request, valid or not. See also
|
||||
src_http_req_cnt.
|
||||
|
||||
trk_http_req_rate
|
||||
Returns the average rate of HTTP requests from the currently tracked
|
||||
counters, measured in amount of requests over the period configured in
|
||||
the table. This includes every started request, valid or not. See also
|
||||
src_http_req_rate.
|
||||
|
||||
trk_inc_gpc0
|
||||
Increments the first General Purpose Counter associated to the currently
|
||||
tracked counters, and returns its value. Before the first invocation, the
|
||||
stored value is zero, so first invocation will increase it to 1 and will
|
||||
return 1. The test can also be used alone and always returns true. This is
|
||||
typically used as a second ACL in an expression in order to mark a connection
|
||||
when a first ACL was verified :
|
||||
|
||||
acl abuse trk_http_req_rate gt 10
|
||||
acl kill trk_inc_gpc0
|
||||
tcp-request reject if abuse kill
|
||||
|
||||
trk_kbytes_in
|
||||
Returns the amount of client-to-server data from the currently tracked
|
||||
counters, measured in kilobytes over the period configured in the table. The
|
||||
test is currently performed on 32-bit integers, which limits values to 4
|
||||
terabytes. See also src_kbytes_in.
|
||||
|
||||
trk_kbytes_out
|
||||
Returns the amount of server-to-client data from the currently tracked
|
||||
counters, measured in kilobytes over the period configured in the table. The
|
||||
test is currently performed on 32-bit integers, which limits values to 4
|
||||
terabytes. See also src_kbytes_out.
|
||||
|
||||
trk_sess_cnt
|
||||
Returns the cumulated number of incoming connections that were transformed
|
||||
into sessions, which means that they were accepted by "tcp-request" rules,
|
||||
from the currently tracked counters. See also src_sess_cnt.
|
||||
|
||||
trk_sess_rate
|
||||
Returns the average session rate from the currently tracked counters,
|
||||
measured in amount of sessions over the period configured in the table. A
|
||||
session is a connection that got past the early "tcp-request" rules. See
|
||||
also src_sess_rate.
|
||||
|
||||
|
||||
7.5.2. Matching contents at Layer 4
|
||||
-----------------------------------
|
||||
|
Loading…
Reference in New Issue
Block a user