5 votes

Haproxy tombe en panne sous forte charge

Je rencontre quelques problèmes de configuration HAProxy. J'ai joué avec pour essayer de le rendre plus résilient aux charges élevées des serveurs et aux attaques par déni de service. Cependant, tout semblait fonctionner correctement jusqu'à ce que je sois soudainement victime d'une attaque (D)DoS - Haproxy signalait que le backend était hors service même si j'y accédais toujours correctement via le port direct.

Est-ce que quelqu'un pourrait vérifier ma configuration HAProxy et voir s'il y a quelque chose qui cloche ou pourquoi je rencontre ce problème... Je n'arrive tout simplement pas à comprendre pourquoi cela se produit.

Merci d'avance (et après bien sûr).

global

    # Connexions Globales Max
        maxconn                                 20000
        # Autres paramètres
        pidfile                                 /var/run/haproxy.pid
        stats socket                            /var/run/haproxy.stat mode 600 level admin
        stats timeout                           5m
        chroot                                  /usr/share/haproxy
        daemon
        # Paramètres Utilisateur
        user                                    haproxy
        group                                   haproxy

defaults
        # Paramètres de configuration par défaut pour Haproxy
        retries                                 2
        maxconn                                 19500
        timeout server                          10s
        timeout client                          10s
        timeout queue                           10s
        timeout connect                         10s
        timeout http-request                    10s
        # Fichiers d'erreur
        errorfile 503 /etc/phpconf/haErrors/503.http

frontend Connection_Handler
        default_backend Primary
        bind :80
        mode                                    http
        option                                  forwardfor
        option                                  http-server-close
        maxconn                                 20000
        # Vérifier si le cookie existe
        #acl cookie_set hdr_sub(cookie) authorized=1
        # Si le cookie n'existe pas, essayer de le définir
        #redirect prefix * set-cookie authorized=1 if !cookie_set

        # Si le cookie n'est toujours pas défini, l'envoyer au backend bloqué
        #use_backend Cookie_Block if !cookie_set

        ## (D)DoS Mitigation ##
        # Table de routage des connexions
        stick-table type ip size 1m expire 10m store gpc0
        # Configurer le DoS src
        acl src_DoS src_get_gpc0(Connection_Handler) gt 0
        # Utiliser DoS tarpit si src_DoS
        use_backend DoS_Tarpit if src_DoS
        # Si non bloqué, suivre la connexion
        tcp-request connection track-sc1 src if ! src_DoS

listen Statistics_Engine
        mode http
        bind                                    XX.XXX.XX.XX:9012
        stats                                   enable
        stats uri                               /admin?stats=true

        stats auth                              admin:Password
        stats hide-version
        stats refresh 2s
        #stats scope # Ajouter cette option pour fournir des statistiques pour un backend unique

backend Primary
        # Configurations d'options
        option                                  httpclose
        option                                  redispatch
        option                                  abortonclose

        ## (D)DoS Mitigation ##
        # La table suivante enregistre l'IP, le taux de connexion et le taux de bytes sortants
        stick-table type ip size 200k expire 10s store conn_rate(5s)

        # Suivre la demande et appliquer les règles
        tcp-request content track-sc2 src
        # Marquer comme abus si le taux de connexion est dépassé
        acl conn_rate_abuse sc2_conn_rate gt 80
        # Marquer comme abus si supérieur à X bytes
        acl data_rate_abuse sc2_bytes_out_rate gt 200000

        # Définir une règle ACL à appliquer sur le frontend
        acl mark_as_DoS sc1_inc_gpc0 gt 0
        # Bloquer les connexions marquées comme DoS
        tcp-request content reject if conn_rate_abuse mark_as_DoS
        #tcp-request content reject if data_rate_abuse mark_as_DoS

        # Configurer le Serveur
        mode http
        option forwardfor
        server Primary_HTTP 0.0.0.0:1080 check addr 127.0.0.1 port 80 inter 3000 rise 2 fall 3 maxconn 20000
        #fullconn 1024

backend Conn_Tarpit
        # Tarpit pour les connexions
        mode http
        timeout tarpit 20s
        reqitarpit .
        errorfile 503 /etc/phpconf/haErrors/tarpit_503.txt

backend Cookie_Block
        # Bloquer les connexions qui n'accepteront pas de cookie
        mode http
        reqdeny .
        errorfile 503 /etc/phpconf/haErrors/503_cookie.txt

backend DoS_Tarpit

        # Tarpit pour les attaques suspectées
        log 127.0.0.1 local1 info
        timeout tarpit 10s # Tarpit pendant 10 secondes
        errorfile 500 /etc/phpconf/haErrors/500_DoS.txt
        mode http
        reqitarpit .

4voto

Willy Tarreau Points 3934

Je ne vois rien d'évidemment faux dans votre configuration, il semble que vous ayez déjà pris soin de régler correctement vos paramètres (surtout maxconn). Conntrack est-il chargé sur cette machine ? La table de connexions pourrait être pleine, empêchant les vérifications et les connexions d'être établies vers le serveur.

Avez-vous également vérifié combien de connexions simultanées ont été envoyées au serveur ? Il est possible que le serveur aille alternativement vers le haut et vers le bas en raison de la charge.

Vérifiez les messages de journal du noyau pour toute erreur inattendue.

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