Gestion de la concurrence et de la bande passante par IP avec Apache

Introduction

Pour protéger un serveur web contre les abus ou la saturation, il est souvent nécessaire de limiter le nombre de connexinos simultanées provenant d'une même adresse IP ainsi que la bande passante allouée. Apache HTTP Server ne dispose pas de ces fonctionnalités nativement dans sa configuration de base, mais des modules tiers comme mod_limitipconn et mod_bandwidth permettent d'implémenter ces restrictions efficacement.

Limitation des connexions simultanées avec mod_limitipconn

Ce module permet de définir un plafond de connexions actives par adresse IP. Cela empêche un seul utilisateur de monopoliser tous les slots de connexion du serveur.

Compilation et installation

Récuperez les sources du module et compilez-les en utilisant l'outil apxs fourni avec Apache. Assurez-vous de pointer vers le bon chemin d'installation de votre serveur web.

curl -O http://dominia.org/djao/limit/mod_limitipconn-0.24.tar.bz2
tar jxvf mod_limitipconn-0.24.tar.bz2
cd mod_limitipconn-0.24
/opt/apache/bin/apxs -c -i mod_limitipconn.c

Configuration du serveur

Une fois le module compilé, il faut charger le module et définir les règles dans le fichier de configuration principal httpd.conf. L'option ExtendedStatus doit être activée pour que le module fonctionne correctement.

ExtendedStatus On
LoadModule limitipconn_module modules/mod_limitipconn.so

<IfModule mod_limitipconn.c>
    <Location />
        MaxConnPerIP 10
        NoIPLimit image/*
    </Location>

    <Location /downloads>
        MaxConnPerIP 3
    </Location>
</IfModule>

Dans cet exemple, la limite globale est fixée à 10 connexions par IP, sauf pour les ressources images qui sont exemptées. Le répertoire /downloads est plus strictement limité à 3 connexions simultanées.

Pour une configuration par hôte virtuel, copiez le bloc IfModule à l'intérieur de la définition de votre VirtualHost dans le fichier httpd-vhosts.conf.

Contrôle de la bande passante avec mod_bandwidth

Le module mod_bandwidth offre un contrôle plus granulaire sur le débit réseau. Il permet de limiter la vitesse de téléchargement par IP ou par directory.

Installation et correction de compatibilité

Téléchargez et extrayez les sources du module :

curl -O http://ivn.cl/files/source/mod_bw-0.92.tgz
tar zxvf mod_bw-0.92.tgz

Sur les versions récentes d'Apache (2.4.x), la compilation échouera souvent en raison de chagnements dans l'API APR. L'erreur typique indique que conn_rec ne possède plus le membre remote_addr.

Pour corriger cela, modifiez le fichier source mod_bw.c. Les structures de connexion ont été mises à jour. Remplacez les occurrences de remote_addr par client_addr et remote_ip par client_ip. Cela peut être automatisé via sed :

sed -i 's/remote_addr/client_addr/g' mod_bw.c
sed -i 's/remote_ip/client_ip/g' mod_bw.c

Relancez ensuite la compilation :

/opt/apache/bin/apxs -c -i -a mod_bw.c

Configuration de la limitation de débit

Activez le module et définissez les limites de vitesse dans la configuration de l'hôte virtuel. Les valeurs sont exprimées en octets par seconde.

LoadModule bw_module modules/mod_bw.so

<VirtualHost *:80>
    ServerName exemple.com
    DocumentRoot /var/www/html
    BandWidthModule On
    ForceBandWidthModule On
    BandWidth all 102400
</VirtualHost>

Cette configuration limite le débit global à 100 Ko/s pour toutes les connexions sur ce virtuel. Il est recommandé d'effectuer les tests de validation en utilisant le téléchargement natif du navigateur plutôt que des gestionnaires de téléchargement accélérés, car ces derniers ouvrent multiple connexions qui peuvent fausser les résultats.

Étiquettes: apache-httpd mod-limitipconn mod-bandwidth web-security performance-tuning

Publié le 22 septembre à 07h27