Назад | Перейти на главную страницу

Ограничение скорости Haproxy, conn_rate, conn_cur

Пытался добиться ограничения скорости на 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)