5 votes

Haproxy limitation de débit (rate limiting), conn_rate, conn_cur.

Essayez d'obtenir un contrôle du débit sur haproxy 1.5-18 avec ce qui suit :

frontend
stick-table type ip size 100k expire 30s store conn_rate(3s)   #taux de connexion
stick-table type ip size 1m expire 10s store gpc0,http_req_rate(10s) #taux de req http
stick-table type ip size 100k expire 30s store conn_cur        #connexions concurrentes
    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

Cela fonctionnerait car le http_req_rate entrerait en action et bannirait l'abus. Mais si je supprime les règles http_req_rate et ne laisse que celles-ci

frontend
stick-table type ip size 100k expire 30s store conn_rate(3s)   #taux de connexion
stick-table type ip size 100k expire 30s store conn_cur        #connexions concurrentes
    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 }

alors un abuseur n'est pas banni, mais simplement autorisé à ne pas lancer plus de 50 connexions. En surveillant la file d'attente Apache, l' "abuseur" ne gardera pas plus de 50 connexions occupées.

Alors que c'est positif car une adresse IP ne dépasserait pas MaxClients, ce n'est pas non plus idéal car 5 adresses IP pourraient le faire - 5*50 = 250, en considérant MaxClients 250.

Ne devrait-on pas avoir comme comportement souhaité de bannir toutes les nouvelles connexions et connexions établies des adresses IP abusant?

-- s'il vous plaît ne me renvoyez pas à l'article de Exceliance, leurs exemples ne sont même pas corrects. Ils ont exemplifié src_conn_cur et src_conn_rate, alors qu'ils auraient dû utiliser sc1_* (parce que les premiers ne fonctionnent pas).

1voto

nandoP Points 1961

Si votre haproxy est en ligne sur Internet (c'est-à-dire, dispose d'une adresse IP publique, n'est pas derrière un pare-feu, etc)... vous pourriez limiter le débit plus bas dans la pile en utilisant iptables...

iptables -I INPUT -p tcp --dport 80 -i eth0 -m state --state NEW -m recent --set

iptables -I INPUT -p tcp --dport 80 -i eth0 -m state --state NEW -m recent --update --seconds 60 --hitcount 10 -j DROP

ainsi, le démon haproxy ne recevra même pas le trafic, ce qui signifie plus d'efficacité et moins de charge. Cela ne fonctionnerait que si le haproxy dispose d'une adresse IP publique (pas derrière un équilibreur de charge Amazon, par exemple)

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X