J'ai essayé de mettre en place un système pour bloquer les ips s'ils agissent de manière malveillante. Il semble que cela fonctionne dans les tests, mais j'ai des résultats mitigés dans mon environnement réel.
Ce que j'ai essayé de faire est de bloquer les connexions si elles ont un taux d'erreur > 10, un nombre d'erreurs > 50 ou un taux de demandes > 150.
Tout d'abord, mon proxy frontal a la configuration :
stick-table type ip size 100k expire 30s store http_err_rate(10000),http_err_cnt,http_req_rate(10000)
tcp-request connection track-sc0 src
tcp-request connection accept if { src -f /etc/haproxy/whitelist.lst }
tcp-request connection reject if { sc0_http_err_rate gt 10 }
tcp-request connection reject if { sc0_http_err_cnt gt 50 }
tcp-request connection reject if { sc0_http_req_rate gt 150 }
J'ai récemment eu une IP faisant un scan qui n'était pas bloqué par haproxy, avant de bloquer par ip-tables j'ai vérifié les statistiques sur l'IP qui ont montré :
echo "show table clientsecure key x.x.x.x" | socat stdio /var/run/haproxy.stat
# table: clientsecure, type: ip, size:102400, used:23
xx: key=x.x.x.x use=8 exp=0 http_req_rate(10000)=144 http_err_cnt=34235 http_err_rate(10000)=150
J'ai l'impression d'avoir une incompréhension fondamentale de la configuration de haproxy.
Est-ce que j'utilise correctement le stick-table avec les règles de connexion tcp-request suivantes ?
La règle "tcp-request connection reject" bloque-t-elle les connexions entrantes si une seule règle correspond, ou doivent-elles toutes correspondre ?
Editar:
Après d'autres tests, je me suis rendu compte que les règles ne sont vérifiées que lors des nouvelles connexions. Donc l'utilisation de "option httpclose" arrêtera les gens dès qu'ils atteindront les limites. Évidemment, ce n'est pas l'idéal pour des raisons de vitesse, donc je vais expérimenter avec les délais d'attente keep-alive.