Пытался добиться ограничения скорости на haproxy 1.5-18 следующим образом:
frontend
stick-table type ip size 100k expire 30s store conn_rate(3s) #connection rate
stick-table type ip size 1m expire 10s store gpc0,http_req_rate(10s) #http req rate
stick-table type ip size 100k expire 30s store conn_cur #concurrent connections
tcp-request connection track-sc1 src
tcp-request connection reject if { sc1_conn_rate ge 20 }
tcp-request connection reject if { src_get_gpc0(front) gt 50 }
tcp-request connection reject if { sc1_conn_cur ge 50 }
backend
acl abuse src_http_req_rate(front) ge 10
acl flag_abuser src_inc_gpc0(front)
tcp-request content reject if abuse flag_abuser
Это сработает, потому что http_req_rate
вмешается и забанит обидчика. Но если я удалю http_req_rate
правила и оставьте только эти
frontend
stick-table type ip size 100k expire 30s store conn_rate(3s) #connection rate
stick-table type ip size 100k expire 30s store conn_cur #concurrent connections
tcp-request connection track-sc1 src
tcp-request connection reject if { sc1_conn_rate ge 50 }
tcp-request connection reject if { sc1_conn_cur ge 50 }
тогда злоумышленнику не запрещают, а просто не разрешают запускать более 50 подключений. Наблюдая за очередью Apache, «злоумышленник» будет держать занятыми не более 50 подключений.
Хотя это хорошо, потому что один IP-адрес не превысит MaxClients
, это также не лучший вариант, потому что 5 IP-адресов будут - 5 * 50 = 250, учитывая MaxClients
250.
Разве предполагаемое поведение не должно заключаться в запрете все новые и установленные соединения злоупотребляющих IP-адресов?
- пожалуйста, не указывайте мне на статью об Excel, их примеры даже не верны. Они послужили примером src_conn_cur
и src_conn_rate
, когда они должны были использовать sc1_*
(потому что предыдущие не работают).
если ваш haproxy подключен к Интернету (т.е. имеет общедоступный IP-адрес, а не за брандмауэром и т. д.) .... вы можете ограничить скорость дальше по стеку, используя iptables ...
iptables -I INPUT -p tcp --dport 80 -i eth0 -m state --state NEW -m latest --set
iptables -I INPUT -p tcp --dport 80 -i eth0 -m state --state NEW -m latest --update --seconds 60 --hitcount 10 -j DROP
поэтому демон haproxy даже не получит трафик, что означает большую эффективность и меньшую нагрузку. это будет работать только в том случае, если у haproxy есть общедоступный IP (например, не за amazon elb)